Docker—2章(Docker引擎)


第二章 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、ContainerdRunc

docker引擎架构

2.1 Docker Client

Docker客户端,Docker引擎提供的CLI工具,用于用户向Docker提交命令请求。

2.2 Dockerd

Dockerd,即Docker Daemon。在现代Dockerd中的主要包含的功能有镜像构建、镜像管理、REST API、核心网络及编排等。其通过gRPCContainerd进行通信。

2.3 Containerd

Containerd,即Container Daemon,该项目的主要功能是管理容器的生命周期。不过,其本身并不会去创建容器,而是调用Runc来完成容器的创建。Docker公司后来将Containerd项目捐献给了CNCF(云原生基金会)。

2.4 Runc

Runc(Run Container),是OCI(开放容器倡议基金会)容器运行时规范的实现,Runc项目的目标之一就是与OCI规范保持一致。所以,Runc所在层也称为OCI层。这使得Docker Daemon中不用再包含任何容器运行时的代码了,简化了Docker DaemonRunc只有一个作用—创建容器,其本质是一个独立的容器运行时CLI工具。其在fork出一个容器子进程后会启动该容器进程。在容器进程启动完毕后,Runc会自动退出。

2.5 Shim

Shim(垫片)是实现“Daemonless Container(无DockerDaemonContainer Daemon容器)”不可或缺的工具,使容器与Docker Daemon解耦,使得Docker Daemon的维护与升级不会影响到运行中的容器。

每次创建容器时,Containerd同时会forkRunc进程与Shim进程。当Runc自动退出之前,会先将新容器进程的父进程指定为相应的Shim进程。

除了作为容器的父进程外,Shim进程还具有两个重要功能:

  • 保持所有STDINSTDOUT流的开启状态,从而使得当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居多,所以下面就以DockerCentOS7中的安装为例来学习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的卸载分为三大步:

  1. yum移除:通过yum remove移除docker安装的四个组件。

    yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
    
  2. rm两个目录:通过rm –rf删除/var/lib下的dockercontainerd两个目录。这两个目录中存放着镜像、容器、数据卷,它们在前面删除时不能被自动删除,需要手动删除。

    rm -rf /var/lib/docker
    rm -rf /var/lib/containerd
    
  3. 删除其它配置文件:还有一些自己编辑、定义的配置文件,需要自己手工删除。


文章作者: 念心卓
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 念心卓 !
  目录