Dado podman se instala en un sistema Linux y una unidad systemd llamada baz.service:
# /etc/systemd/system/baz.service
[Service]
ExecStart=/usr/bin/podman run --rm --tty --name baz alpine sh -c 'while true; do date; sleep 1; done'
ExecStop=/usr/bin/podman stop baz
Y comenzó el servicio baz.ser:
# systemctl daemon-reload
# systemctl start baz.service
Luego, cuando puedo comprobar el estado de la unidad no veo el sho sleepproceso en el cgroup /system.slice/baz.service
# systemctl status baz
● baz.service
Loaded: loaded (/etc/systemd/system/baz.service; static; vendor preset: enabl
Active: active (running) since Sat 2019-08-10 05:50:18 UTC; 14s ago
Main PID: 16910 (podman)
Tasks: 9
Memory: 7.3M
CPU: 68ms
CGroup: /system.slice/baz.service
└─16910 /usr/bin/podman run --rm --tty --name baz alpine sh -c while
# ...
Yo estaba esperando a ver el she sleephijos en mi estado baz.service porque he oído a la gente de decir RedHat podman utiliza un modelo tradicional tenedor-ejecutivo.
Si podman hizo fork y exec, ¿entonces mi shy sleepproceso no serían hijos de podman y estarían en el mismo cgroup que el proceso original de podman?
Esperaba poder usar systemd y podman para poder administrar mis contenedores sin que los niños se vayan a un padre diferente y escapen de mi unidad baz.service ssystemd.
Mirando la salida de pspuedo ver eso shy en sleeprealidad son hijos de un proceso diferente llamado conmon. No estoy seguro de dónde vino Conmon, o cómo se inició, pero systemd no lo capturó.
# ps -Heo user,pid,ppid,comm
# ...
root 17254 1 podman
root 17331 1 conmon
root 17345 17331 sh
root 17380 17345 sleep
De la salida está claro que mi unidad baz.service no está administrando la cadena de sueño conmon -> sh ->.
- ¿En qué se diferencia Podman del modelo de servidor del cliente de Docker?
- ¿En qué se diferencia el conmon de Podman de los contenedores de Docker?
Tal vez ambos son tiempos de ejecución de contenedores y el dockerddemonio es de lo que la gente quiere deshacerse.
Entonces quizás Docker es como:
- dockerd daemon
- docker cli
- contenedor contenedor tiempo de ejecución
Y podman es como:
- podman cli
- tiempo de ejecución del contenedor conmon
Entonces, tal vez podman use un modelo tradicional de ejecución de horquilla, pero no es el cli de podman el que se bifurca y el ejecutivo, es el proceso de conmon.
Me siento confundido.
fuente

Respuestas:
Toda la idea detrás
podmanes alejarse de la arquitectura centralizada con el supervisor superpotente (por ejemplodockerd), donde el demonio centralizado es un punto único de falla. Incluso hay un hashtag sobre esto: " #nobigfatdaemons ".¿Cómo evitar la gestión centralizada de contenedores? Eliminas el demonio principal único (de nuevo
dockerd) y comienzas los contenedores de forma independiente (al final del día, los contenedores son solo procesos, por lo que no necesitas el demonio para generarlos).Sin embargo, aún necesita el camino para
stdoutystderrdel contenedor;wait(2)en el PID 1 del contenedor;Para este propósito, cada contenedor podman todavía es supervisado por un pequeño demonio, llamado
conmon(desde "monitor de contenedor"). La diferencia con el demonio Docker es que este demonio es lo más pequeño posible (verifique el tamaño del código fuente ) y se genera por contenedor. Siconmonpor un contenedor se bloquea, el resto del sistema no se ve afectado.A continuación, ¿cómo se genera el contenedor?
Teniendo en cuenta que el usuario puede querer ejecutar el contenedor en segundo plano, como con Docker, el
podman runproceso se bifurca dos veces y solo luego se ejecutaconmon:El proceso intermedio entre
podman runyconmon(es decir, el padre directo deconmon- en el ejemplo anterior es PID 8484) saldrá yconmonserá reparentado porinit, convirtiéndose así en demonio autogestionado. Después de esto,conmontambién se bifurca el tiempo de ejecución (por ejemplorunc) y, finalmente, el tiempo de ejecución ejecuta el punto de entrada del contenedor (por ejemplo/bin/sh).Cuando el contenedor se está ejecutando,
podman runya no es necesario y puede salir, pero en su caso permanece en línea, porque no le pidió que se separara del contenedor.A continuación,
podmanutiliza cgroups para limitar los contenedores. Esto significa que crea nuevos cgroups para nuevos contenedores y mueve los procesos allí . Según las reglas de cgroups, el proceso puede ser miembro de un solo cgroup a la vez, y al agregar el proceso a algún cgroup lo elimina de otro cgroup (donde estaba anteriormente) dentro de la misma jerarquía. Entonces, cuando se inicia el contenedor, el diseño final de cgroups se ve así:podman runpermanece en cgroups delbaz.service, creado porsystemd, elconmonproceso se coloca en sus propios cgroups, y los procesos en contenedores se colocan en sus propios cgroups:Nota: PID 13075 anterior es en realidad un
sleep 1proceso, generado después de la muerte de PID 13043.Espero que esto ayude.
fuente
stdout/stderrstreams, nuevamente,podmanposee el contenedor y captura los streams del proceso en contenedor.systemdposee el servicio y captura las secuencias del proceso principal del servicio (en su caso,systemdrealmente capturastdout/stderrdelpodman runproceso). Esto funciona exactamente como debería funcionar, porqueconmoncaptura los flujos del contenedor, sepodman runconecta a ellosconmon,systemdcaptura los flujos depodman run, por lo que, finalmente, todos los registros del contenedor son capturadossystemdy usted los vesystemctl status baz.service.