Docker元件介紹
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
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