2015-12-14 50 views
8

Ich möchte Docker in einem laufenden Docker Container installieren.Docker im Docker Container

docker run -it centos:centos7 

Mein Basisbehälter centos verwendet, kann ich mich anmelden Behälter laufen docker exec verwenden. Aber wenn ich versuche, docker in es mit yum install -y docker installieren installiert es.

Aber irgendwie kann ich nicht die Docker Service mit docker -d & beginnen, es gibt mir Fehler wie:

INFO[0000] Option DefaultNetwork: bridge 
WARN[0000] Running modprobe bridge nf_nat br_netfilter failed with message: , error: exit status 1 
FATA[0000] Error starting daemon: Error initializing network controller: Error initializing bridge driver: Setup IP forwarding failed: open /proc/sys/net/ipv4/ip_forward: read-only file system 

Gibt es eine Möglichkeit, ich Docker innerhalb Docker Container installieren oder Bild bauen bereits ausgeführt Docker mit? Ich habe bereits these Beispiele gesehen, aber keine funktioniert für mich.

Die Ausgabe von uname -r auf dem Host-Rechner:

[[email protected] ~]$ uname -r 
4.2.6-200.fc22.x86_64 

Jede Hilfe würde geschätzt.

Vielen Dank im Voraus

+0

Können Sie alle Befehle angeben, die Sie zum Starten des Basis- und des Andock-Containers verwendet haben? Möglicherweise stimmt etwas nicht mit den Argumenten, die Sie übergeben. – michaelbahr

+0

Hallo Michaelbar, sicher unten ist, was ich versucht habe: Docker Lauf-es CentOS: centos7 bash Docker innen CentOS installieren: – priyank

+1

Bitte erweitern (edit) Ihre Frage mit den Befehlen. – michaelbahr

Antwort

1

Sie müssen den --privileged Parameter.

By default, Docker containers are “unprivileged” and cannot, for example, run a Docker daemon inside a Docker container.

Source

Führen Sie Ihre Basis-Image mit dem Befehl docker run --privileged -it centos:centos7 bash. Dann können Sie einen weiteren Andock-Container in diesem Container installieren und ausführen.

+0

hey thanks für schnelle Antwort, ich tr Mit "--privilaged", wenn ich Docker-Daemon in Centos7 Container ausführen, bekomme ich unter: keine Idee – priyank

+0

INFO [0000] Anhören von HTTP auf Unix (/var/run/docker.sock) WARN [0000] Udev-Synchronisierung wird nicht unterstützt. Dies führt zu unerwartetem Verhalten, Datenverlust und Fehlern. Weitere Informationen finden Sie unter https://docs.docker.com/reference/commandline/cli/#daemon-storage-driver-option. ERRO [0000] WARNUNG: Nein --storage-opt dm.thinpooldev angegeben, mit Loopback; Es wird dringend davon abgeraten, diese Konfiguration für die Produktion zu verwenden. ERRO [0000] [graphdriver] früherer Speichertreiber "devicemapper" fehlgeschlagen: exec: "mkfs.ext4": ausführbare Datei nicht gefunden in $ PATH – priyank

+1

Nein, Sie starten die ** Basis ** Andockcontainer mit '--privileged'. Der Innenbehälter wird ohne den Parameter gestartet. Bitte geben Sie immer die gesamten Befehle an, die Sie ausgeführt haben. – michaelbahr

7

aktualisieren

Dank https://stackoverflow.com/a/38016704/372019 möchte ich einen anderen Ansatz zeigen.

Anstatt die Binärdatei docker des Hosts zu installieren, sollten Sie eine containerspezifische Version der Binärdatei docker kopieren oder installieren. Da Sie es nur in einem Client-Modus verwenden, müssen Sie es nicht als Systemdienst installieren. Sie müssen den Docker-Socket weiterhin im Container bereitstellen, damit Sie problemlos mit der Docker-Engine des Hosts kommunizieren können.

Unter der Annahme, dass Sie ein Basisbild mit einem Arbeits Docker binären bekam (zB official docker image), sieht das Beispiel nun wie folgt aus:

docker run\ -v /var/run/docker.sock:/var/run/docker.sock\ docker:1.12 docker info


Ohne Ihre Frage wirklich zu beantworten Ich würde vorschlagen Sie lesen Using Docker-in-Docker for your CI or testing environment? Think twice.

Es wird erläutert, warum das Ausführen von docker-in-docker durch ein Setup ersetzt werden sollte, bei dem Docker-Container als Geschwister des Containers "outer" oder "base" ausgeführt werden. Der Artikel verweist auch auf das ursprüngliche Projekt https://github.com/jpetazzo/dind, in dem Sie Arbeitsbeispiele zum Ausführen von Docker in Docker finden, falls Sie Docker-in-Docker weiterhin verwenden möchten.

Ein Beispiel, wie man einen Behälter zu ermöglichen, um das Aussehen Docker Daemon Host zugreifen wie folgt aus:

docker run\ 
    -v /var/run/docker.sock:/var/run/docker.sock\ 
    -v /usr/bin/docker:/usr/bin/docker\ 
    busybox:latest /usr/bin/docker info 
2

Wenn Sie auf Mac mit Docker Toolbox sind.

Der unter Befehl NICHT ARBEITET

docker run\ 
    -v /var/run/docker.sock:/var/run/docker.sock\ 
    -v /usr/bin/docker:/usr/bin/docker\ 
    busybox:latest /usr/bin/docker info 

Da /var/run/docker.sock auf Ihrem OSX Dateisystem nicht

der Docker Daemon innerhalb des boot2docker VM ausgeführt wird - und das ist, wo der Unix-Socket ist .

So haben Sie den Behälter von boot2docker VM

$ docker-machine ssh default 
$ docker run\ 
     -v /var/run/docker.sock:/var/run/docker.sock\ 
     -v $(which docker):/usr/bin/docker\ 
     busybox:latest /usr/bin/docker info 
$ exit 

Das sieht aus wie Docker-in-Docker laufen, fühlt sich an wie Docker-in-Docker, aber es ist Docker-in-Docker nicht, wenn dieser Behälter Wenn Sie weitere Container erstellen, werden diese Container im Docker der obersten Ebene erstellt.

+0

Danke für den Kopf über ein schlechtes plattformspezifisches Beispiel. Ihr Beispiel ist sicherlich eine Verbesserung, aber es ist immer noch nicht plattformunabhängig. Sobald das Host-System und das Container-Basis-Image unterschiedliche Architekturen verwenden, sind Sie verloren. Ich werde meine Antwort mit einem flexibleren Ansatz aktualisieren. – gesellix