Suche…


Syntax

  • Docker-Lauf [OPTIONEN] IMAGE [BEFEHL] [ARG ...]

Einen Container ausführen

docker run hello-world

Dadurch wird das neueste Hallo-Welt- Image vom Docker Hub abgerufen (falls noch nicht vorhanden), ein neuer Container erstellt und ausgeführt. Es sollte eine Meldung angezeigt werden, dass Ihre Installation anscheinend ordnungsgemäß funktioniert.

Einen anderen Befehl im Container ausführen

docker run docker/whalesay cowsay 'Hello, StackExchange!'

Dieser Befehl weist Docker an, einen Container aus dem docker/whalesay Image zu erstellen und den Befehl cowsay 'Hello, StackExchange!' drin. Es sollte ein Bild eines Wals ausdrucken, der Hello, StackExchange! sagt Hello, StackExchange! zu Ihrem Terminal.

Wenn der Einstiegspunkt im Image der Standard ist, können Sie jeden im Image verfügbaren Befehl ausführen:

docker run docker/whalesay ls /

Wenn es während des Image-Builds geändert wurde, müssen Sie den Standardwert wiederherstellen

docker run --entrypoint=/bin/bash docker/whalesay -c ls /

Einen Container nach dem Ausführen automatisch löschen

Normalerweise bleibt ein Docker-Container nach dem Beenden bestehen. Dadurch können Sie den Container erneut ausführen, sein Dateisystem überprüfen und so weiter. Manchmal möchten Sie jedoch einen Container ausführen und sofort nach dem Beenden löschen. Zum Beispiel, um einen Befehl auszuführen oder eine Datei aus dem Dateisystem anzuzeigen. Docker bietet zu diesem Zweck die --rm :

docker run --rm ubuntu cat /etc/hosts

Dadurch wird aus dem Image "ubuntu" ein Container erstellt, der Inhalt der Datei / etc / hosts wird angezeigt und der Container wird unmittelbar nach dem Beenden gelöscht. Dies hilft zu vermeiden, dass Sie die Container nach dem Experimentieren aufräumen müssen.

Hinweis: Das Flag --rm funktioniert nicht zusammen mit dem Flag -d ( --detach ) im Andockfenster <1.13.0.

Wenn --rm Flag --rm gesetzt ist, entfernt Docker auch die mit dem Container verknüpften Volumes, wenn der Container entfernt wird. Dies ähnelt dem Ausführen von docker rm -v my-container . Nur Volumes, die ohne Namen angegeben werden, werden entfernt .

Wenn Sie beispielsweise das docker run -it --rm -v /etc -v logs:/var/log centos /bin/produce_some_logs , wird der Datenträger von /etc entfernt, der Datenträger von /var/log jedoch nicht. Volumes, die über --volumes-from geerbt wurden, werden mit derselben Logik entfernt. Wenn das ursprüngliche Volume mit einem Namen angegeben wurde, wird es nicht entfernt.

Einen Namen angeben

Standardmäßig mit erstellten Behältern docker run werden einen zufälligen Namen wie angegeben small_roentgen oder modest_dubinsky . Diese Namen sind nicht besonders hilfreich, um den Zweck eines Containers zu ermitteln. Es ist möglich, einen Namen für den Container --name indem Sie die --name :

docker run --name my-ubuntu ubuntu:14.04

Namen müssen eindeutig sein. Wenn Sie einen Namen übergeben, den ein anderer Container bereits verwendet, gibt Docker einen Fehler aus, und es wird kein neuer Container erstellt.

Die Angabe eines Namens ist hilfreich, wenn auf den Container innerhalb eines Docker-Netzwerks verwiesen wird. Dies funktioniert sowohl für Docker-Container im Hintergrund als auch im Vordergrund.

Container im Standard-Bridge-Netzwerk müssen verknüpft werden, um über den Namen zu kommunizieren.

Binden eines Containerports an den Host

docker run -p "8080:8080" myApp
docker run -p "192.168.1.12:80:80" nginx
docker run -P myApp

