docker組件可以分以下三類
1、Docker 相關的組件:docker、dockerd、docker-init 和 docker-proxy
2、containerd 相關的組件:containerd、containerd-shim 和 ctr
3、容器運行時相關的組件:runc
docker:
docker 是 Docker 客戶端的一個完整實現,它是一個二進制文件,對用戶可見的操作形式為 docker 命令,通過 docker 命令可以完成所有的 Docker 客戶端與服務端的通信
docker與dockerd通信的三種方式:
1、通過UNIX套接字配置格式為unix://socket_path,默認 dockerd 生成的 socket 文件路徑為 /var/run/docker.sock
2、通過 TCP 與服務端通信:配置格式為tcp://host:port
3、通過文件描述符的方式與服務端通信:配置格式為:fd://這種格式一般用於 systemd 管理的系統中。
dockerd
dockerd 是 Docker 服務端的后台常駐進程,用來接收客戶端發送的請求,執行具體的處理任務,處理完成后將結果返回給客戶端
docker-init
docker會啟動inti進程充當容器中的1號進程,當子進程遇到一些問題(收留孤兒進程)的時候inti進程可以進行回收子進程
沒有創建init的容器
[root@control-plane ~]# docker run -it busybox sh
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 sh
6 root 0:00 ps aux
創建了init進程的容器
[root@control-plane ~]# docker run -it --init busybox sh
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 /sbin/docker-init -- sh
6 root 0:00 sh
7 root 0:00 ps aux
docker-proxy
主要是用來做端口映射的。當我們使用 docker run 命令啟動容器時, -p 參數
[root@control-plane ~]# docker run --name=nginx -d -p 8080:80 nginx
獲取當前容器IP
[root@control-plane ~]# docker inspect --format '{{ .NetworkSettings.IPAddress }}' nginx
172.17.0.5
查看proxy進程
[root@control-plane ~]# ps aux|grep docker-proxy|grep -v grep
root 8745 0.0 0.1 217040 8864 ? Sl 09:50 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.5 -container-port 80
底層通過iptables 做了DNAT轉換
[root@control-plane ~]# iptables -L -nv -t nat|grep 172.17.0.5
containerd
從docker1.11版正式從dockerd中剝離出來的完全遵循OCI標准,是容器表追后的產物。
管理功能:
1、容器周期管理
2、鏡像管理
3、接受dockerd的請求,調用runc啟動容器
4、管理存儲
5、管理網絡
containerd 包含一個后台常駐進程,默認的 socket 路徑為 /run/containerd/containerd.sock
如果你不想使用 dockerd,也可以直接使用 containerd 來管理容器,由於 containerd 更加簡單和輕量,生產環境中越來越多的人開始直接使用 containerd 來管理容器。
默認dockerd通過套接字調用containerd
[root@control-plane ~]# ps -ef|grep dockerd |grep -v grep
root 18717 1 1 9月14 ? 06:46:51 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
containerd-shim
containerd-shim 的意思是墊片,類似於擰螺絲時夾在螺絲和螺母之間的墊片。containerd-shim 的主要作用是將 containerd 和真正的容器進程解耦,使用 containerd-shim 作為容器進程的父進程,從而實現重啟 containerd 不影響已經啟動的容器進程。
ctr
ctr 實際上是 containerd-ctr,它是 containerd 的客戶端,主要用來開發和調試,在沒有 dockerd 的環境中,ctr 可以充當 docker 客戶端的部分角色,直接向 containerd 守護進程發送操作容器的請求。
runc
runc 是一個標准的 OCI 容器運行時的實現,它是一個命令行工具,可以直接用來創建和運行容器。
[root@control-plane ~]# mkdir /tmp/runc
[root@control-plane ~]# cd /tmp/runc/
導出容器的文件目錄
[root@control-plane runc]# mkdir rootfs && docker export $(docker create busybox) | tar -C rootfs -xvf -
生成runc配置文件
[root@control-plane runc]# runc spec[root@control-plane runc]# ls
config.json rootfs
{
"ociVersion": "1.0.1-dev",
"process": {
"terminal": true,
"user": {
"uid": 0,
"gid": 0
},
"args": [
"sh"
],
"env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"TERM=xterm"
],
"cwd": "/",
"capabilities": {
"bounding": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"effective": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"inheritable": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"permitted": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"ambient": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
]
},
"rlimits": [
{
"type": "RLIMIT_NOFILE",
"hard": 1024,
"soft": 1024
}
],
"noNewPrivileges": true
},
"root": {
"path": "rootfs",
"readonly": true
},
"hostname": "runc",
"mounts": [
{
"destination": "/proc",
"type": "proc",
"source": "proc"
},
{
"destination": "/dev",
"type": "tmpfs",
"source": "tmpfs",
"options": [
"nosuid",
"strictatime",
"mode=755",
"size=65536k"
]
},
{
"destination": "/dev/pts",
"type": "devpts",
"source": "devpts",
"options": [
"nosuid",
"noexec",
"newinstance",
"ptmxmode=0666",
"mode=0620",
"gid=5"
]
},
{
"destination": "/dev/shm",
"type": "tmpfs",
"source": "shm",
"options": [
"nosuid",
"noexec",
"nodev",
"mode=1777",
"size=65536k"
]
},
{
"destination": "/dev/mqueue",
"type": "mqueue",
"source": "mqueue",
"options": [
"nosuid",
"noexec",
"nodev"
]
},
{
"destination": "/sys",
"type": "sysfs",
"source": "sysfs",
"options": [
"nosuid",
"noexec",
"nodev",
"ro"
]
},
{
"destination": "/sys/fs/cgroup",
"type": "cgroup",
"source": "cgroup",
"options": [
"nosuid",
"noexec",
"nodev",
"relatime",
"ro"
]
}
],
"linux": {
"resources": {
"devices": [
{
"allow": false,
"access": "rwm"
}
]
},
"namespaces": [
{
"type": "pid"
},
{
"type": "network"
},
{
"type": "ipc"
},
{
"type": "uts"
},
{
"type": "mount"
}
],
"maskedPaths": [
"/proc/acpi",
"/proc/asound",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/sys/firmware",
"/proc/scsi"
],
"readonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
}
}
config.json 文件定義了 runc 啟動容器時的一些配置,如根目錄的路徑,文件掛載路徑等配置。
啟動容器
[root@control-plane runc]# runc run busybox
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 sh
6 root 0:00 ps aux
查看容器
[root@control-plane ~]# runc list
ID PID STATUS BUNDLE CREATED OWNER
busybox 19422 running /tmp/runc 2020-10-09T02:28:53.505825491Z root

