Loading

容器技术:安装Docker并了解运行过程(二)

6. 安装Docker并配置镜像加速

6.1 安装Docker

如果你之前安装过 docker,请先删掉

yum remove docker docker-ce docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine docker*

安装一些依赖

yum install -y yum-utils device-mapper-persistent-data lvm2

也可以安装一下代码补全插件:yum install -y bash-completion bash-completion-extras


下载 repo 文件,并把软件仓库地址替换为镜像站

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo

安装docker-ce

yum install docker-ce

安装指定版本的Docker-CE

#查找Docker-CE的版本
[root@docker02 ~]# yum list docker-ce.x86_64 --showduplicates | sort -r
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror, langpacks
docker-ce.x86_64            3:23.0.3-1.el7                      docker-ce-stable
docker-ce.x86_64            3:20.10.0-3.el7                     docker-ce-stable
docker-ce.x86_64            18.06.3.ce-3.el7                    docker-ce-stable

#例如安装18.06.3.ce-3.el7这个版本
[root@docker02 ~]# yum -y install docker-ce-18.06.3.ce-3.el7

启动docker并设置开机自启

systemctl start docker
systemctl enable docker

6.2 配置镜像加速

编辑配置文件

[root@docker01 ~]# cat /etc/docker/daemon.json
{
   "registry-mirrors": [
   "https://mirror.ccs.tencentyun.com"
  ]
}

重启Docker

[root@docker01 ~]# systemctl restart docker

拉取一个镜像试试

docker run -d -p 80:80 nginx

6.3 配置内核转发功能

临时性:
 echo 1 > /proc/sys/net/ipv4/ip_forward
永久性:
 vim /etc/sysctl.conf
  net.ipv4.ip_forward = 1

7. 理解Docker的运行过程

7.1 前言

首先容器化是有标准的,成立了OCI(Open Container Initiaiv),OCI主要包含两个规范。一个是容器运行时规范(runtime-spec),一个是容器镜像规范(image-spec)。简单理解就是规范了底层运行环境的标准,兼容不同容器在不同的Runtime下运行。镜像规范言简意赅就是规范镜像格式的标准,包括镜像的结构、元数据、文件系统等。这样子在不同容器引擎中运行,不会因文件系统格式不匹配而无法运行。


7.2 了解runc与Container

containerd是一个高性能、开源的容器运行时管理工具,并提供用于容器和镜像操作的API。它负责与容器和镜像的文件系统交互,负责进程、网络和存储管理。(containerd支持多种OCI Runtime实现)

而runc是一个开源容器运行时,它可以通过OCI规范启动容器。runc与containerd一起使用,containerd负责管理容器的生命周期和镜像的构建、导入和导出等流程,而runc负责容器内部的进程管理。

因此,简单来说,containerd负责容器的管理,而runc则负责容器中的进程管理。

containerd和runc都是容器运行时(Runtime),它们是基于容器技术的组件,用于管理、创建和维护容器。但是它们的角色不完全相同,containerd是一个容器守护进程,用于管理容器的生命周期,而runc是一个容器运行时工具,用于创建和运行容器实例。因此,可以说它们是容器进行时的关键组成部分,但它们本身并不是容器进行时。

image-20230406142516506

image-20230406142435722


7.3 了解containerd-shim

containerd-shim是一个轻量级的守护进程,用于启动和管理容器(container)进程。它是容器运行时(runtime)和容器管理器(manager)之间的接口,负责创建、销毁、暂停、恢复和监视容器进程。containerd-shim还负责处理标准输入、输出和错误输出,并管理与容器相关联的文件系统、网络和其他资源。

image-20230406140753885


上面的守护进程实际就是containerd-shim-runc,它是containerd的一个组件,用于管理容器的生命周期。它基于runc来创建和管理容器的进程,通过与containerd交互协调容器的以下几个操作。

  1. 创建容器的进程,通过runc来配置容器的文件系统、网络、进程等资源;

  2. 启动容器的进程,将容器的标准输出、错误输出和标准输入连接到适当的管道中;

  3. 协调容器的生命周期,包括容器进程的启动、停止和销毁等操作;

  4. 向containerd发送消息,以通知容器状态的转变和容器的事件,如容器的退出或者容器的状态更新等;

  5. 与containerd之间维持一个长连接,以便及时地接收containerd的指令和发送消息给containerd。

image-20230406140859505


7.4 Docker的运行全过程

docker启动一个容器的过程大致是下图所示的流程:

image-20230406145858532

当Docker CLI发送命令到Docker Daemon时,Docker Daemon会将命令转发给containerd,而containerd则通过gRPC接口调用containerd-shim来执行对容器进程的操作。containerd-shim是一个运行在宿主机上的进程,它负责启动和管理容器进程,并通过与containerd的通信来实现容器的生命周期管理。

在容器启动时,containerd-shim会创建一个新的进程,并将容器进程的标准输入、输出和错误输出与宿主机上的管道连接起来,使得容器进程能够和外界进行通信。在容器停止时,containerd-shim会向它发送一个信号,通知它停止容器进程并进行清理工作。

总之,通过containerd-shim,Docker能够有效地管理容器的生命周期,并且能够将容器的输出信息发送到Docker CLI,以便用户能够方便地查看容器的运行结果。

Tips:上面containerd-shim进程就是指的containerd-shim-runc,看下图

image-20230406150549974

containerd-shim 是真正容器的进程的父进程,这么做为了不让真正的容器进程作为 containerd 的子进程,从而可以实现重启 containerd 而不影响已经运行的容器。

posted @ 2023-09-16 11:20  YinJayChen  阅读(19)  评论(0编辑  收藏  举报