Um auf dem Host - Ports zu verwenden , haben in einem Bild (über die ausgesetzt worden EXPOSE Dockerfile Direktive oder --expose Befehlszeilenoption für docker run ), müssen diese Ports an den Host gebunden werden , um die Verwendung von -p oder -P Befehl Leitungsoptionen. Für die Verwendung von -p müssen der bestimmte Port (und die optionale Hostschnittstelle) angegeben werden. Wenn Sie die Befehlszeilenoption -P , wird Docker dazu gezwungen, alle freigelegten Ports im Image eines Containers an den Host zu binden.

Container-Neustartrichtlinie (Starten eines Containers beim Booten)

docker run --restart=always -d <container>

Standardmäßig startet Docker keine Container neu, wenn der Docker-Daemon neu gestartet wird, beispielsweise nach einem Neustart des Hostsystems. Docker stellt eine Neustartrichtlinie für Ihre Container --restart indem Sie die --restart . Die --restart=always einen Neustart eines Containers, nachdem der Docker-Daemon neu gestartet wurde. Jedoch , wenn dieser Behälter manuell gestoppt wird (zB mit docker stop <container> ), wird der Neustart - Richtlinie nicht auf den Behälter aufgebracht werden.

--restart nach Anforderung können mehrere Optionen für --restart Option --restart angegeben werden ( --restart=[policy] ). Diese Optionen wirken sich auch darauf aus, wie der Container beim Booten gestartet wird.

Politik Ergebnis
Nein Der Standardwert Der Container wird nicht automatisch neu gestartet, wenn der Container gestoppt wird.
On-Failure [: max-retries] Starten Sie nur dann neu, wenn der Container mit einem Fehler beendet wird ( non-zero exit status ). Um einen unbegrenzten Neustart (bei Problemen) zu vermeiden, können Sie die Anzahl der Neustartversuche des Docker-Dämons begrenzen.
immer Starten Sie den Container unabhängig vom Exitstatus immer neu. Wenn Sie always angeben, versucht der Docker-Daemon, den Container unbegrenzt neu zu starten. Der Container wird auch beim Start des Daemons unabhängig vom aktuellen Status des Containers gestartet.
wenn nicht gestoppt Starten Sie den Container unabhängig vom Exitstatus immer neu. Starten Sie ihn jedoch nicht beim Start des Daemons, wenn der Container zuvor in den Stoppzustand versetzt wurde.

Führen Sie einen Container im Hintergrund aus

-d Befehlszeilenoption -d während des Startens des Containers an, um einen Container im Hintergrund laufen zu lassen:

docker run -d busybox top

Die Option -d führt den Container im getrennten Modus aus. Es ist auch äquivalent zu -d=true .

Ein Container im getrennten Modus kann nicht automatisch entfernt werden, wenn er angehalten wird. Dies bedeutet, dass die Option --rm nicht zusammen mit der Option -d verwendet werden kann.

Weisen Sie einem Container ein Volume zu

Ein Docker-Volume ist eine Datei oder ein Verzeichnis, das über die Lebensdauer des Containers hinaus erhalten bleibt. Es ist möglich, eine Hostdatei oder ein Hostverzeichnis in einem Container als Volume einzuhängen (unter Umgehung des UnionFS).

Fügen Sie ein Volume mit der Befehlszeilenoption -v hinzu:

docker run -d -v "/data" awesome/app bootstrap.sh

Dadurch wird ein Volume erstellt und in den Pfad /data im Container eingebunden.

  • Hinweis: Sie können das Flag --rm , um das Volume automatisch zu entfernen, wenn der Container entfernt wird.

Mounten von Host-Verzeichnissen

So hängen Sie eine Hostdatei oder ein Verzeichnis in einen Container ein:

docker run -d -v "/home/foo/data:/data" awesome/app bootstrap.sh
  • Bei der Angabe eines Host-Verzeichnisses muss ein absoluter Pfad angegeben werden.

