先简单说下 docker 的架构:
Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04
    就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。

开始今天的正题:容器或者说 docker 到底是什么???
简单回答就是宿主机上的用 containerd-shim (参考 moby 引擎架构)创建的一些进程仅此而已。只是这些进程有点特殊像一个 linux os。
注意:Linux 容器的“单进程”模型,指的是容器的生命周期等同于 PID=1 的进程(容器应用进程)的生命周期,而不是说容器里不能创建多进程。当然,一般情况下,容器应用进程并不具备进程管理能力,所以你通过 exec 或者 ssh 在容器里创建的其他进程,一旦异常退出(比如 ssh 终止)发生,其是很容易变成孤儿进程的。
docker 其实并没有创新新的技术,只是把一些现存的隔离技术(chroot 和 Namespace 和 Cgroup 等)封装为更简单易用的一个命令。

  1. 创建2个普通的容器:
    下面的测试例子的 docker 版本大概率是 20.10.10 的,后来为了手动安装 k8s 集群,该机器现在的 docker 版本被降为了 18.09.9

    [root@jdtdbavm ~]# docker run -itd --name ubuntu-test ubuntu /bin/bash
    Unable to find image 'ubuntu:latest' locally
    latest: Pulling from library/ubuntu
    345e3491a907: Pull complete 
    57671312ef6f: Pull complete 
    5e9250ddb7d0: Pull complete 
    Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93
    Status: Downloaded newer image for ubuntu:latest
    b24707eb497fe87aa81e71d1bf2ec29237aff652faf4a5a95566da3601d39103
    [root@jdtdbavm ~]# 
    [root@jdtdbavm ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    ubuntu       latest    7e0aa2d69a15   4 weeks ago   72.7MB
    ubuntu       15.10     9b9cb95443b5   4 years ago   137MB
    [root@jdtdbavm ~]# 
    [root@jdtdbavm ~]# docker ps 
    CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
    b24707eb497f   ubuntu    "/bin/bash"   12 seconds ago   Up 11 seconds             ubuntu-test
    [root@jdtdbavm ~]# 
    [root@jdtdbavm ~]# 
    [root@jdtdbavm ~]# 
    [root@jdtdbavm ~]# docker run -itd ubuntu:15.10 /bin/bash
    0cb79a3e3ac403886ea3683d39b0927183f9a3ac96b91c09668cdff49ab56164
    [root@jdtdbavm ~]# 
    [root@jdtdbavm ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS     NAMES
    0cb79a3e3ac4   ubuntu:15.10   "/bin/bash"   5 minutes ago    Up 5 minutes              cranky_feynman
    b24707eb497f   ubuntu         "/bin/bash"   17 minutes ago   Up 17 minutes             ubuntu-test
    [root@jdtdbavm ~]# 
    
  2. 执行 docker top 来查看容器内部运行的进程, 以上面的 b24707eb497f 容器为例:
    另外容器内 PID=1 的进程就是创建容器时指定的命令所对应的进程

    [root@jdtdbavm ~]# docker top b24707eb497f
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                4392                4371                0                   17:02               pts/0               00:00:00            /bin/bash
    [root@jdtdbavm ~]# 
    [root@jdtdbavm ~]# 
    [root@jdtdbavm ~]# docker exec -it b24707eb497f /bin/bash
     root@b24707eb497f:/# ps -ef 
     UID        PID  PPID  C STIME TTY          TIME CMD
     root         1     0  0 09:02 pts/0    00:00:00 /bin/bash ---是创建容器docker run 时指定的命令(进程)
     root        39     0  3 10:25 pts/1    00:00:00 /bin/bash ---是docker exec时指定的命令(进程)
     root        47    39  0 10:25 pts/1    00:00:00 ps -ef
     root@b24707eb497f:/# exit
     [root@jdtdbavm ~]# 
     [root@jdtdbavm ~]# 
    
  3. 在宿主机上执行 ps -ajx 查看宿主机进程,注意查看进程号为 4371 的进程(子进程是 4392, session ID 为 22755)就是容器 b24707eb497f 。同理进程号为 5889 的进程(子进程是 5911 , session ID 为 22755)就是容器 0cb79a3e3ac4 。这两个进程和进程号为 22755 的 /usr/bin/containerd(父进程是1 , session ID 为 22755) 是同属一个 session。
    到这时大家应该明白了,其实用命令 docker run 创建的容器就是 [进程/usr/bin/containerd] 创建的一个组长进程,(该组长进程的父进程可能是 init 进程(docker 版本20.10.10) 也可能是 /usr/bin/containerd 进程(docker 版本 18.09.9),这取决于 docker 的版本,但是这不影响本节内容的讨论),而你在启动容器时指定的应用程序(/bin/bash)就是该组长进程的子进程(该子进程运行在新的 session 里)。而当用 docker stop 停止容器时,容器进程和容器里运行的应用进程都会结束的。这是不是证明容器里可以启动多进程。请查考:容器到底是什么和宿主机中的进程什么关系—容器里的多进程

    [root@jdtdbavm ~]# 
    [root@jdtdbavm ~]# ps -ajx
     PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
        0     1     1     1 ?           -1 Ss       0   0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
        0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
        2     3     0     0 ?           -1 S        0   0:00 [ksoftirqd/0]
        2     5     0     0 ?           -1 S<       0   0:00 [kworker/0:0H]
        2     6     0     0 ?           -1 S        0   0:00 [kworker/u8:0]
        2     7     0     0 ?           -1 S        0   0:00 [migration/0]
        2     8     0     0 ?           -1 S        0   0:00 [rcu_bh]
        2     9     0     0 ?           -1 S        0   0:02 [rcu_sched]
        2    10     0     0 ?           -1 S<       0   0:00 [lru-add-drain]
        2    11     0     0 ?           -1 S        0   0:00 [watchdog/0]
        2    12     0     0 ?           -1 S        0   0:00 [watchdog/1]
        2    13     0     0 ?           -1 S        0   0:00 [migration/1]
        2    14     0     0 ?           -1 S        0   0:00 [ksoftirqd/1]
        2    16     0     0 ?           -1 S<       0   0:00 [kworker/1:0H]
        2    17     0     0 ?           -1 S        0   0:00 [watchdog/2]
        2    18     0     0 ?           -1 S        0   0:00 [migration/2]
        2    19     0     0 ?           -1 S        0   0:00 [ksoftirqd/2]
        2    21     0     0 ?           -1 S<       0   0:00 [kworker/2:0H]
        2    22     0     0 ?           -1 S        0   0:00 [watchdog/3]
        2    23     0     0 ?           -1 S        0   0:00 [migration/3]
        2    24     0     0 ?           -1 S        0   0:00 [ksoftirqd/3]
        2    26     0     0 ?           -1 S<       0   0:00 [kworker/3:0H]
        2    28     0     0 ?           -1 S        0   0:00 [kdevtmpfs]
        2    29     0     0 ?           -1 S<       0   0:00 [netns]
        2    30     0     0 ?           -1 S        0   0:00 [khungtaskd]
        2    31     0     0 ?           -1 S<       0   0:00 [writeback]
        2    32     0     0 ?           -1 S<       0   0:00 [kintegrityd]
        2    33     0     0 ?           -1 S<       0   0:00 [bioset]
        2    34     0     0 ?           -1 S<       0   0:00 [bioset]
        2    35     0     0 ?           -1 S<       0   0:00 [bioset]
        2    36     0     0 ?           -1 S<       0   0:00 [kblockd]
        2    37     0     0 ?           -1 S<       0   0:00 [md]
        2    38     0     0 ?           -1 S<       0   0:00 [edac-poller]
        2    39     0     0 ?           -1 S<       0   0:00 [watchdogd]
        2    46     0     0 ?           -1 S        0   0:00 [kswapd0]
        2    47     0     0 ?           -1 SN       0   0:00 [ksmd]
        2    48     0     0 ?           -1 SN       0   0:00 [khugepaged]
        2    49     0     0 ?           -1 S<       0   0:00 [crypto]
        2    57     0     0 ?           -1 S<       0   0:00 [kthrotld]
        2    58     0     0 ?           -1 S        0   0:00 [kworker/u8:1]
        2    59     0     0 ?           -1 S<       0   0:00 [kmpath_rdacd]
        2    60     0     0 ?           -1 S<       0   0:00 [kaluad]
        2    61     0     0 ?           -1 S<       0   0:00 [kpsmoused]
        2    62     0     0 ?           -1 S<       0   0:00 [ipv6_addrconf]
        2    75     0     0 ?           -1 S<       0   0:00 [deferwq]
        2   182     0     0 ?           -1 S        0   0:00 [kauditd]
        2   644     0     0 ?           -1 S<       0   0:00 [ata_sff]
        2   697     0     0 ?           -1 S        0   0:00 [scsi_eh_0]
        2   698     0     0 ?           -1 S<       0   0:00 [scsi_tmf_0]
        2   703     0     0 ?           -1 S        0   0:00 [scsi_eh_1]
        2   706     0     0 ?           -1 S<       0   0:00 [scsi_tmf_1]
        2  1022     0     0 ?           -1 S<       0   0:00 [ttm_swap]
        2  1042     0     0 ?           -1 S        0   0:00 [kworker/1:3]
        2  1296     0     0 ?           -1 S<       0   0:00 [kworker/0:1H]
        2  1407     0     0 ?           -1 S<       0   0:00 [bioset]
        2  1410     0     0 ?           -1 S<       0   0:00 [xfsalloc]
        2  1411     0     0 ?           -1 S<       0   0:00 [xfs_mru_cache]
        2  1415     0     0 ?           -1 S<       0   0:00 [xfs-buf/vda3]
        2  1416     0     0 ?           -1 S<       0   0:00 [xfs-data/vda3]
        2  1417     0     0 ?           -1 S<       0   0:00 [xfs-conv/vda3]
        2  1419     0     0 ?           -1 S<       0   0:00 [xfs-cil/vda3]
        2  1420     0     0 ?           -1 S<       0   0:00 [xfs-reclaim/vda]
        2  1425     0     0 ?           -1 S<       0   0:00 [xfs-log/vda3]
        2  1426     0     0 ?           -1 S<       0   0:00 [xfs-eofblocks/v]
        2  1433     0     0 ?           -1 S        0   0:06 [xfsaild/vda3]
        2  1434     0     0 ?           -1 S<       0   0:00 [kworker/1:1H]
        1  1502  1502  1502 ?           -1 Ss       0   0:01 /usr/lib/systemd/systemd-journald
        1  1516  1516  1516 ?           -1 Ss       0   0:00 /usr/lib/systemd/systemd-udevd
    21077  2310  2310  2310 pts/1     6284 Ss       0   0:00 -bash
        2  2702     0     0 ?           -1 R        0   0:00 [kworker/3:1]
        2  2709     0     0 ?           -1 S        0   0:00 [kworker/0:2]
        2  2805     0     0 ?           -1 S<       0   0:00 [nfit]
        1  2853  2853  2853 ?           -1 Ss      81   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
        1  2869  2869  2869 ?           -1 Ssl    999   0:00 /usr/lib/polkit-1/polkitd --no-debug
        1  2871  2871  2871 ?           -1 Ss       0   0:01 /usr/sbin/irqbalance --foreground
        1  2873  2873  2873 ?           -1 Ss       0   0:00 /usr/lib/systemd/systemd-logind
        1  2879  2879  2879 ?           -1 Ssl      0   0:00 /usr/sbin/NetworkManager --no-daemon
        1  2885  2885  2885 ?           -1 Ss       0   0:00 /usr/sbin/crond -n
        2  2913     0     0 ?           -1 S        0   0:00 [kworker/1:0]
        1  2928  2928  2928 tty1      2928 Ss+      0   0:00 /sbin/agetty --noclear tty1 linux
        1  2937  2937  2937 ?           -1 Ssl     28   0:00 /usr/sbin/nscd
        1  2949  2949  2949 ?           -1 Ss      38   0:00 /usr/sbin/ntpd -u ntp:ntp -g
     2879  3025  3025  2879 ?           -1 S        0   0:00 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-eth0.pid -lf /var/lib/NetworkManager/dhclient-3a68ceee-21f3-4bf4-846e-6ce26dd
        2  3034     0     0 ?           -1 S        0   0:00 [kworker/2:1]
        2  3052     0     0 ?           -1 S<       0   0:00 [mlx4]
        2  3069     0     0 ?           -1 S<       0   0:00 [kworker/2:1H]
        2  3072     0     0 ?           -1 S<       0   0:00 [ib-comp-wq]
        2  3073     0     0 ?           -1 S<       0   0:00 [kworker/u9:0]
        2  3074     0     0 ?           -1 S<       0   0:00 [ib-comp-unb-wq]
        2  3075     0     0 ?           -1 S<       0   0:00 [ib_mcast]
        2  3077     0     0 ?           -1 S<       0   0:00 [ib_nl_sa_wq]
        2  3087     0     0 ?           -1 S<       0   0:00 [mlx4_ib]
        2  3088     0     0 ?           -1 S<       0   0:00 [mlx4_ib_mcg]
        2  3188     0     0 ?           -1 S<       0   0:00 [mlx5_ib_sigerr_]
        2  3255     0     0 ?           -1 S<       0   0:00 [rdma_cm]
        1  3429  3429  3429 ?           -1 Ssl      0   0:02 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
        1  3430  3430  3430 ?           -1 Ss       0   0:00 /usr/sbin/sshd -D
        1  3433  3433  3433 ?           -1 Ssl      0   0:01 /usr/sbin/rsyslogd -n
        2  3578     0     0 ?           -1 S<       0   0:00 [kworker/3:1H]
        1  3580  3579  3579 ?           -1 S        0   0:02 python /usr/bin/denyhosts.py --daemon --config=/usr/share/denyhosts/denyhosts.cfg
        1  3589  3589  3589 ?           -1 Ss       0   0:00 /usr/local/share/jcloud/jdog-monitor/bin/jdog-watchdog
        1  4302  4295  4295 ?           -1 Sl       0   0:06 /usr/local/share/jcloud/ifrit/sbin/ifrit-supervise
     4302  4308  4295  4295 ?           -1 Sl       0   0:31 /usr/local/share/jcloud/ifrit/sbin/ifrit-agent
        2  4351     0     0 ?           -1 S        0   0:00 [kworker/2:3]
        1  4371  4371 22755 ?           -1 Sl       0   0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id b24707eb497fe87aa81e71d1bf2ec29237aff652faf4a5a95566da3601d39103 -address /run/containerd/container
     4371  4392  4392  4392 pts/0     4392 Ss+      0   0:00 /bin/bash
        1  4541  4541  4541 ?           -1 Ssl      0   0:27 /usr/local/share/jcloud/agent/core/JCSAgentCore >/dev/null 2>&1
     4541  5065  5065  4541 ?           -1 Sl       0   0:07 /usr/local/share/jcloud/agent/plugins/UpgradePlugin-1.0.736.e1d0167/UpgradePlugin -l unix:///usr/local/share/jcloud/agent/plugins/UpgradePlugin-1.0.736.
     4541  5066  5066  4541 ?           -1 Sl       0   0:59 /usr/local/share/jcloud/agent/plugins/MonitorPlugin-3.0.1092.b94f2ae/MonitorPlugin -l unix:///usr/local/share/jcloud/agent/plugins/MonitorPlugin-3.0.109
        2  5161     0     0 ?           -1 S        0   0:00 [kworker/2:0]
        2  5867     0     0 ?           -1 S        0   0:00 [kworker/1:1]
        1  5889  5889 22755 ?           -1 Sl       0   0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 0cb79a3e3ac403886ea3683d39b0927183f9a3ac96b91c09668cdff49ab56164 -address /run/containerd/container
     5889  5911  5911  5911 pts/0     5911 Ss+      0   0:00 /bin/bash
     2310  6284  6284  2310 pts/1     6284 R+       0   0:00 ps -ajx
        1  6468  6380  3589 ?           -1 Sl       0   1:05 /usr/local/share/jcloud/jdog-monitor/deploy/kunlunmirror/4_ed3226181cf6cfb106b2bfd41c9c450c/bin/jdog-kunlunmirror
     3589  6567  3589  3589 ?           -1 Sl       0   0:10 /usr/local/share/jcloud/jdog-monitor/bin/jdog-monitor.1.2.0.4
        2 20811     0     0 ?           -1 S        0   0:00 [kworker/3:0]
     3430 21077 21077 21077 ?           -1 Ds       0   0:01 sshd: root@pts/0,pts/1
    21077 21080 21080 21080 pts/0    21080 Ss+      0   0:00 -bash
        1 22755 22755 22755 ?           -1 Ssl      0   0:19 /usr/bin/containerd
        1 22769 22769 22769 ?           -1 Ssl      0   0:08 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
        2 23016     0     0 ?           -1 S        0   0:00 [kworker/0:0]
    [root@jdtdbavm ~]# 
    
  4. 执行 docker stop 停止容器, 然后在宿主机上执行 ps -ajx 查看宿主机进程,发现进程 5889 和其子进程 5911 都不存在了

     [root@jdtdbavm ~]# 
     [root@jdtdbavm ~]# docker stop 0cb79a3e3ac4
     0cb79a3e3ac4
     [root@jdtdbavm ~]# 
     [root@jdtdbavm ~]# 
     [root@jdtdbavm ~]# docker ps
     CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
     b24707eb497f   ubuntu    "/bin/bash"   18 minutes ago   Up 18 minutes             ubuntu-test
     [root@jdtdbavm ~]# 
     [root@jdtdbavm ~]# 
    
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