Wciągam Jenkinsa do kontenera Dockera. Zastanawiam się, czy kontener Jenkins może być również hostem Docker? Myślę o tym, aby uruchomić nowy kontener dokerów dla każdej kompilacji testu integracji z poziomu Jenkins (aby uruchomić bazy danych, brokerów komunikatów itp.). Kontenery powinny zatem zostać zamknięte po zakończeniu testów integracji. Czy istnieje powód, aby unikać uruchamiania kontenerów dokowanych z innego kontenera dokowanego w ten sposób?
jenkins
docker
docker-dind
Johan
źródło
źródło
Odpowiedzi:
Jeśli to możliwe, należy unikać uruchamiania Dockera wewnątrz Dockera (alias dind ), o ile to możliwe. (Źródło podano poniżej.) Zamiast tego chcesz skonfigurować sposób, w jaki główny kontener może produkować kontenery z rodzeństwem i komunikować się z nimi .
Jérôme Petazzoni - autor funkcji, która umożliwiła Dockerowi działanie w kontenerze Docker - napisał post na blogu, mówiąc, że tego nie robi . Opisany przez niego przypadek użycia odpowiada dokładnemu przypadkowi użycia OP dla kontenera Docker CI, który musi uruchamiać zadania wewnątrz innych kontenerów Docker.
Petazzoni wymienia dwa powody, dla których kłopoty są kłopotliwe:
Z tego postu na blogu opisuje następującą alternatywę:
źródło
sudo
podczas wykonywania takich czynności? Dziękidocker
grupy:sudo usermod -aG docker $USER
. Po tym musisz ponownie się zalogować./var/run/docker.sock
momencie uruchamiania dokera dla systemu Mac na komputerze Mac./var/run/docker.sock
Odpowiedziałem wcześniej na podobne pytanie, jak uruchomić kontener Docker w Docker .
Tak więc uruchomienie Dockera wewnątrz Dockera było przez wielu uważane za dobre rozwiązanie tego typu problemów. Obecnie trendem jest używanie zamiast tego kontenerów „siostrzanych”. Zobacz odpowiedź @predmijat na tej stronie, aby uzyskać więcej informacji.
źródło
Uruchomienie Docker-in-Docker (DinD) jest w porządku, a Docker (firma) ma do tego oficjalny wizerunek DinD .
Zastrzeżeniem jest jednak to, że wymaga uprzywilejowanego kontenera, który w zależności od potrzeb bezpieczeństwa może nie być realną alternatywą.
Alternatywne rozwiązanie uruchamiania Dockera przy użyciu kontenerów z rodzeństwem (inaczej Docker-out-of-Docker lub DooD) nie wymaga uprzywilejowanego kontenera, ale ma kilka wad wynikających z faktu, że uruchamiasz kontener z kontekstu, który jest różni się od tego, w którym jest uruchomiony (tzn. uruchamiasz kontener z poziomu kontenera, ale działa on na poziomie hosta, a nie wewnątrz kontenera).
Pisałem bloga opisującego plusy / minusy DinD vs Dood tutaj .
Powiedziawszy to, Nestybox (startup, który właśnie założyłem) pracuje nad rozwiązaniem, które bezpiecznie uruchamia prawdziwy Docker-in-Docker (bez użycia uprzywilejowanych kontenerów). Możesz to sprawdzić na stronie www.nestybox.com .
źródło
Tak, możemy uruchomić okno dokowane w oknie dokowanym, będziemy musieli dołączyć sockeet uniksowy „/var/run/docker.sock”, na którym demon dokujący domyślnie nasłuchuje jako wolumin do nadrzędnego okna dokowanego za pomocą „-v / var / run /docker.sock:/var/run/docker.sock ". Czasami mogą wystąpić problemy z uprawnieniami dla gniazda demona dokera, dla którego można napisać „sudo chmod 757 /var/run/docker.sock”.
Wymagałoby to również uruchomienia okna dokowanego w trybie uprzywilejowanym, więc polecenia będą następujące:
sudo chmod 757 /var/run/docker.sock
Uruchom okno dokowane --privileged = true -v /var/run/docker.sock:/var/run/docker.sock -it ...
źródło