Docker
Docker in Docker
Szukaj…
Kontener Jenkins CI przy użyciu Dockera
W tym rozdziale opisano, jak skonfigurować kontener Docker z Jenkinsem w środku, który może wysyłać polecenia Docker do instalacji Docker (demon Docker) hosta. Skutecznie używając Dockera w Dockerze. Aby to osiągnąć, musimy zbudować niestandardowy obraz Docker oparty na dowolnej wersji oficjalnego obrazu Docker Jenkins. Plik Docker (Instrukcja budowania obrazu) wygląda następująco:
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
Ten plik Docker tworzy obraz, który zawiera pliki binarne klienta Docker, którego klient używa do komunikacji z demonem Docker. W takim przypadku demon dokujący hosta. Instrukcja RUN
w tym pliku tworzy również grupę użytkowników UNIX z UID 999 i dodaje do niej użytkownika Jenkinsa. Dlaczego dokładnie to jest konieczne, opisano w dalszym rozdziale. Za pomocą tego obrazu możemy uruchomić serwer Jenkins, który może używać poleceń Docker, ale jeśli po prostu uruchomimy ten obraz, klient Docker zainstalowany w obrazie nie będzie mógł komunikować się z demonem Docker hosta. Te dwa komponenty komunikują się za pośrednictwem UNIX Socket /var/run/docker.sock
. W systemie Unix jest to plik jak wszystko inne, więc możemy go łatwo zamontować w pojemniku Jenkins. Odbywa się to za pomocą okna docker run -v /var/run/docker.sock:/var/run/docker.sock --name jenkins MY_CUSTOM_IMAGE_NAME
komendy docker run -v /var/run/docker.sock:/var/run/docker.sock --name jenkins MY_CUSTOM_IMAGE_NAME
. Ale ten zamontowany plik jest własnością docker:root
i dlatego Dockerfile tworzy tę grupę ze znanym UID i dodaje do niej użytkownika Jenkins. Teraz kontener Jenkins naprawdę może działać i używać Dockera. W produkcji polecenie uruchomienia powinno również zawierać -v jenkins_home:/var/jenkins_home
aby wykonać kopię zapasową katalogu Jenkins_home i oczywiście mapowanie portów, aby uzyskać dostęp do serwera przez sieć.