一、Docker 组件构成
组件名称 | 用途 |
---|---|
docker | Docker 客户端,负责发送操作请求 |
dockerd | Docker 服务端,负责接收客户端请求并返回结果 |
docker-init | 当业务主进程没有进程回收能力时,作为容器的 1 号进程管理容器子进程 |
docker-proxy | 主要用来做端口映射,通过设置 iptables 规则使得访问主机的流量转发到容器中 |
containerd | 负责管理容器的生命周期,接收 dockerd 请求,执行启动或销毁容器操作 |
containerd-shim | 将 containerd 和容器进程解耦,实现重启 containerd 不影响已启动的容器 |
containerd-ctr | containerd 的客户端 |
runc | 真正用来创建和运行容器的工具 |
1. docker
- Docker 客户端的一个完整实现,是一个二进制文件
- docker 组件向服务端发送请求后,服务端根据请求执行具体的动作并将结果返回给 docker,docker 解析服务端的返回结果,并将结果通过命令行标准输出展示给用户
2. dockerd
- Docker 服务端的后台常驻进程,用来接收客户端请求,执行具体的处理任务,处理完成后将结果返回给客户端
- Docker 客户端可以通过多种方式向 dockerd 发送请求:
- 通过 UNIX 套接字:配置格式为
unix://socket_path
,dockerd 默认生成的 socket 文件路径为/var/run/docker.sock
,该文件只有 root 或者 docker 用户组的用户才可以访问 - 通过 TCP:配置格式为
tcp://host:port
,生产环境中推荐使用 TLS 认证,可以通过设置 Docker 的 TLS 相关参数,来保证数据传输的安全 - 通过文件描述符:配置格式为
fd://
,一般用于 systemd 管理的系统中
- 通过 UNIX 套接字:配置格式为
1 | # 开启TCP监听和UNIX监听 |
3. docker-init
- 在 Linux 系统中,1 号进程是 init 进程,是所有进程的父进程。主机上的进程出现问题时,init 进程可以回收这些问题进程
- 同样的,在容器内部,当业务进程没有回收子进程的能力时,在启动容器时可以添加
--init
参数,此时 Docker 会使用 docker-init 作为 1 号进程,管理容器内的子进程,例如回收僵尸进程等
1 | $ docker run -it busybox sh |
4. docker-proxy
- 主要用来做端口映射,把容器内的端口映射到主机上,底层依赖于 iptables 的 nat 转发
1 | $ docker run --name=nginx -d -p 8080:80 nginx |
5. containerd
- containerd 组件是从 Docker 1.11 版本正式从 dockerd 中剥离出来的,完全遵循 OCI 标准,是容器标准化后的产物,并且是完全社区化运营的
- containerd 功能:
- 管理容器的生命周期
- 管理镜像,例如容器运行前从镜像仓库拉取镜像到本地
- 接收 dockerd 的请求,通过适当的参数调用 runc 启动容器
- 管理存储相关资源
- 管理网络相关资源
- containerd 包含一个后台常驻进程,默认的 socket 路径为
/run/containerd/containerd.sock
,dockerd 通过 UNIX 套接字向 containerd 发送请求,containerd 接收到请求后负责执行相关的动作并把执行结果返回给 dockerd - 由于 containerd 更加简单和轻量,生产环境中可以直接使用 containerd 来管理容器
6. containerd-shim
- 将 containerd 和真正的容器进程解耦,使用 containerd-shim 作为容器进程的父进程,从而实现重启 containerd 不影响已经启动的容器进程
7. containerd-ctr
- containerd 的客户端,主要用来开发和调试。在没有 dockerd 的环境中,ctr 可以充当 docker 客户端的部分角色,直接向 containerd 守护进程发送操作容器的请求
8. runc
- 一个标准的 OCI 容器运行时的实现,它是一个命令行工具。通过调用 Namespace、Cgroups 系统接口,可以直接用来创建和运行容器
1 | # 1. 准备容器运行时文件 |
二、Docker 工作原理
1 | $ docker run -d busybox sleep 3600 |