华子目录
Docker引擎架构
首先在部署Docker环境前,得先了解Docker的引擎架构
- docker引擎是用来运行和管理容器的核心软件,通常将其代指为docker或者docker平台。
- docker引擎由如下主要的4大构建组成:docker client(docker客户端)、docker daemon(docker守护进程,也是docker服务端)、containerd以及runc,共同负责容器的创建和运行。
docker引擎架构示意图
-
docker daemon实现了docker api,对容器的操作由containerd完成,containerd需要指挥与OCI相兼容的容器运行时来创建容器,默认情况下,docker使用runc来作为其默认的容器运行时,containerd调用runc,并确保docker镜像以OCI bundle的格式传给runc。其中:
- api:应用程序编程接口
- OCI(开放容器计划)定义了两个容器相关的规范:
- 镜像规范
- 容器运行时规范
-
runc是OCI容器运行时标准的参考实现,runc实际上是一个轻量级的、针对libcontainer进行了包装的命令行交互工具。runc生来只有一个作用,创建容器。
- 关于libcontainer:LXC提供了对诸如命名空间(Namespace)和控制组(CGroup)等基础工具的操作能力,是基于linux内核的容器化虚拟技术,docker公司开发了名为libcontainer的自研工具,用于替代LXC,libcontainer的目的是成为与平台无关的工具,可基于不同内核为Docker上层提供必要的容器交互功能。
-
containerd 的主要任务是容器的生命周期的管理,containerd在linux和windows中以daemon的方式运行,在docker引擎技术栈中,containerd位于daemon和runc所在的OCI层之间。
-
shim是实现无daemon的容器不可获取的工具,前面提到containerd指挥runc来创建容器,事实上,每次创建容器时都会fork(分叉出)一个新的runc实例,不过,一旦容器创建完毕,对应的runc进程就会退出,因此即使运行上百个容器,也无须保持上百个的runc处于运行状态。一旦容器进程的父进程runc退出,相关联的containerd-shim进程就会成为容器的父进程,作为容器的父进程,shim的部分职责如下:
- 保持所有的stdin(标准输入)和stdout(标准输出)流是开启状态,从而当daemon(docker服务端)重启的时候,容器不会因为管道的关闭而终止。
- 将容器的退出状态反馈给daemon。
执行过程示例
[root@server ~]# docker container run --name ctrl -it alpine:latest sh
- 当docker命令行执行上述命令时,docker客户端会将其转换为合适的api格式,并发送到正确的API端点。API是在daemon种实现的,一旦daemon接受了创建新容器的命令,它会向containerd发出调用(daemon使用一种CRUD风格的API,通过gRPC与containerd进行通信)。containerd不负责创建容器,会将docker镜像转换为OCI bundle,然后再让runc基于此创建一个新的容器。然后runc与操作系统内核接口通信,基于所有必要的工具(Namespace、CGroup等)来创建容器,容器进程作为runc的子进程进行启动,启动完毕后,runc将会退出。整个过程如下图:
RHEL9上安装Docker
这里我们通过yum源来安装Docker
- Docker引擎目前分为两个版本:社区版本( Community Edition, CE)和企业版本(Enterprise Edition, EE) 社区版本包括大部分的核心功能,企业版本则通过付费形式提供认证支持、镜像管理、容器托管、安全扫描等高级服务, 通常情况下,用户使用社区版本可以满足大部分需求;若有更苛刻的需求,可以购买企业版本服务
1.系统要求
系统基础环境
- 64位CPU
- Linux内核(Linux kernel):5.14.0-162.6.1.el9_1.x86_64
查询自己服务器的环境
[root@server ~]# cat /etc/redhat-release
Red Hat Enterprise Linux release 9.1 (Plow)
内核版本
[root@server ~]# uname -r
5.14.0-162.6.1.el9_1.x86_64
IP地址
[root@server ~]# hostname -I #列出主机的所有IP地址
192.168.80.129
[root@server ~]# hostname -i #列出主机的IP地址
fe80::20c:29ff:fe9e:1d25%ens160 192.168.80.129
2.安装yum-utils工具包
是一个提供yum-config-manager命令的工具包
[root@server ~]# yum install yum-utils -y
在阿里云镜像站中找的这个docker-ce.repo包,鼠标右击复制链接
[root@server ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/rhel/docker-ce.repo
[root@server ~]# cd /etc/yum.repos.d/
[root@server yum.repos.d]# ll
总用量 12
-rw-r--r-- 1 root root 2045 3月 23 16:35 docker-ce.repo #就出现了这个文件
-rw-r--r--. 1 root root 358 11月 11 19:28 redhat.repo
-rw-r--r--. 1 root root 223 11月 11 19:25 RHELserver.repo
3.yum安装docker-ce
[root@server ~]# yum install docker-ce -y
4.配置docker镜像加速
多种加速方式:
- docker cn
- 阿里云加速器
- 中国科技大学
docker拉取镜像的过程
Docker拉取镜像的过程涉及多个步骤,以下是其详细的流程:
1.配置国内Docker的下载源:
- 进入文件daemon.json,如果该文件不存在,则新建。通常这个文件位于/etc/docker/目录下。
编辑daemon.json文件,添加国内镜像源的配置。例如,你可以添加阿里云的镜像源。这样配置后,Docker在拉取镜像时会优先从国内的镜像源拉取,以提高下载速度。
2.执行拉取命令:
- 在命令行或终端中,使用docker pull命令来拉取镜像。你需要指定要拉取的镜像名称和标签(如果有的话)。例如,要拉取一个名为nginx的镜像,并指定其版本为1.12.0-alpine,你可以执行docker pull nginx:1.12.0-alpine。
3.Docker Hub查找镜像:
- 当执行docker pull命令时,Docker首先会在本地查找是否已经存在该镜像。如果不存在,它会向Docker Hub(Docker官方的镜像中心)发送请求,查找指定的镜像。
4.下载镜像:
- 一旦在Docker Hub上找到镜像,Docker会开始从远程仓库下载镜像的各个层。这些层是Docker镜像的组成部分,它们包含了构建和运行容器所需的所有文件、配置和依赖项。
5.验证和存储镜像:
- 下载完成后,Docker会验证镜像的完整性和安全性。一旦验证通过,镜像会被存储在本地的Docker镜像仓库中,供以后使用。
6.使用镜像:
- 拉取到镜像后,你就可以使用docker run命令来基于该镜像创建并运行一个容