第二章 Docker引擎
1. Docker引擎发展历程
1.1 首发版本架构
Docker
在首次发布时,其引擎由两个核心组件构成:LXC(Linux Container)
与DockerDaemon
。
不过,该架构依赖于LXC
,使得Docker
存在严重的问题:
- 依赖于外部工具,对
Docker
来说,存在着巨大的生存风险 LXC
使得Docker
无法实现跨平台
Docker Daemon
的“大而全”也带来了严重的问题:
- 版本更新与功能扩展较难
- 运行较慢,带来性能问题
Docker Daemon
运行出现问题,会直接影响容器的运行- 不符合软件哲学
1.2 Docker0.9版本架构
从Docker0.8
版本开始,Docker
使用自研的Libcontainer
工具替换了LXC
1.3 Docker1.1版本架构
2017年7月OCI
基金会发布了两个规范(镜像规范与容器运行时规范)的OCI1.0
版本。2016年底发布的Docker1.1
版本基本遵循了OCI1.0
版本。从Docker1.1
版本开始,Docker Daemon
中不再包含任何容器运行时代码,而是将容器运行时单独剥离了出来,形成了Runc
项目。
2. Docker引擎架构
Docker
引擎是用来运行和管理容器的核心软件,其现代架构由四部分主要组件构成:Docker Client,Dockerd、Containerd
与Runc
。
2.1 Docker Client
Docker
客户端,Docker
引擎提供的CLI
工具,用于用户向Docker
提交命令请求。
2.2 Dockerd
Dockerd
,即Docker Daemon
。在现代Dockerd
中的主要包含的功能有镜像构建、镜像管理、REST API
、核心网络及编排等。其通过gRPC
与Containerd
进行通信。
2.3 Containerd
Containerd
,即Container Daemon
,该项目的主要功能是管理容器的生命周期。不过,其本身并不会去创建容器,而是调用Runc
来完成容器的创建。Docker
公司后来将Containerd
项目捐献给了CNCF
(云原生基金会)。
2.4 Runc
Runc(Run Container)
,是OCI
(开放容器倡议基金会)容器运行时规范的实现,Runc
项目的目标之一就是与OCI
规范保持一致。所以,Runc
所在层也称为OCI
层。这使得Docker Daemon
中不用再包含任何容器运行时的代码了,简化了Docker Daemon
。Runc
只有一个作用—创建容器,其本质是一个独立的容器运行时CLI
工具。其在fork
出一个容器子进程后会启动该容器进程。在容器进程启动完毕后,Runc
会自动退出。
2.5 Shim
Shim
(垫片)是实现“Daemonless Container
(无DockerDaemon
与Container Daemon
容器)”不可或缺的工具,使容器与Docker Daemon
解耦,使得Docker Daemon
的维护与升级不会影响到运行中的容器。
每次创建容器时,Containerd
同时会fork
出Runc
进程与Shim
进程。当Runc
自动退出之前,会先将新容器进程的父进程指定为相应的Shim
进程。
除了作为容器的父进程外,Shim
进程还具有两个重要功能:
- 保持所有
STDIN
与STDOUT
流的开启状态,从而使得当Docker Daemon
重启时,容器不会因为Pipe
的关闭而终止。 - 将容器的退出状态反馈给
Docker Daemon
。
3. Docker引擎分类
在安装Docker
之前需要先了解Docker
官方对其版本的分类。Docker
的版本分为大版本与小版本。
3.1 大版本
Docker
从大版本来说,分为三类:Moby、社区版Docker-CE(Community Edition)和企业版Docker-EE(Enterprise Edition)
。
3.2 小版本
从v1.13.1
之后,Docker
的发布计划发生了变更,每个大版本下都出现了两个小版本Edge
月版与Stable
季版。不过,现在的官网中一般只能看到Stable
版本。
4. Docker引擎的安装
Docker
可以安装在Windows、Linux、Mac
等系统中,但生产环境下,服务器使用Linux
中的CentOS
居多,所以下面就以Docker
在CentOS7
中的安装为例来学习Docker的安装。官网https://docs.docker.com/engine/install/centos/中可以看到具体安装方式与安装步骤。
4.1 系统要求
我们这里要安装的是Docker CE
版,且要安装到CentOS
之中。不过,对于安装Docker
的系统环境还是有要求的。
4.2 克隆并配置主机
#前提都要在root用户下操作
#修改主机名:
vim /etc/hostname
#修改网络配置:
/etc/sysconfig/network-scripts/ifcfg-ens33
4.3 安装需要的包
yum-utils
中提供了yum-config-manager
工具,该工具是下面要使用的命令,用于完成配置管理。
yum install -y yum-utils
安装成功后可以看到以下提示。
4.4 添加docker下载仓库
这里要添加后面安装docker-ce
的下载仓库。官网给出的是一个国外地址仓库,不过我们国内一般使用国内仓库地址。
4.4.1 国外地址安装
官网给出的是国外仓库地址,我们这里不使用。
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
4.4.2 内地址安装
从国外服务器上下载Docker
安装包非常慢,可以从国内服务器上下载。在百度搜索“docker的阿里云镜像地址”,找到如下地址,然后将原来命令中的国外地址替换为这个阿里云地址即可。http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.5 安装docker
安装最新版的docker-ce
。当然,官方给出的如下命令中没有添加-y
,我们可以添加上,否则后面安装过程中会有两次询问。
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
若要安装指定版本的,则官网给出了安装步骤。
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
sudo docker run hello-world
5. Docker的系统命令
Docker
是以服务的形式运行在系统中,所以使用systemctl
来对其进行各种操作。
5.1 Docker启动停止
#启动docker服务
systemctl start docker
#查看docker的状态
systemctl status docker
#停止docker服务
systemctl stop docker
看见active(running)
表示docker
服务正在运行中
5.2 Docker版本
#查看Docker版本
docker version
5.3 Docker重启
#docker重启
systemctl restart docker
5.4 开机自启动Docker
通过systemctl start docker
命令仅可以开启Docker
服务,但每次开机后,都需要开启。
可以通过systemctl enable docker
命令将Docker
服务设置为开机自启动服务,即开机后Docker
服务无需再开启,其本身就是开启状态。
#开机自启动Docker
systemctl enable docker
此时再查看Docker
的状态,可以看到原来的disabled
变为了enabled
,说明当前Docker
服务已经变为了开机自启动了。
5.5 关闭开机自启动
#关闭开机自启动
systemctl disable docker
6. 配置国内加速器
国内镜像中心常用的为阿里云与网易云。在本地Docker
中指定要使用的国内加速器地址后,就可以直接从国内镜像中心下载镜像了。
[!caution]
在2024年6月份,由于Docker被污染,导致国内无法使用Docker,很多镜像加速都用不了了,目前推荐用这几个:
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.nju.edu.cn", "https://docker.mirrors.ustc.edu.cn" ] } EOF
sudo systemctl daemon-reload sudo systemctl restart docker
6.1 配置阿里云加速器
若要配置阿里云加速器,必须首先要有阿里云的账号。登录阿里云后,打开阿里云的容器镜像服务页面https://cr.console.aliyun.com。
然后找到如下页面,执行相应的命令。
下面就需要按照给出的步骤来完成镜像加速器的配置了。
#创建docker目录
mkdir -p /etc/docker
#修改daemon.json文件
#在文件末尾添加指定的内容。注意,该json数据中的URL地址是与用户登录账号绑定的,不同的用户所生成的地址是不同的。
#安装上图的文档添加即可
#重新加载服务配置文件
systemctl daemon-reload
#重启docker引擎
systemctl restart docker
6.2 配置网易云加速器
配置网易云加速器,无需注册网易云用户。只需将前面的daemon.json
文件中的那个URL替换为如下URL即可。
当然,替换过后,仍需重新加载服务配置文件,重启docker
引擎。
7. Docker引擎的卸载
对Docker
的卸载分为三大步:
yum
移除:通过yum remove
移除docker
安装的四个组件。yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
rm
两个目录:通过rm –rf
删除/var/lib
下的docker
与containerd
两个目录。这两个目录中存放着镜像、容器、数据卷,它们在前面删除时不能被自动删除,需要手动删除。rm -rf /var/lib/docker rm -rf /var/lib/containerd
删除其它配置文件:还有一些自己编辑、定义的配置文件,需要自己手工删除。