Come posso eseguire un sistema operativo completo in un contenitore Docker, senza specificare un comando?


25

Sto seguendo la documentazione DockOS CoreOS e menziona l'avvio di container con comandi come:

docker run someImageName /bin/somebinary

Dov'è someImageNameun'immagine. Quando / bin / somebinary esce, l'immagine non sarà più in esecuzione.

Vorrei semplicemente eseguire un'immagine, senza specificare alcun file binario da eseguire. Invece, voglio semplicemente eseguire i servizi (ad esempio, systemd / sysvinit) che normalmente vengono eseguiti all'interno del sistema operativo delle immagini .

Questa sembra la cosa più comune che qualcuno vorrebbe mai fare con Docker, ma il tentativo di eseguire un'immagine senza un comando restituisce:

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

Come posso avviare un contenitore Docker ed eseguire un sistema operativo completo, anziché specificare un comando ?


Questo è un duplicato di questa domanda stackoverflow.com/questions/19332662/…
Fred the Magic Wonder Dog

@FredtheMagicWonderDog Non del tutto, sebbene la risposta sia la stessa.
mikemaccana,

Risposte:


24

Come documentato qui, esegui semplicemente /sbin/initil comando come qualsiasi altro avvio unix dalla modalità utente singolo a quella multiutente.

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

I container possono essere sistemi operativi completi, semplicemente non devono esserlo (né lo sono le macchine virtuali per quella materia, è solo più complicato da configurare e gestire).

Direi che il punto centrale di Docker è semplificare i contenitori delle applicazioni, in modo da configurare un'app, non l'intero sistema operativo.


Grazie. Dopo aver avviato l'immagine con / sbin / init, ho eseguito docker ps -notrunc, per ottenere l'ID contenitore, quindi sudo /usr/sbin/lxc-attach -n containerIDper entrare nell'immagine corrente. Come menziona l'altro poster, non ho davvero bisogno di un secondo init, quindi controllerò i contenitori a comando singolo il prossimo ...
mikemaccana,

Dire che non è necessario eseguire un sistema operativo completo in una macchina virtuale è come dire che non è necessario eseguire un sistema operativo completo in una macchina fisica, sì, è vero che il kernel è fondamentalmente solo un normale x86 / C programma che funziona senza lo stdlib e così anche init, ma è
Lie Ryan,

11

Docker è un sistema per la gestione e la distribuzione dei container delle applicazioni , non dei container del sistema operativo . Sembra che tu stia eseguendo un container docker con l'avvio di un sistema operativo.

I contenitori Docker devono essere applicazioni monouso e con ambito molto ristretto che possono essere avviate con un singolo comando. Se stai cercando qualcosa di più complesso di così, Docker non è la soluzione che stai cercando. In tal caso, controlla KVM, ESXi, OpenVZ, LXD ecc.

Se stai solo cercando come specificare un valore predefinito CMDe ENTRYPOINTper i tuoi contenitori, puoi farlo in fase di compilazione utilizzando un file Docker.


5
Sono consapevole di cosa sia Docker. Sottolineerò che i contenitori di applicazioni sono basati su sistemi operativi, ad esempio Fedora o Ubuntu. Le applicazioni persistenti su Unix - anche solo per gli utenti Unix come i contenitori Docker - sono avviate da initscripts o file di unità di sistema. Ad esempio, se la mia app si arresta in modo anomalo, vorrei che si riavviasse automaticamente, con una soglia fornita da systemd.
mikemaccana,

5
Stai cercando di stipare troppo nei tuoi contenitori: non sono un sistema operativo. La supervisione del processo deve essere gestita all'esterno di ciascun contenitore.
SEE

1
Quindi se un processo si interrompe ... basta riavviare l'intero contenitore? Immagino che non sia così costoso, quindi potrebbe essere OK. Sembra un po 'strano - il mio contenitore ha un / sbin / init, ma non si abitua mai ...
mikemaccana,

1
Sì, questa è l'idea. Il vostro contenitore ha una /sbin/init, ma non deve averlo. Probabilmente hai usato un contenitore Ubuntu predefinito o qualcosa del genere. Ci sono molti bit in questi contenitori che possono essere rimossi se lo desideri.
SEE

1
@ValkoSipuli Sei sicuramente libero di sostenere questa opinione. Continuo a sostenere che l'esecuzione di più di un processo all'interno di un contenitore annulla in gran parte il motivo dell'utilizzo dei contenitori. C'è un posto per eseguire un sistema operativo all'interno di un contenitore? Probabilmente. Questa è un'eccezione, tuttavia, e non dovrebbe essere fatta senza molta deliberazione sui pro / contro.
EEAA,

5

Per eseguire un sistema operativo completo in un contenitore, creare il seguente Dockerfile:

FROM fedora:25

CMD /sbin/init

Quindi compilare e avviare il contenitore ed inserire una shell al suo interno per esplorare i servizi in esecuzione al suo interno:

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

Servizi di sistema completi all'interno del contenitore. Bellissimo.


0
docker pull ubuntu

Corri dalla stessa immagine tutte le volte che è necessario. Verranno creati nuovi contenitori e potranno quindi essere avviati e arrestati ognuno salvando la propria configurazione. Per tua comodità, è meglio assegnare a ciascun contenitore un nome con "--name".

Fi:

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

Questo è tutto.

$ 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

Dopo di che hai i tuoi contenitori creati per sempre e puoi avviarli e fermarli come macchine virtuali.

docker start MyContainer1

Per entrare nel contenitore e fare quello che vuoi fare:

docker exec -it MyContainer1 bash
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.