容器到底是什么和宿主机中的进程什么关系---概述
创建2个进程:[root@jdtdbavm ~]# docker run -itd --name ubuntu-test ubuntu /bin/bashUnable to find image 'ubuntu:latest' locallylatest: Pulling from library/ubuntu345e3491a907: Pull complete57671312ef6f: Pul
先简单说下 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 等)封装为更简单易用的一个命令。
-
创建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 ~]#
-
执行 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 ~]#
-
在宿主机上执行 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 ~]#
-
执行 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 ~]#
更多推荐
所有评论(0)