• 作者:老汪软件技巧
  • 发表时间:2024-11-30 00:03
  • 浏览量:

介绍

整篇文章会介绍一个容器开始到结束的全过程。我们来使用一个 busybox 镜像来做例子因为它是一个非常轻量化的基础镜像。我们会把这个镜像运行起来,分析一下运行时候的状态,最后把它关掉,来看一下这个过程docker的怎么控制这个容器的。

这个指令可以把busybox镜像下载下来。

docker pull busybox

流程查看开始前的状态查看docker守护程序(daemon)

dockerd是docker服务的守护程序,它有什么作用呢?

通过ps来查看一下它的PID吧

ps aux | grep dockerd

输出是

root      260776  0.1  0.6 4056156 98584 ?       Ssl  Nov26   2:21 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
kaifeng   358710  0.0  0.0  17812  2304 pts/1    S+   23:17   0:00 grep --color=auto dockerd

containerd是什么?

containerd是container的守护程序,负责处理从dockerd放送来的请求,来做一些容器的底层的操作比如资源的分配,查看容器的状态等等

所以我们可以推断到,创建docker容器的请求会被放送给它,那么它做什么来处理这个请求呢?

运行containerd-shim-runc-v2! 这个会帮助创建一个容器的进程,这个进程可以通过套接字跟containerd进程交流来管理全部的容器。

可以通过ps查找是否有通过这个指令containerd-shim-runc-v2运行的程序

ps axu | grep containerd-shim

因为我们还没有运行任何的容器,所以应该什么都没有

运行容器运行指令

运行一下

docker run -d busybox top

查看一下容器的id

运行一下

docker ps

输出

CONTAINER ID   IMAGE                          COMMAND                  CREATED         STATUS                  PORTS                                                             NAMES
b97f1233ba3a   busybox                        "top"                    2 minutes ago   Up 2 minutes                                                                              compassionate_sinoussi

查看containerd-shim-runc-v2运行的程序

运行一下

ps axu | grep containerd-shim

输出

root      359757  0.0  0.0 1237940 14080 ?       Sl   23:57   0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id b97f1233ba3acfad81b68a100575b134e1f455b5a069705bdb71ab6ddc4c2cd0 -address /run/containerd/containerd.sock

docker容器运行命令_docker容器原理_

容器的运行导致了一个进程开始运行,我们可以从id看出来这个进程跟我们的容器有关系。

查看一下跟这个容器进程相关的子进程

可以使用pstree来寻找

kaifeng@kaifeng-Lenovo-XiaoXinPro-16IHU-2021:~$ pstree -p 359757
containerd-shim(359757)─┬─top(359777)
                        ├─{containerd-shim}(359758)
                        ├─{containerd-shim}(359759)
                        ├─{containerd-shim}(359760)
                        ├─{containerd-shim}(359761)
                        ├─{containerd-shim}(359762)
                        ├─{containerd-shim}(359763)
                        ├─{containerd-shim}(359764)
                        ├─{containerd-shim}(359765)
                        ├─{containerd-shim}(359766)
                        ├─{containerd-shim}(359815)
                        └─{containerd-shim}(360278)

我们可以总结,外面仍然可以看到容器里面的进程,因为docker的隔离性有局限因为容器和宿主机共有了一个内核

运行的容器容器内部的用户和第一个进程是谁?

我们可以使用exec来执行sh来跟容器交互

docker exec -it <容器名字或者id> sh

PID   USER     TIME  COMMAND
    1 root      0:00 top
    7 root      0:00 sh
   14 root      0:00 ps aux

查看我现在是哪一个用户

whoami

结果

root

root的权限

root的权限在容器里面就是超级用户可以在容器执行任何操作。

结束运行

结束运行指令

docker stop or id>

然后我们会发现属于这个容器的containerd-shim-runc-v2运行进程结束了。