Docker
Docker en Docker
Buscar..
Jenkins CI Container utilizando Docker
Este capítulo describe cómo configurar un contenedor Docker con Jenkins dentro, que es capaz de enviar comandos Docker a la instalación Docker (el demonio Docker) del host. Efectivamente utilizando Docker en Docker. Para lograr esto, tenemos que construir una imagen Docker personalizada que se base en una versión arbitraria de la imagen oficial de Jenkins Docker. El archivo Docker (la instrucción de cómo construir la imagen) se ve así:
FROM jenkins
USER root
RUN cd /usr/local/bin && \
curl https://master.dockerproject.org/linux/amd64/docker > docker && \
chmod +x docker && \
groupadd -g 999 docker && \
usermod -a -G docker jenkins
USER Jenkins
Este Dockerfile construye una imagen que contiene los archivos binarios del cliente Docker, este cliente se utiliza para comunicarse con un demonio Docker. En este caso el demonio Docker del host. La instrucción RUN
en este archivo también crea un grupo de usuarios UNIX con el UID 999 y le agrega el usuario Jenkins. Por qué exactamente esto es necesario se describe en el capítulo siguiente. Con esta imagen podemos ejecutar un servidor Jenkins que puede usar los comandos de Docker, pero si solo ejecutamos esta imagen, el cliente de Docker que instalamos dentro de la imagen no se puede comunicar con el demonio Docker del host. Estos dos componentes se comunican a través de un zócalo UNIX /var/run/docker.sock
. En Unix, este es un archivo como todo lo demás, por lo que podemos montarlo fácilmente dentro del Contenedor Jenkins. Esto se hace con el comando docker run -v /var/run/docker.sock:/var/run/docker.sock --name jenkins MY_CUSTOM_IMAGE_NAME
. Pero este archivo montado es propiedad de docker:root
y debido a esto, Dockerfile crea este grupo con un UID conocido y agrega al usuario Jenkins. Ahora es el contenedor Jenkins realmente capaz de ejecutar y usar Docker. En producción, el comando de ejecución también debe contener -v jenkins_home:/var/jenkins_home
para hacer una copia de seguridad del directorio Jenkins_home y, por supuesto, una asignación de puertos para acceder al servidor a través de la red.