第2章docker引擎
2.1Docker 引擎发展历程
2.1.1 首发版本架构
Docker 在首次发布时,其引擎由两个核心组件构成:LXC(Linux Container)与 Docker Daemon。不过,该架构依赖于 LXC,使得 Docker 存在严重的问题:
-
依赖于外部工具,对 Docker 来说,存在着巨大的生存风险
-
LXC 使得 Docker 无法实现跨平台
Docker Daemon 的"大而全"也带来了严重的问题:
- 版本更新与功能扩展较难
- 运行较慢,带来性能问题
- Docker Daemon 运行出现问题,会直接影响容器的运行
- 不符合软件哲学
2.1.2 Docker0.9 版本架构
从 Docker0.8 版本开始,Docker 使用自研的 Libcontainer 工具替换了 LXC
2.1.3 Docker1.1 版本架构
2017 年 7 月 OCI 基金会发布了两个规范(镜像规范与容器运行时规范)的 OCI1.0 版本。2016 年底发布的 Docker1.1 版本基本遵循了 OCI1.0 版本。从 Docker1.1 版本开始,Docker Daemon 中不再包含任何容器运行时代码,而是将容器运行时单独剥离了出来,形成了 Runc 项目。
2.2 Docker 引擎架构
Docker 引擎是用来运行和管理容器的核心软件,其现代架构由四部分主要组件构成:Docker Client,Dockerd、Containerd 与 Runc。

2.2.1 Docker Client
Docker 客户端,Docker 引擎提供的 CLI 工具,用于用户向 Docker 提交命令请求。
2.2.2 Dockerd
Dockerd,即 Docker Daemon。在现代 Dockerd 中的主要包含的功能有镜像构建、镜像管理、REST API、核心网络及编排等。其通过 gRPC 与 Containerd 进行通信
2.2.3 Containerd
Containerd,即 Container Daemon,该项目的主要功能是管理容器的生命周期。不过,其本身并不会去创建容器,而是调用 Runc 来完成容器的创建。Docker 公司后来将 Containerd 项目捐献给了 CNCF(云原生基金会)
2.2.4 Runc
Runc,Run Container,是 OCI(开放容器倡议基金会)容器运行时规范的实现,Runc 项目的目标之一就是与 OCI 规范保持一致。所以,Runc 所在层也称为 OCI 层。这使得 Docker Daemon 中不用再包含任何容器运行时的代码了,简化了 Docker Daemon。Runc 只有一个作用---创建容器,其本质是一个独立的容器运行时 CLI 工具。其在 fork出一个容器子进程后会启动该容器进程。在容器进程启动完毕后,Runc 会自动退出。
2.2.5 Shim
Shim(垫片)是实现"Daemonless Container(无 Docker Daemon 与 Container Daemon容器)"不可或缺的工具,使容器与 Docker Daemon 解耦,使得 Docker Daemon 的维护与升级不会影响到运行中的容器。每次创建容器时,Containerd 同时会 fork 出 Runc 进程与 Shim 进程。当 Runc 自动退出之前,会先将新容器进程的父进程指定为相应的 Shim 进程。
除了作为容器的父进程外,Shim 进程还具有两个重要功能:
- 保持所有 STDIN 与 STDOUT 流的开启状态,从而使得当 Docker Daemon 重启时,容器不会因为 Pipe 的关闭而终止。
- 将容器的退出状态反馈给 Docker Daemon。
2.3Docker 引擎分类
在安装 Docker 之前需要先了解 Docker 官方对其版本的分类。Docker 的版本分为大版本与小版本。
2.3.1 大版本
Docker 从大版本来说,分为三类:Moby、社区版 Docker-CE(Community Edition)和企业版 Docker-EE(Enterprise Edition)。
2.3.2 小版本
从 v1.13.1 之后,Docker 的发布计划发生了变更,每个大版本下都出现了两个小版本 Edge 月版与 Stable 季版。不过,现在的官网中一般只能看到 Stable 版本。
2.4Docker 引擎的安装
Docker 可以安装在 Windows、Linux、Mac 等系统中,但生产环境下,服务器使用 Linux中的 CentOS 居多,所以下面就以 Docker 在 CentOS7 中的安装为例来学习 Docker 的安装。官网 https://docs.docker.com/engine/install/centos/中可以看到具体安装方式与安装步骤。
2.4.1 系统要求
我们这里要安装的是 Docker CE 版,且要安装到 CentOS 之中。不过,对于安装 Docker的系统环境还是有要求的。
对于 CentOS 系统的安装主机,无论是传统架构还是 ARM 架构,要求处理器都是 64 位系统。
docker安装手顺地址 https://docs.docker.com/engine/install/centos/

并且 CentOS 要求是 7 及其以上版本
2.4.2 克隆并配置主机
- 修改主机名:/etc/hostname
- 修改网络配置:/etc/sysconfig/network-scripts/ifcfg-ens33
- 查看当前主机版本: cat /etc/redhat-release
- 查看是否为64位系统: uname -r
2.4.3 安装需要的包
-
务必配置阿里的yum源,这样安装Docker的速度就不会太慢
shell# 关闭防火墙部分 systemctl stop firewalld systemctl disable firewalld # 检查防火墙状态 systemctl status firewalld # 1、备份备份官方的原yum源的配置 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 2、下载Centos-7.repo文件 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 注意:部分小伙伴可能没有安装wget,需要先安装wget,或者用下面的命令下载repo文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 3、清除yum缓存 yum clean all # 4、缓存阿里云源 yum makecache # 5、测试阿里云源 yum list
-
卸载旧版本的Docker,旧版本的Docker程序被称作Docker或者Docker-engine,如果之前在系统中安装过,那么就卸载掉,当然连同依赖一起卸载了!
shellyum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-selinux \ docker-logrotate \ docker-engine-selinux\ docker-engine
-
安装
yum-utils
,它提供了yum-config-manager
,同时安装device-mapper-persistent-data
和lvm2
,这些是Docker设备映射器(devicemapper)存储驱动程序所必需的。shellyum install -y yum-utils device-mapper-persistent-data lvm2
-
使用一下命令来搭建稳定的仓库
shellyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
安装 docker,以及 docker-cli,安装时间稍长,请耐心等待
shellyum install docker-ce docker-ce-cli containerd.io
如果想安装特定版本的Docker CE,可以先列出所有可用的版本,然后选择特定版本进行安装:
shellyum list docker-ce --showduplicates | sort -r # 下载固定版本docker eg: yum install docker-ce-3:26.1.4-1.el7 docker-ce-cli-1:26.0.4-1.el7 containerd.io yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
请将<VERSION_STRING>替换为你想安装的具体版本号。
-
查看安装版本信息
shelldocker version
2.5 Docker 引擎的启停
2.5.1 启动docker
Docker 是以服务的形式运行在系统中,所以使用 systemctl 来对其进行各种操作。启动docker
shell
systemctl start docker
2.5.2 启动成功测试
为了验证 Docker 安装启动成功,一般有两种方式:
-
docker version
-
运行hello-world镜像,可以通过运行 hello-world 镜像来验证 Docker 的安装启动成功。当然,当前宿主机中是不存在 hello-world 镜像的,其会首先下载,然后才会运行。如果看到如下输出,则说明 Docker 已经安装启动成功了。如果看不到如下结果,一般都是因为下载超时,需要先完成以下"配置国内加速器"步骤。
网络连接失败,后续配置国内加速器再进行尝试
2.5.3 Docker 重启
shell
systemctl restart docker
2.5.4 查看 Docker 状态
shell
systemctl status docker

2.5.5 开机自启动 Docker
通过 systemctl start docker 命令仅可以开启 Docker 服务,但每次开机后,都需要开启。可以通过systemctl enalbe docker命令将Docker服务设置为开机自启动服务,即开机后Docker服务无需再开启,其本身就是开启状态。
shell
systemctl enable docker
此时再查看 Docker 的状态,可以看到原来的 disabled 变为了 enabled,说明当前 Docker服务已经变为了开机自启动了

2.5.6 Docker 停止
shell
systemctl stop docker
2.5.7 关闭开机自启动
shell
systemctl disable docker
2.6配置国内加速器
国内镜像中心常用的为阿里云与网易云。在本地 Docker 中指定要使用的国内加速器地址后,就可以直接从国内镜像中心下载镜像了。
2.6.1 配置阿里云加速器
若要配置阿里云加速器,必须首先要有阿里云的账号。登录阿里云后,打开阿里云的容器镜像服务页面 https://cr.console.aliyun.com ,然后找到如下页面,执行相应的命令。

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
执行之后再次执行 docker run hello-world

网易云加速器,不用注册账号信息,直接修改registry-mirrrors地址即可
shell
{
"registry-mirrors": ["https://hub-mirror.c.163.com"]
}
2.6.2 配置境外镜像
shell
# 使用难兄难弟俄罗斯镜像
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.m.daocloud.io","https://huecker.io","https://dockerhub.timeweb.cloud","https://noohub.ru"]
}
EOF
systemctl daemon-reload
systemctl restart docker
2.7 Docker 引擎的卸载
对 Docker 的卸载分为三大步
-
yum 移除,通过 yum remove 移除 docker 安装的四个组件
shellyum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-selinux \ docker-logrotate \ docker-engine-selinux\ docker-engine
-
rm 两个目录
通过 rm --rf 删除/var/lib 下的 docker 与 containerd 两个目录。这两个目录中存放着镜像、容器、数据卷,它们在前面删除时不能被自动删除,需要手动删除
shellrm -rf /var/lib/docker rm -rf /var/lib/containerd
-
还有一些自己编辑、定义的配置文件,需要自己手工删除