Jak mogę uruchomić pełny system operacyjny w kontenerze Docker bez podawania polecenia?

25

Ja po Dokumentacja CoreOS Docker i wspomina począwszy pojemników z poleceń takich jak:

docker run someImageName /bin/somebinary

Gdzie someImageNamejest obraz. Kiedy / bin / somebinary kończy pracę, obraz nie będzie już działał.

Chciałbym po prostu uruchomić obraz, nie określając żadnych plików binarnych do uruchomienia. Zamiast tego chcę po prostu uruchomić usługi (np. Systemd / sysvinit), które zwykle działają w systemie operacyjnym obrazów .

Wydaje się, że jest to najczęstsza rzecz, jaką każdy chciałby zrobić z Dockerem, ale próba uruchomienia obrazu bez polecenia zwraca:

2014/02/05 14:49:19 Error: create: No command specified

Jak uruchomić kontener Docker i uruchomić pełny system operacyjny, zamiast określać polecenie ?

mikemaccana
źródło
To jest duplikat tego pytania stackoverflow.com/questions/19332662/...
Fred the Magic Wonder Dog
@FredtheMagicWonderDog Niezupełnie, chociaż odpowiedź jest taka sama.
mikemaccana

Odpowiedzi:

24

Jak tu udokumentowano, po prostu uruchamiasz się /sbin/initjako polecenie, podobnie jak każdy inny system uniksowy uruchamiający się z jednego użytkownika do trybu wielu użytkowników.

/programming/19332662/start-full-container-in-docker

Kontenery mogą być pełnowymiarowymi systemami operacyjnymi, po prostu nie muszą tak być (podobnie jak maszyny wirtualne, konfiguracja i zarządzanie nimi jest bardziej skomplikowane).

Powiedziałbym, że głównym celem Dockera jest ułatwienie kontenerów aplikacji, tak że trzeba tylko skonfigurować aplikację, a nie cały system operacyjny.

Fred the Magic Wonder Dog
źródło
Dzięki. Po uruchomieniu obrazu za pomocą / sbin / init, pobiegłem docker ps -notrunc, aby uzyskać identyfikator kontenera, a następnie sudo /usr/sbin/lxc-attach -n containerIDprzejść do działającego obrazu. Jako drugi plakat wspomina, ja naprawdę nie potrzebuje drugiego init, więc będę sprawdzić pojemniki jednorazowego polecenia obok ...
mikemaccana
Mówienie, że nie musisz uruchamiać pełnego systemu operacyjnego na maszynie wirtualnej, jest jak mówienie, że nie musisz uruchamiać pełnego systemu operacyjnego na maszynie fizycznej, tak, to prawda, że ​​jądro jest w zasadzie zwykłym x86 / C program, który działa bez stdlib i podobnie jak init, ale to
Lie Ryan
11

Docker to system do zarządzania i wdrażania kontenerów aplikacji , a nie kontenerów systemu operacyjnego . Wygląda na to, że łączysz uruchamianie kontenera dokującego z uruchamianiem systemu operacyjnego.

Kontenery Docker powinny być aplikacjami przeznaczonymi do jednego celu, o bardzo wąskim zakresie, które można uruchomić za pomocą jednego polecenia. Jeśli szukasz czegoś bardziej złożonego, to Docker nie jest rozwiązaniem, którego szukasz. W takim przypadku sprawdź KVM, ESXi, OpenVZ, LXD itp.

Jeśli szukasz tylko sposobu określenia wartości domyślnej CMDi ENTRYPOINTkontenerów, możesz to zrobić w czasie kompilacji za pomocą pliku Docker.

EEAA
źródło
5
Wiem, czym jest Docker. Zwrócę uwagę, że kontenery aplikacji są oparte na systemach operacyjnych, np. Fedora lub Ubuntu. Trwałe aplikacje w systemie Unix - nawet systemy uniksowe tylko w przestrzeni użytkownika, takie jak kontenery Docker - są uruchamiane albo z skryptów startowych, albo z plików jednostek systemowych. Na przykład, jeśli moja aplikacja ulegnie awarii, chciałbym, aby uruchomiła się ponownie automatycznie, z progiem - jak zapewnia systemd.
mikemaccana
5
Próbujesz wcisnąć za dużo w swoje pojemniki - to nie jest system operacyjny. Nadzór nad procesem powinien odbywać się poza każdym pojemnikiem.
EEAA
1
Więc jeśli proces umrze ... po prostu zrestartuj cały pojemnik? Myślę, że to nie jest tak drogie, więc może być OK. To trochę dziwne - mój pojemnik ma / sbin / init, ale nigdy się nie przyzwyczaja ...
mikemaccana
1
Tak, to jest pomysł. Twój kontener ma /sbin/init, ale nie musi go mieć. Prawdopodobnie użyłeś domyślnego kontenera Ubuntu lub czegoś podobnego. W tych pojemnikach znajduje się wiele bitów, które można usunąć, jeśli chcesz.
EEAA
1
@ValkoSipuli Z pewnością możesz mieć tę opinię. Nadal utrzymuję, że uruchamianie więcej niż jednego procesu w kontenerze neguje w dużej mierze powód używania kontenerów. Czy jest miejsce do uruchamiania systemu operacyjnego w kontenerze? Prawdopodobnie. Jest to jednak wyjątek i nie należy tego robić bez zastanowienia się nad zaletami i wadami.
EEAA
5

Aby uruchomić pełny system operacyjny w kontenerze, utwórz następujący plik Docker:

FROM fedora:25

CMD /sbin/init

Następnie zbuduj i uruchom kontener i wprowadź do niego powłokę, aby zbadać działające w niej usługi:

docker build -t os .
docker run -d --privileged --name os os
docker exec -it os bash

Pełne usystematyzowane usługi w kontenerze. Piękny.

Markus Hallmann
źródło
0
docker pull ubuntu

Po prostu uruchom z tego samego obrazu tyle razy, ile potrzeba. Zostaną utworzone nowe kontenery, które można będzie następnie uruchomić i zatrzymać, zapisując własną konfigurację. Dla Twojej wygody lepiej byłoby nadać każdemu swojemu kontenerowi nazwę z „--name”.

Fi:

docker run --name MyContainer1 <ubuntu image>
docker run --name MyContainer2 <ubuntu image>
docker run --name MyContainer3 <ubuntu image>

to jest to!

$ docker ps
CONTAINER ID        IMAGE            CREATED          STATUS               NAMES
a7e789711e62        67759a80360c   12 hours ago     Up 2 minutes         MyContainer1
87ae9c5c3f84        67759a80360c   12 hours ago     Up About a minute    MyContainer2
c1524520d864        67759a80360c   12 hours ago     Up About a minute    MyContainer3

Następnie masz kontenery utworzone na zawsze i możesz je uruchamiać i zatrzymywać jak maszyny wirtualne.

docker start MyContainer1

Aby dostać się do pojemnika i zrobić to, co chcesz:

docker exec -it MyContainer1 bash
DimiDak
źródło