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 das Starten von Containern mit Befehlen wie:

docker run someImageName /bin/somebinary

Wo 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 auszuführenden Binärdateien anzugeben. Stattdessen, Ich möchte einfach die Dienste (z. B. systemd / sysvinit) ausführen, die normalerweise innerhalb des Images-Betriebssystems ausgeführt werden.

Dies scheint die häufigste Sache zu sein, die jemand jemals mit Docker machen möchte, aber der Versuch, ein Image ohne Befehl auszuführen, kehrt 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?

Wie hier dokumentiert, führen Sie einfach aus /sbin/init als Befehl wie bei jedem anderen Unix, der vom Einzelbenutzer- in den Mehrbenutzermodus bootet.

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

Container können vollwertige Betriebssysteme sein, sie müssen es einfach nicht sein (VMs auch nicht, es ist nur komplizierter zu konfigurieren und zu verwalten).

Ich würde sagen, der springende Punkt von Docker besteht darin, Anwendungscontainer einfach zu gestalten, sodass Sie nur eine App konfigurieren müssen, nicht das gesamte Betriebssystem.

Docker ist ein System zur Verwaltung und Bereitstellung von Anwendung container, nicht Betriebssystem Behälter. Es scheint, als würden Sie das Ausführen eines Docker-Containers mit dem Booten eines Betriebssystems in Einklang bringen.

Ihre Docker-Container sollten Einzweckanwendungen mit sehr engem Anwendungsbereich sein, die mit einem einzigen Befehl gestartet werden können. Wenn Sie nach etwas Komplexerem suchen, ist Docker nicht die Lösung, nach der Sie suchen. In diesem Fall schauen Sie sich KVM, ESXi, OpenVZ an, LXD usw.

Wenn Sie nur suchen, wie Sie einen Standard angeben können CMD und ENTRYPOINT für Ihre Container können Sie das unter tun bauzeit verwenden einer Docker-Datei.

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

FROM fedora:25CMD /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 osdocker exec -it os bash

Vollständige Systemd-Dienste innerhalb des Containers. Schön.

docker pull ubuntu

Führen Sie einfach so oft wie nötig dasselbe Bild aus. Neue Container werden erstellt und können dann gestartet und gestoppt werden, wobei jeder seine eigene Konfiguration speichert. Für Ihre Bequemlichkeit wäre es besser, jedem Ihrer Container einen Namen mit "--name" zu geben.

F. ich:

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

Das war's.

$ docker psCONTAINER ID        IMAGE            CREATED          STATUS               NAMESa7e789711e62        67759a80360c   12 hours ago     Up 2 minutes         MyContainer187ae9c5c3f84        67759a80360c   12 hours ago     Up About a minute    MyContainer2c1524520d864        67759a80360c   12 hours ago     Up About a minute    MyContainer3

Danach haben Sie Ihre Container für immer erstellt und können sie wie VMs starten und stoppen.

docker start MyContainer1

In den Container steigen und tun, was Sie wollen:

docker exec -it MyContainer1 bash

Dies ist ein Duplikat dieser Frage lxc - Start full container in Docker? - Stack Overflow

@FredtheMagicWonderDog Nicht ganz, obwohl die Antwort die gleiche ist.