Docker組件介紹



1602207109(1)


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

1602208549(1)



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

















             






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM