Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
- Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
- Docker应用运行在容器中,使用沙箱机制,相互隔离
Docker如何解决开发、测试、生产环境有差异的问题?
- Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行
Docker是一个快速交付应用、运行应用的技术,具备下列优势:
- 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
- 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
- 启动、移除都可以通过一行命令完成,方便快捷
1. Docker安装
Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
Docker CE 分为stable
test
和nightly
三个更新频道。
官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 CentOS上的安装。1.1 CentOS安装Docker
Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。卸载
如果之前安装过旧版本的Docker,可以使用下面命令卸载:yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
安装docker
安装yum工具
然后更新本地镜像源: ```shellyum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
设置docker镜像源
yum-config-manager \ —add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i ‘s/download.docker.com/mirrors.aliyun.com\/docker-ce/g’ /etc/yum.repos.d/docker-ce.repo
yum makecache fast
然后输入命令:
```shell
yum install -y docker-ce
docker-ce为社区免费版本。稍等片刻,docker即可安装成功。
启动docker
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
通过命令启动docker:
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
然后输入命令,可以查看docker版本:
docker -v
配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
1.2 CentOS7安装DockerCompose
下载
Linux下需要通过命令下载:
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
修改文件权限
修改文件权限:
# 修改权限
chmod +x /usr/local/bin/docker-compose
Base自动补全命令:
# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
如果这里出现错误,需要修改自己的hosts文件:
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
1.3 Docker镜像仓库
搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。
官网地址:https://hub.docker.com/_/registry
简化版镜像仓库
Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
搭建方式比较简单,命令如下:
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。
访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像
带有图形化界面版本
使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=传智教育私有仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
配置Docker信任地址
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
2. Docker架构
镜像和容器
Docker中有几个重要的概念:
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。
一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。
镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。
容器,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。
DockerHub
开源应用程序非常多,打包这些应用往往是重复的劳动。为了避免这些重复劳动,人们就会将自己打包的应用镜像,例如Redis、MySQL镜像放到网络上,共享使用,就像GitHub的代码共享一样。
- DockerHub:DockerHub是一个官方的Docker镜像的托管平台。这样的平台称为Docker Registry。
- 国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。
我们一方面可以将自己的镜像共享到DockerHub,另一方面也可以从DockerHub拉取镜像:
Docker架构
我们要使用Docker来操作镜像、容器,就必须要安装Docker。
Docker是一个CS架构的程序,由两部分组成:
- 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
- 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
3. Docker的基本操作
3.1 镜像操作
3.1.1 镜像名称
首先来看下镜像的名称组成:
- 镜名称一般分两部分组成:[repository]:[tag]。
- 在没有指定tag时,默认是latest,代表最新版本的镜像
如图:
这里的mysql就是repository,5.7就是tag,合一起就是镜像名称,代表5.7版本的MySQL镜像。
3.1.2 镜像命令
常见的镜像操作命令如图:
nginx镜像为例
docker pull nginx #拉取镜像,没有tag默认latest最新版
docker images #查看本地镜像
docker save -o nginx.tar nginx:latest #使用docker save导出nginx镜像到磁盘
docker rmi nginx:latest #删除本地nginx镜像
docker load -i nginx.tar #加载本地磁盘nginx镜像文件
3.2 容器操作
容器保护三个状态:
- 运行:进程正常运行
- 暂停:进程暂停,CPU不再运行,并不释放内存
- 停止:进程终止,回收进程占用的内存、CPU等资源 ```shell docker run #创建并运行
docker pause #暂停容器 docker unpause #取消暂停 docker stop #停止容器 docer start #运行容器
docker ps #查看所有运行的容器及状态 docker logs #查看容器运行日志 docker exec #进入容器执行命令
**nignx容器为例**<br />**创建并运行nginx容器的命令:**<br />`**docker run --name containerName -p 80:80 -d nginx**`<br />命令解读:
- docker run :创建并运行一个容器
- --name : 给容器起一个名字,比如叫做mn
- -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
- -d:后台运行容器
- nginx:镜像名称,例如nginx
这里的`-p`参数,是将容器端口映射到宿主机端口。<br />默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。<br />现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx了:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/25966321/1657027549117-3309ef78-d79c-4851-8b29-0996a914d929.png#clientId=u2ebd582d-d3ee-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=495&id=u80fcc4a8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=544&originWidth=1089&originalType=binary&ratio=1&rotation=0&showTitle=false&size=108627&status=done&style=none&taskId=u0ea6fc13-62ef-407c-add2-e2f9ad136ad&title=&width=989.9999785423283)
**进入我们刚刚创建的nginx容器的命令为:**<br />`**docker exec -it mn bash**`<br />命令解读:
- docker exec :进入容器内部,执行一个命令
- -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- mn :要进入的容器的名称
- bash:进入容器后执行的命令,bash是一个linux终端交互命令
<a name="h1jWA"></a>
## 3.3 数据卷
**数据卷(volume)**是一个虚拟目录,指向宿主机文件系统中的某个目录。<br />一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/25966321/1657029488799-d80c73ec-51dc-45e2-8fa1-86a0a599e8c0.png#clientId=u61bc92a7-9964-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=455&id=u64d6800d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=501&originWidth=1087&originalType=binary&ratio=1&rotation=0&showTitle=false&size=120812&status=done&style=none&taskId=ub138da9d-a75a-4e1d-a5dd-140de5eacfb&title=&width=988.1817967635545)
<a name="uP45K"></a>
### 3.3.1 数据卷命令
数据卷操作的基本语法如下:<br />`**docker volume [COMMAND]**`<br />docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
- **create **创建一个volume
- **inspect **显示一个或多个volume的信息
- **ls** 列出所有的volume
- **prune **删除未使用的volume
- **rm **删除一个或多个指定的volume
<a name="ljwkk"></a>
### 3.3.2 挂载数据卷
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:
```shell
docker run \
--name mn \
-v html:/root/html \
-p 8080:80
nginx \
这里的-v就是挂载数据卷的命令: