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 ?



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


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.