Как containerd-shim создает контейнеры без демонов?

Было заявлено, что:

Прокладка позволяет использовать контейнеры без демонов. По сути, он является родителем процесса контейнера, чтобы облегчить некоторые вещи.

Он сохраняет STDIO и другие файловые системы открытыми для контейнера, если оба контейнера и / или docker умирают. Если прокладка не работает, родительская сторона труб или мастер TTY будет закрыта, и контейнер выйдет.

Однако на уровне процесса кажется, что containerd порождает containerd-shim, поэтому, если containerd не работает, я бы ожидал, что containerd-shim тоже упадет.

Может ли кто-нибудь объяснить, как containerd-shim может оставаться включенным, если containerd/docker не работает?

$ ps fxa | grep dockerd -A 3

     PID TTY      STAT   TIME COMMAND
 43449 pts/2    S+     0:00              \_ grep dockerd -A 3
117536 ?        Ssl  163:36 /usr/bin/containerd
 93633 ?        Sl     1:01  \_ containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/8f75a1b32bb09611430ea55958b11a482b6c83ba2a75f7ca727301eb49a2770f -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc

$ pstree -lpTs
systemd(1)─┬─VGAuthService(45146)
           ├─accounts-daemon(1053)
           ├─agetty(104696)
           ├─agetty(104707)
           ├─agetty(104716)
           ├─atd(993)
           ├─containerd(117536)─┬─containerd-shim(8394)─┬─bash(8969)
           │                    │                       └─sh(8420)─┬─sshd(8512)
           │                    │                                  └─tail(8514)
           │                    ├─containerd-shim(13170)───bash(13198)
           │                    ├─containerd-shim(13545)───portainer(13577)
           │                    ├─containerd-shim(14156)───mysqld(14184)

...
 ├─dockerd(42320)─┬─docker-proxy(42700)
           │                ├─docker-proxy(42713)
           │                ├─docker-proxy(42725)
           │                ├─docker-proxy(42736)
           │                └─docker-proxy(42749)

ОБНОВЛЕНИЕ: на основе объяснения, предоставленного в принятом ответе:

$ pstree -lpTs
systemd(1)─┬─VGAuthService(45146)
           ├─accounts-daemon(1053)
           ├─agetty(104696)
           ├─agetty(104707)
           ├─agetty(104716)
           ├─atd(993)
           ├─containerd(117536)─┬─containerd-shim(8394)─┬─bash(8969)
           │                    │                       └─sh(8420)─┬─sshd(8512)
           │                    │                                  └─tail(8514)
           │                    ├─containerd-shim(13170)───bash(13198)
           │                    ├─containerd-shim(13545)───portainer(13577)
           │                    ├─containerd-shim(14156)───mysqld(14184)

$ sudo kill -9 117536

$ pstree -lpTs
systemd(1)─┬─VGAuthService(45146)
           ├─accounts-daemon(1053)
           ├─agetty(104696)
           ├─agetty(104707)
           ├─agetty(104716)
           ├─atd(993)
           ├─containerd-shim(8394)─┬─bash(8969)
           │                       └─sh(8420)─┬─sshd(8512)
           │                                  └─tail(8514)
           ├─containerd-shim(13170)───bash(13198)
           ├─containerd-shim(13545)───portainer(13577)
           ├─containerd-shim(14156)───mysqld(14184)

1 ответ

Решение

Однако на уровне процесса кажется, что containerd порождает containerd-shim, поэтому, если containerd не работает, я бы ожидал, что containerd-shim тоже упадет.

Дочерние процессы не умирают автоматически, когда умирает их родительский процесс, они просто переназначаются на PID 1. systemd берет на себя роль родителя и containerd-shim продолжает работать.

Другие вопросы по тегам