Docker
Docker in Docker
Ricerca…
Contenitore CI Jenkins che utilizza Docker
Questo capitolo descrive come configurare un Docker Container con Jenkins all'interno, che è in grado di inviare comandi Docker all'installazione Docker (il daemon Docker) dell'host. Utilizzare in modo efficace Docker in Docker. Per raggiungere questo obiettivo, dobbiamo creare un'immagine Docker personalizzata basata su una versione arbitraria dell'immagine ufficiale di Docker di Jenkins. Il Dockerfile (l'istruzione come costruire l'immagine) assomiglia a questo:
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
Questo Dockerfile crea un'immagine che contiene i binari del client Docker utilizzato da questo client per comunicare con un daemon Docker. In questo caso il Docker Daemon dell'host. L'istruzione RUN
in questo file crea anche un gruppo di utenti UNIX con l'UID 999 e aggiunge l'utente Jenkins. Perché esattamente questo è necessario è descritto nel capitolo successivo. Con questa immagine possiamo eseguire un server Jenkins che può usare i comandi Docker, ma se eseguiamo questa immagine il client Docker che abbiamo installato all'interno dell'immagine non può comunicare con il daemon Docker dell'host. Questi due componenti comunicano tramite UNIX Socket /var/run/docker.sock
. Su Unix questo è un file come tutto il resto, quindi possiamo montarlo facilmente all'interno del contenitore Jenkins. Questo viene fatto con il comando docker run -v /var/run/docker.sock:/var/run/docker.sock --name jenkins MY_CUSTOM_IMAGE_NAME
. Ma questo file montato è di proprietà di docker:root
e per questo motivo il Dockerfile crea questo gruppo con un UID ben noto e aggiunge l'utente Jenkins ad esso. Ora il contenitore Jenkins è davvero in grado di funzionare e utilizzare Docker. In produzione, il comando run dovrebbe contenere anche -v jenkins_home:/var/jenkins_home
per -v jenkins_home:/var/jenkins_home
backup della directory Jenkins_home e, naturalmente, una mappatura delle porte per accedere al server sulla rete.