Dadurch wird das Hostverzeichnis /home/foo/data in /data im Container /home/foo/data . Dieses Volume, das an ein mount --bind Host-Verzeichnis mount --bind ist, ist dasselbe wie ein Linux- mount --bind und mount --bind das Host-Verzeichnis daher vorübergehend über den angegebenen Containerpfad für die Dauer des Containers. Änderungen am Volume des Hosts oder des Containers werden sofort auf dem anderen Datenträger angezeigt, da sie dasselbe Ziel auf der Festplatte sind.

UNIX-Beispiel zum Mounten eines relativen Ordners

docker run -d -v $(pwd)/data:/data awesome/app bootstrap.sh

Volumes benennen

Ein Volume kann benannt werden, indem anstelle eines Hostverzeichnispfads eine Zeichenfolge angegeben wird. Andernfalls erstellt Docker ein Volume mit diesem Namen.

docker run -d -v "my-volume:/data" awesome/app bootstrap.sh

Nach dem Erstellen eines benannten Datenträgers kann der Datenträger dann mit anderen Containern mit diesem Namen gemeinsam genutzt werden.

Umgebungsvariablen setzen

$ docker run -e "ENV_VAR=foo" ubuntu /bin/bash

Mit -e und --env können Umgebungsvariablen innerhalb eines Containers definiert werden. Es ist möglich, viele Umgebungsvariablen über eine Textdatei bereitzustellen:

$ docker run --env-file ./env.list ubuntu /bin/bash

Beispiel für Umgebungsvariablendatei:

# This is a comment
TEST_HOST=10.10.0.127

Das --env-file nimmt einen Dateinamen als Argument an und erwartet, dass jede Zeile das Format VARIABLE=VALUE , das das an --env Argument --env . Kommentarzeilen müssen nur mit # vorangestellt werden.

Unabhängig von der Reihenfolge dieser drei Flags werden zuerst die --env-file und dann -e / --env Flags verarbeitet. Auf diese Weise überschreiben alle Umgebungsvariablen, die einzeln mit -e oder --env werden, die in der --env-var Variablen.

Angabe eines Hostnamens

Standardmäßig erhalten Container, die mit dem Andocklauf erstellt wurden, einen zufälligen Hostnamen. Sie können dem Container einen anderen Hostnamen geben, indem Sie das Flag --hostname übergeben:

docker run --hostname redbox -d ubuntu:14.04

Führen Sie einen Container interaktiv aus

Um einen Container interaktiv auszuführen, übergeben Sie die Optionen -it :

$ docker run -it ubuntu:14.04 bash
root@8ef2356d919a:/# echo hi
hi
root@8ef2356d919a:/#

-i hält STDIN offen, während -t einen Pseudo-TTY zuweist.

Container mit Speicher- / Auslagerungslimits ausführen

Legen Sie das Speicherlimit fest und deaktivieren Sie das Swap-Limit

docker run -it -m 300M --memory-swap -1 ubuntu:14.04 /bin/bash

Legen Sie sowohl den Speicher als auch den Swap-Grenzwert fest. In diesem Fall kann der Container 300 MB Arbeitsspeicher und 700 MB Swap verwenden.

docker run -it -m 300M --memory-swap 1G ubuntu:14.04 /bin/bash

Eine Shell in einen laufenden Container bringen

Melden Sie sich bei einem laufenden Container an

Ein Benutzer kann einen laufenden Container in einer neuen interaktiven Bash-Shell mit dem Befehl exec eingeben.

jovial_morse ein Container heißt jovial_morse Dann können Sie eine interaktive Pseudo-TTY-Bash-Shell erhalten, indem Sie jovial_morse :

docker exec -it jovial_morse bash

Melden Sie sich bei einem laufenden Container mit einem bestimmten Benutzer an

Wenn Sie einen Container als bestimmten Benutzer --user möchten, können Sie ihn mit dem Parameter -u oder --user . Der Benutzername muss im Container vorhanden sein.

-u, --user Benutzername oder UID (Format: <name|uid>[:<group|gid>] )

Dieser Befehl jovial_morse mit dem Benutzer des dockeruser Benutzers bei dockeruser

