Systemd on containers Centos 7.x Oracle Linux 7.x RedHat Enterprise 7.x or similar

Cuando trabajamos con containers que requieran correr systemd en su interior, típicamente:

  • Oracle Linux
  • RedHat Enterprise Linux
  • Centos
  • Any other RedHat like Linux

Logo Docker

¿Puede correr systemd dentro de un container?

Aunque a priori podría parecer sencillo, la realidad es que no es especialmente fácil out of the box y tradicionalmente ha presentado problemas y bugs que dificultaban esta labor. Como muestra un boton:

https://github.com/dotcloud/docker/issues/3629

https://bugzilla.redhat.com/show_bug.cgi?id=1033604

Manos a la obra

Así que nos vamos a encontrar que esto no es una operación trivial. Particularmente yo lo hago de la siguiente manera (pondremos como ejemplo la creación de containers basados en Oracle Linux 7 (OL7).

Generamos una imagen con systemd y algunas utilidades básicas instaladas, lo llamaré “local/ol7-minimal”. El siguientes el el Dockerfile usado para generar la imagen:

 

FROM oraclelinux

ENV container docker
RUN yum -y update; yum clean all
RUN yum -y install systemd net-tools mlocalte; yum clean all;
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done);\
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /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 -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ “/sys/fs/cgroup” ]
CMD [“/usr/sbin/init”]

creamos la imagen

Creando minimal container

 

a partir de la anterior generaremos otra imagen ya con el servidor web + php instalada:

FROM local/ol7-minimal
RUN yum -y install httpd php5; yum clean all; systemctl enable httpd.service
STOPSIGNAL SIGRTMIN+3
EXPOSE 80
CMD [“/usr/sbin/init”]

generamos la imagen

 

Creamos imagen con web + php

 

con “docker images” vemos que ya las tenemos disponibles:

 

Imagenss docker disponibles

 

Finalmente procedemos a lanzar el contenedor basado en nuestra imagen “local/ol7-web-php”, lo que haremos con el siguiente comando:

 

docker run –privileged -d -t -i -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 81:80 –name ol7-web-01 local/ol7-web-php /bin/bash

y voila ya tenemos un container capaz de usar systemd.

 

Esta post se ha basado principalmente en la documentación de Docker y RedHat acerca de como correr systemd en el interior de contenedores basados en Centos, RedHat,etc. :

https://hub.docker.com/r/centos/systemd/

https://hub.docker.com/r/damianoneill/centos-systemd/

Running systemd within a Docker Container

Particularmente no me gusta especialmente tener que correr el contenedor en modo privilegiad, pero la realidad es que es el método mejor documentado y más fácil ya que solo recientemente ha empezado a aparecer (que ya es posible), la manera de hacerlo sin requerir el modo privilegiado … pero eso es historia para otra entrada :-).

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *