Czy można uruchomić dokera z poziomu dokera?

185

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?

Johan
źródło
11
Inną możliwością jest zamontowanie gniazda dokera z hosta jako woluminu w kontenerze. Pozwala to tworzyć kontenery typu „rodzeństwo” i ma tę zaletę, że można ponownie użyć pamięci podręcznej.
Adrian Mouat,
4
Odkryłem, że podczas korzystania z gniazda dokującego z hosta, w przypadkach, w których chcę montować woluminy zewnętrzne, konieczne jest ustawienie ścieżki woluminu względem hosta, ponieważ tam działa demon dokera. Ustawienie go względem kontenera, który uruchamia kontenery, niekoniecznie będzie działać, chyba że ścieżki się pokrywają.
Jakob Runge

Odpowiedzi:

224

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:

  1. Nie współpracuje dobrze z modułami bezpieczeństwa Linux (LSM).
  2. Powoduje to niedopasowanie w systemach plików, które stwarza problemy dla kontenerów utworzonych w kontenerach nadrzędnych.

Z tego postu na blogu opisuje następującą alternatywę:

[Najprostszym sposobem jest po prostu odsłonić gniazdo Docker do kontenera CI, łącząc go za pomocą -vflagi.

Mówiąc najprościej, kiedy uruchamiasz swój kontener CI (Jenkins lub inny), zamiast hakować coś razem z Docker-in-Docker, zacznij od:

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

Teraz ten kontener będzie miał dostęp do gniazda Docker, a zatem będzie mógł uruchamiać kontenery. Tyle że zamiast uruchamiać kontenery „potomne”, uruchamiane są kontenery „siostrzane”.

predmijat
źródło
1
Jak uruchamiać polecenia dokera sudopodczas wykonywania takich czynności? Dzięki
c4k 21.10.2016
3
Trzeba dodać użytkownika do dockergrupy: sudo usermod -aG docker $USER. Po tym musisz ponownie się zalogować.
predmijat
2
Jak ponownie zalogować się w Cointainer?
thiagowfx,
1
@AlexanderMills Jest tak samo, ponieważ gniazdo dokera znajduje się również w /var/run/docker.sockmomencie uruchamiania dokera dla systemu Mac na komputerze Mac.
Bruce Sun
1
co z oknami? nie mam/var/run/docker.sock
Abdelhafid
54

Odpowiedziałem wcześniej na podobne pytanie, jak uruchomić kontener Docker w Docker .

Uruchomienie dokera wewnątrz dokera jest zdecydowanie możliwe. Najważniejsze jest to, że jesteś runzewnętrznym kontenerem z dodatkowymi uprawnieniami (zaczynając od --privileged=true), a następnie zainstaluj dokera w tym kontenerze.

Sprawdź ten post na blogu, aby uzyskać więcej informacji: Docker-in-Docker .

Jeden potencjalny przypadek użycia tego jest opisany w tym wpisie . Blog opisuje, jak budować kontenery dokowane w kontenerze dokowanym Jenkins.

Jednak Docker wewnątrz Dockera nie jest zalecanym podejściem do rozwiązywania tego rodzaju problemów. Zamiast tego zalecanym podejściem jest tworzenie kontenerów „siostrzanych”, jak opisano w tym poście

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.

wassgren
źródło
Zobacz komentarz poniżej dotyczący unikania dokera w dokerze.
Dan Poltawski
6

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 .

ctalledo
źródło
0

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 ...

Renu Saini
źródło