docker exec -it -u dockeruser jovial_morse bash

Melden Sie sich als root bei einem laufenden Container an

Wenn Sie sich als Root anmelden möchten, verwenden Sie einfach den -u root Parameter -u root . Stammbenutzer existiert immer.

docker exec -it -u root jovial_morse bash

Loggen Sie sich in ein Bild ein

Sie können sich auch mit dem Befehl run in einem Image anmelden. Dies erfordert jedoch einen Image-Namen anstelle eines Containernamens.

docker run -it dockerimage bash

Anmelden bei einem Zwischenabbild (Debug)

Sie können sich auch bei einem Zwischenabbild anmelden, das während eines Dockerfile-Builds erstellt wird.

Ausgabe des docker build .

$ docker build .
Uploading context 10240 bytes
Step 1 : FROM busybox
Pulling repository busybox
 ---> e9aa60c60128MB/2.284 MB (100%) endpoint: https://cdn-registry-1.docker.io/v1/
Step 2 : RUN ls -lh /
 ---> Running in 9c9e81692ae9
total 24
drwxr-xr-x    2 root     root        4.0K Mar 12  2013 bin
drwxr-xr-x    5 root     root        4.0K Oct 19 00:19 dev
drwxr-xr-x    2 root     root        4.0K Oct 19 00:19 etc
drwxr-xr-x    2 root     root        4.0K Nov 15 23:34 lib
lrwxrwxrwx    1 root     root           3 Mar 12  2013 lib64 -> lib
dr-xr-xr-x  116 root     root           0 Nov 15 23:34 proc
lrwxrwxrwx    1 root     root           3 Mar 12  2013 sbin -> bin
dr-xr-xr-x   13 root     root           0 Nov 15 23:34 sys
drwxr-xr-x    2 root     root        4.0K Mar 12  2013 tmp
drwxr-xr-x    2 root     root        4.0K Nov 15 23:34 usr
 ---> b35f4035db3f
Step 3 : CMD echo Hello world
 ---> Running in 02071fceb21b
 ---> f52f38b7823e

Beachten Sie die ---> Running in 02071fceb21b . Sie können sich bei diesen Bildern anmelden:

docker run -it 02071fceb21b bash

Stdin an den Container übergeben

In Fällen wie dem Wiederherstellen eines Datenbank-Dumps oder wenn Sie auf andere Weise einige Informationen vom Host durch eine Pipe pushen möchten, können Sie das Flag -i als Argument für das docker run oder docker exec .

Angenommen, Sie möchten einem in Container befindlichen Mariadb-Client einen Datenbankdump auf dem Host in einer lokalen dump.sql Datei dump.sql , können Sie den folgenden Befehl ausführen:

docker exec -i mariadb bash -c 'mariadb "-p$MARIADB_PASSWORD" ' < dump.sql

Im Algemeinen,

docker exec -i container command < file.stdin

Oder

docker exec -i container command <<EOF
inline-document-from-host-shell-HEREDOC-syntax
EOF

Trennen von einem Container

Wenn Sie an einen laufenden Container mit einem zugewiesenen Pty angeschlossen sind ( docker run -it ... ), können Sie Control P - Control Q drücken, um die Verbindung zu trennen.

Überschreibungsrichtlinie für Bilder überschreiben

docker run --name="test-app" --entrypoint="/bin/bash" example-app

Dieser Befehl überschreibt die ENTRYPOINT Direktive des ENTRYPOINT der example-app wenn die Container test-app ENTRYPOINT erstellt wird. Die CMD Direktive des Bildes bleibt unverändert, sofern nicht anders angegeben:

docker run --name="test-app" --entrypoint="/bin/bash" example-app /app/test.sh

In dem obigen Beispiel wurden sowohl ENTRYPOINT als auch CMD des Images überschrieben. Dieser Containerprozess wird zu /bin/bash /app/test.sh .

Hosteintrag zum Container hinzufügen

docker run --add-host="app-backend:10.15.1.24" awesome-app

