Frage Wie kann ich ein vollständiges Betriebssystem in einem Docker-Container ausführen, ohne einen Befehl anzugeben?


Ich folge dem CoreOS Docker Dokumentation und es erwähnt Startcontainer mit Befehlen wie:

docker run someImageName /bin/somebinary

Woher someImageName ist ein Bild. Wenn / bin / somebinary beendet wird, wird das Image nicht mehr ausgeführt.

Ich möchte einfach ein Image ausführen, ohne irgendwelche ausführbaren Binaries anzugeben. Stattdessen, Ich möchte einfach die Dienste (z. B. systemd / sysvinit) ausführen, die normalerweise in den Images OS ausgeführt werden.

Dies scheint die üblichste Sache zu sein, die jemand jemals mit Docker machen möchte, aber der Versuch, ein Bild ohne einen Befehl auszuführen, gibt zurück:

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

Wie kann ich einen Docker-Container starten und ein vollständiges Betriebssystem ausführen, anstatt einen Befehl anzugeben??


24
2018-02-05 14:51


Ursprung


Dies ist ein Duplikat dieser Frage stackoverflow.com/questions/19332662/ ... - Fred the Magic Wonder Dog
@FredtheMagicWonderDog Nicht ganz, obwohl die Antwort die gleiche ist. - mikemaccana


Antworten:


Wie hier dokumentiert, läufst du einfach /sbin/init als der Befehl, wie jeder andere Unix, der vom Einzelbenutzer- zum Mehrbenutzermodus hochfährt.

https://stackoverflow.com/questions/19332662/start-full-container-in-docker

Container können voll ausgelastete OS's sein, sie müssen es einfach nicht sein (und VMs auch nicht, es ist nur komplizierter zu konfigurieren und zu verwalten).

Ich würde sagen, der Sinn von Docker liegt darin, die Anwendungscontainer einfach zu machen, sodass Sie nur eine App konfigurieren müssen, nicht das gesamte Betriebssystem.


24
2018-02-05 15:15



Vielen Dank. Nachdem ich das Image mit / sbin / init gestartet hatte, lief ich docker ps -notrunc, um die Container-ID zu erhalten sudo /usr/sbin/lxc-attach -n containerID in das laufende Bild einsteigen. Wie das andere Poster erwähnt, brauche ich keine zweite Init, also werde ich als nächstes Command-Container auschecken ... - mikemaccana
Zu sagen, dass man kein vollwertiges Betriebssystem in einer VM ausführen muss, ist, als würde man sagen, dass man kein vollwertiges Betriebssystem in einer physischen Maschine laufen lassen muss. Ja, der Kernel ist im Grunde genommen nur ein normales x86 / C Programm, das ohne die stdlib läuft und so init, aber es ist - Lie Ryan


Docker ist ein System zur Verwaltung und Bereitstellung von Anwendung Container, nicht Betriebssystem Behälter. Es sieht so aus, als würden Sie einen Docker-Container mit dem Booten eines Betriebssystems zusammenführen.

Ihre Docker-Container sollten einzweckige, sehr eng begrenzte Anwendungen sein, die mit einem einzigen Befehl gestartet werden können. Wenn Sie nach etwas Komplexem suchen, dann ist Docker nicht die Lösung, nach der Sie suchen. In diesem Fall überprüfen Sie KVM, ESXi, OpenVZ, LXD usw.

Wenn Sie nur suchen, wie Sie einen Standard angeben können CMD und ENTRYPOINT Für Ihre Container können Sie das tun Bauzeit eine Dockerfile verwenden.


10
2018-02-05 14:53



Ich bin mir bewusst, was Docker ist. Ich weise darauf hin, dass die Anwendungscontainer auf Betriebssystemen wie Fedora oder Ubuntu basieren. Persistente Anwendungen unter Unix - sogar nur Benutzerbereich Unixe wie Docker Container - werden entweder aus Initskripten oder Systemd Unit-Dateien gestartet. Zum Beispiel, wenn meine App abstürzt, möchte ich, dass sie automatisch neu startet, mit einem Schwellwert - wie Systemd bietet. - mikemaccana
Sie versuchen, zu viel in Ihre Container zu stopfen - sie sind kein Betriebssystem. Die Prozessüberwachung sollte außerhalb jedes Containers durchgeführt werden. - EEAA
Also, wenn ein Prozess stirbt ... einfach den gesamten Container neu starten? Ich denke, das ist nicht so teuer, so dass es in Ordnung sein könnte. Es fühlt sich irgendwie seltsam an - mein Container hat ein / sbin / init, aber es wird nie benutzt ... - mikemaccana
Ja, das ist die Idee. Dein Behälter hat ein /sbin/initaber das tut es nicht müssen, zu ... haben habe es. Sie haben wahrscheinlich einen Standard-Ubuntu-Container oder etwas Ähnliches verwendet. Es gibt a Menge von Bits in diesen Behältern, die entfernt werden können, wenn Sie es wünschen. - EEAA
@ ValkoSipuli Sie sind sicherlich frei, diese Meinung zu halten. Ich behaupte immer noch, dass das Ausführen von mehr als einem Prozess in einem Container einen Großteil des Grunds für die Verwendung von Containern an erster Stelle zunichte macht. Gibt es einen Platz zum Ausführen eines Betriebssystems in einem Container? Wahrscheinlich. Das ist eine Ausnahme und sollte nicht ohne viel Abwägung von Vor- und Nachteilen gemacht werden. - EEAA


Um ein vollständiges Betriebssystem in einem Container auszuführen, erstellen Sie die folgende Docker-Datei:

FROM fedora:25

CMD /sbin/init

Erstellen und starten Sie dann den Container und geben Sie eine Shell ein, um die darin ausgeführten Dienste zu erkunden:

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

Vollständige systemd-Dienste innerhalb des Containers. Wunderschönen.


3
2018-02-16 21:58