Como sabemos, por defecto, el contenedor Docker se ejecuta sin systemd
significa que el usuario no puede usar systemctl
dominio. Es porque cualquier contenedor que creamos en Docker no se ha iniciado con init. Aquí aprendemos cómo ejecutar Systemd dentro de los contenedores Alamlinux/Rocky Linux/CentOS 8 Docker.
Bueno, la pregunta es por qué obtenemos un error cada vez que ejecutamos systemctl
comando dentro de cualquier contenedor docker? ¿Cuál es la razón detrás de esto?
En realidad, según los desarrolladores de Docker, que también recomiendan, se debe usar un solo servicio dentro de un contenedor. Significa que si planea instalar WordPress usando un contenedor, entonces debería haber un solo contenedor por aplicación. Por ejemplo, Apache + PHP en un contenedor mientras que MySQL en otro. Por lo tanto, Docker se ha desarrollado en este modelo, lo que significa que no hay necesidad de Systemd que encontramos en cualquier sistema Linux estándar para administrar y ejecutar múltiples servicios en paralelo. Por lo tanto, como Docker sugiere ejecutar múltiples contenedores para diferentes aplicaciones, los desarrolladores deshabilitaron este administrador de procesos del sistema para mejorar el aislamiento y la seguridad del contenedor, esa es la razón por la que recibimos un error cada vez que queremos usar el systemctl
comando.
Consejo:¿Qué es Systemd?
Systemd es un administrador de sistemas y sesiones (init system ) que es responsable de administrar todos los servicios que se ejecutan en el sistema durante todo el tiempo de funcionamiento de la computadora, desde el proceso de inicio hasta el apagado. Los procesos siempre se inician en paralelo (en la medida de lo posible) para que el proceso de arranque sea lo más corto posible.
Además, el systemd
es el primer proceso que se desencadena en un sistema Linux, por eso ejecutamos ps -aux
comando en cualquier terminal de Linux, vemos que el primer proceso (PID 1) se asigna a systemd
.
ps -aux
Por otro lado, cuando ejecuta el mismo comando dentro de un contenedor, verá el PID (1) significa que el primer proceso del sistema ha sido asignado a bash .
Por lo tanto, esta es la razón por la que obtendrá el error cada vez que intente iniciar algún servicio dentro del contenedor Docker usando systemctl comando.
Instalar o habilitar systemd dentro de los contenedores Docker de Almalinux o Rocky Linux 8
Crear un archivo Docker
Hay ciertos comandos que debemos ejecutar antes de crear un contenedor utilizando Almalinux o Rocky. Por lo tanto, en lugar de ejecutarlos en un solo comando, agréguelos en un archivo acoplable para crear una imagen acoplable habilitada con systemd
.
Crear un directorio, digamos 'sysmd
' :
mkdir sysmd
cambiar a él:
cd sysmd
Crear un archivo docker:
nano Dockerfile
Comandos para ejecutar en el archivo Docker para obtener Systemd
Ahora, copie y pegue los comandos dados en el archivo Docker:
Nota :Cambia el almalinux
a rockylinux
, si desea crear una imagen de Docker para ejecutar Rocky Linux.
Los comandos proporcionados en el archivo extraerán la imagen de Docker (Almalinux o Rocky) y luego ejecutarán el siguiente comando, incluido el montaje del volumen y el comando requerido para habilitar Systemd. Además, eliminaremos algunos archivos asociados con systemd para habilitar otros servicios que no necesitamos en nuestro contenedor Docker de línea de comando.
FROM almalinux ENV container docker RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in ; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); RUN rm -rf /lib/systemd/system/multi-user.target.wants/ \ && rm -rf /etc/systemd/system/.wants/ \ && rm -rf /lib/systemd/system/local-fs.target.wants/ \ && rm -f /lib/systemd/system/sockets.target.wants/udev \ && rm -f /lib/systemd/system/sockets.target.wants/initctl \ && rm -rf /lib/systemd/system/basic.target.wants/ \ && rm -f /lib/systemd/system/anaconda.target.wants/* VOLUME [ “/sys/fs/cgroup” ] CMD ["/usr/sbin/init"]
Guarde el archivo presionando Ctrl+O, pulsa Intro y luego presione Ctrl+X para salir del archivo.
Crear archivo contenedor Docker con systemd
Ahora, buscamos y construimos una imagen de contenedor mientras pasamos los comandos dados en el archivo Docker. Para eso, hay un comando llamado- docker build
y usamos lo mismo.
docker build -t almalinux-md .
Nota :Puede cambiar almalinux-md con el nombre que quieras darle a tu Imagen. Y tampoco olvides agregar un punto (. ) como se indica en el comando anterior, guía la build
comando para buscar Docker File dentro del directorio.
Puede ver que todos los comandos dados en el archivo han sido ejecutados por docker build
para hacer una nueva imagen con el nombre que le has dado.
Salida:
Sending build context to Docker daemon 2.56kB Step 1/6 : FROM almalinux ---> 4ca63ce1d8a9 Step 2/6 : ENV container docker ---> Running in 57d447426e1a Removing intermediate container 57d447426e1a ---> fa30ff65bd36 Step 3/6 : RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in ; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); ---> Running in bc3b161040e6 Removing intermediate container bc3b161040e6 ---> 6f51cf56580e Step 4/6 : RUN rm -rf /lib/systemd/system/multi-user.target.wants/ && rm -rf /etc/systemd/system/.wants/ && rm -rf /lib/systemd/system/local-fs.target.wants/ && rm -f /lib/systemd/system/sockets.target.wants/udev && rm -f /lib/systemd/system/sockets.target.wants/initctl && rm -rf /lib/systemd/system/basic.target.wants/ && rm -f /lib/systemd/system/anaconda.target.wants/* ---> Running in 082cfe33fc89 Removing intermediate container 082cfe33fc89 ---> 9f8224491315 Step 5/6 : VOLUME [ “/sys/fs/cgroup” ] ---> Running in fe0177b04643 Removing intermediate container fe0177b04643 ---> 212b1b01046b Step 6/6 : CMD ["/usr/sbin/init"] ---> Running in bff7b36d4964 Removing intermediate container bff7b36d4964 ---> 9b8dfd7c1d81 Successfully built 9b8dfd7c1d81 Successfully tagged almalinux-md:latest
Comprobar la imagen creada de Almalinux o Rocky Linux
Ahora, comprobemos si la imagen que hemos creado allí para iniciar contenedores o no:
docker images
Crear o iniciar Docker Container con systemd
Tenemos la Imagen que acabamos de construir, usémosla para crear un contenedor.
docker run -itd --privileged--name h2smedia almalinux-md
h2smedia
es el bonito nombre que queremos dar a nuestro contenedor mientras que almalinux-md
es el nombre de la imagen que hemos creado, reemplázala por la tuya.
Advertencia :Aquí estamos ejecutando el contenedor con un privilegio flag, esto le dará poder adicional a los contenedores, en palabras simples:el contenedor tendrá derechos o privilegios de raíz para la máquina host. Dichos contenedores, generalmente los usamos cuando queremos dar acceso directo al hardware (del host) o queremos ejecutar un contenedor dentro de un contenedor. Por lo tanto, se recomienda no utilizar dichos contenedores para uso comercial o empresarial donde los usuarios externos accedan a algunos servicios. Hágalo solo para fines locales o de desarrollo. Esa es la razón por la que ejecutamos el comando anterior con este indicador para que podamos tener la función Systemd o init en nuestro contenedor.
Cambiar a Contenedor Bash
Ahora, accedamos a la línea de comandos del contenedor para verificar si podemos ejecutar systemctl
comando o no.
Ahora, tiene la imagen de Docker con Systemd y esto le permitirá crear tantos contenedores como desee para desarrollar o probar aplicaciones locales.
Otros tutoriales:
• Cómo instalar y configurar Docker Container en AlmaLinux 8
• Cómo crear un archivo de unidad de servicio Systemd en Linux
• Analizar el tiempo de arranque del sistema Linux con Systemd