Dieser Befehl fügt der Datei /etc/hosts des Containers einen Eintrag hinzu, der dem Format --add-host <name>:<address> folgt. In diesem Beispiel wird der Name app-backend in 10.15.1.24 . Dies ist besonders nützlich, wenn Sie verschiedene App-Komponenten programmatisch miteinander verbinden möchten.

Verhindern, dass der Container angehalten wird, wenn keine Befehle ausgeführt werden

Ein Container wird angehalten, wenn im Vordergrund kein Befehl ausgeführt wird. Wenn Sie die Option -t wird der Container nicht angehalten, selbst wenn die Option -d .

docker run -t -d debian bash

Einen Container anhalten

docker stop mynginx

Darüber hinaus kann die Container-ID auch verwendet werden, um den Container anstelle seines Namens zu stoppen.

Dadurch wird ein laufender Container angehalten, indem das SIGTERM-Signal und ggf. das SIGKILL-Signal gesendet werden.

Außerdem kann mit dem Befehl kill sofort ein SIGKILL oder ein anderes angegebenes Signal mit der Option -s gesendet werden.

docker kill mynginx

Angegebenes Signal:

docker kill -s SIGINT mynginx

Das Stoppen eines Containers löscht ihn nicht. Verwenden Sie das docker ps -a , um den angehaltenen Container docker ps -a .

Führen Sie einen anderen Befehl für einen laufenden Container aus

Bei Bedarf können Sie Docker anweisen, zusätzliche Befehle für einen bereits ausgeführten Container mit dem Befehl exec auszuführen. Sie benötigen die Container-ID, die Sie mit dem docker ps .

docker exec 294fbc4c24b3 echo "Hello World"

Sie können eine interaktive Shell anhängen, wenn Sie die Option -it .

docker exec -it 294fbc4c24b3 bash

GUI-Apps in einem Linux-Container ausführen

Standardmäßig kann ein Docker-Container keine GUI-Anwendung ausführen .

Zuvor muss der X11-Socket zuerst an den Container weitergeleitet werden, damit er direkt verwendet werden kann. Die Umgebungsvariable DISPLAY muss ebenfalls weitergeleitet werden:

docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY <image-name>

Dies wird zunächst fehlschlagen, da wir keine Berechtigungen für den X-Server-Host festgelegt haben:

cannot connect to X server unix:0

Der schnellste (aber nicht sicherste) Weg ist der direkte Zugriff mit:

xhost +local:root

Nach dem Beenden des Containers können wir mit folgenden Schritten in den ursprünglichen Zustand zurückkehren:

xhost -local:root

Eine andere (sicherere) Methode ist die Vorbereitung einer Dockerfile, mit der ein neues Image erstellt wird, das die Anmeldeinformationen unserer Benutzer für den Zugriff auf den X-Server verwendet:

FROM <iamge-name>
MAINTAINER <you>

# Arguments picked from the command line!
ARG user
ARG uid
ARG gid

#Add new user with our credentials
ENV USERNAME ${user}
RUN useradd -m $USERNAME && \
        echo "$USERNAME:$USERNAME" | chpasswd && \
        usermod --shell /bin/bash $USERNAME && \
        usermod  --uid ${uid} $USERNAME && \
        groupmod --gid ${gid} $USERNAME

USER ${user}

WORKDIR /home/${user}

Beim Aufruf des docker build Builds über die Befehlszeile müssen die ARG- Variablen übergeben werden, die in der Docker-Datei angezeigt werden:

docker build --build-arg user=$USER --build-arg uid=$(id -u) --build-arg gid=$(id -g) -t <new-image-with-X11-enabled-name> -f <Dockerfile-for-X11> .

Bevor wir einen neuen Container erzeugen, müssen wir eine Xauth-Datei mit Zugriffsberechtigung erstellen:

xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f /tmp/.docker.xauth nmerge -

Diese Datei muss beim Erstellen / Ausführen in den Container gemountet werden:

docker run -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /tmp/.docker.xauth:/tmp/.docker.xauth:rw -e XAUTHORITY=/tmp/.docker.xauth


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow