Ricerca…


Sintassi

  • finestra mobile [OPZIONI] IMMAGINE [COMANDO] [ARG ...]

Esecuzione di un contenitore

docker run hello-world

Questo recupererà l'ultima immagine ciao-mondo dall'Hub Docker (se non lo hai già), crea un nuovo contenitore ed eseguilo. Dovresti vedere un messaggio che informa che l'installazione sembra funzionare correttamente.

Esecuzione di un comando diverso nel contenitore

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

Questo comando dice a Docker di creare un contenitore dall'immagine docker/whalesay ed eseguire il comando cowsay 'Hello, StackExchange!' dentro. Dovrebbe stampare un'immagine di una balena che dice Hello, StackExchange! al tuo terminale.

Se il punto di inserimento nell'immagine è il valore predefinito, puoi eseguire qualsiasi comando disponibile nell'immagine:

docker run docker/whalesay ls /

Se è stato modificato durante la creazione dell'immagine, è necessario ripristinarlo di default

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

Elimina automaticamente un contenitore dopo averlo eseguito

Normalmente, un contenitore Docker persiste dopo che è stato chiuso. Ciò consente di eseguire nuovamente il contenitore, ispezionare il suo filesystem e così via. Tuttavia, a volte si desidera eseguire un contenitore ed eliminarlo immediatamente dopo l'uscita. Ad esempio per eseguire un comando o mostrare un file dal filesystem. Docker fornisce l'opzione della riga di comando --rm per questo scopo:

docker run --rm ubuntu cat /etc/hosts

Questo creerà un contenitore dall'immagine "ubuntu", mostrerà il contenuto del file / etc / hosts e quindi eliminerà il contenitore immediatamente dopo l'uscita. Questo aiuta a evitare di dover ripulire i contenitori dopo aver finito di sperimentare.

Nota: il flag --rm non funziona insieme al flag -d ( --detach ) nella finestra mobile <1.13.0.

Quando viene impostato il flag --rm , Docker rimuove anche i volumi associati al contenitore quando il contenitore viene rimosso. È simile alla docker rm -v my-container in esecuzione. Vengono rimossi solo i volumi specificati senza un nome .

Ad esempio, con la docker run -it --rm -v /etc -v logs:/var/log centos /bin/produce_some_logs , il volume di /etc verrà rimosso, ma il volume di /var/log non lo sarà. I volumi ereditati tramite --volumes-from verranno rimossi con la stessa logica: se il volume originale è stato specificato con un nome, non verrà rimosso.

Specifica di un nome

Per impostazione predefinita, i contenitori creati con la docker run vengono assegnati con un nome casuale come small_roentgen o modest_dubinsky . Questi nomi non sono particolarmente utili per identificare lo scopo di un contenitore. È possibile fornire un nome per il contenitore passando l'opzione della riga di comando --name :

docker run --name my-ubuntu ubuntu:14.04

I nomi devono essere unici; se si passa un nome già utilizzato da un altro contenitore, Docker stamperà un errore e non verrà creato alcun nuovo contenitore.

Specificare un nome sarà utile quando si fa riferimento al contenitore all'interno di una rete Docker. Funziona sia per i contenitori Docker in background che in primo piano.

I contenitori sulla rete bridge predefinita devono essere collegati per comunicare per nome.

Associazione di una porta del contenitore all'host

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

Per poter utilizzare le porte sull'host sono stati esposti in un'immagine (tramite il EXPOSE direttiva Dockerfile, o --expose linea di comando per docker run ), le porte devono essere vincolato all'host utilizzando il -p o -P comando opzioni di linea. L'utilizzo di -p richiede che venga specificata la porta specifica (e l'interfaccia host facoltativa). L'uso dell'opzione della riga di comando maiuscola -P costringe Docker a collegare all'host tutte le porte esposte nell'immagine di un contenitore.

Politica di riavvio del contenitore (avvio di un contenitore all'avvio)

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

Per impostazione predefinita, Docker non riavvia i contenitori quando il daemon Docker viene riavviato, ad esempio dopo il riavvio del sistema host. Docker fornisce una politica di riavvio per i contenitori fornendo l'opzione della riga di comando --restart . Fornendo --restart=always causerà il riavvio di un container dopo il riavvio del daemon Docker. Tuttavia, quando quel container viene fermato manualmente (ad es. Con docker stop <container> ), il criterio di riavvio non verrà applicato al contenitore.

È possibile specificare più opzioni per --restart opzione --restart , in base al requisito ( --restart=[policy] ). Queste opzioni influenzano il modo in cui il contenitore inizia anche all'avvio.

Politica Risultato
no Il valore predefinito Non riavvierà il contenitore automaticamente, quando il contenitore viene fermato.
on-fallimento [: max-tentativi] Riavvia solo se il contenitore esce con un errore ( non-zero exit status ). Per evitare di riavviarlo indefinitamente (in caso di problemi), è possibile limitare il numero di tentativi di riavvio dei tentativi del daemon Docker.
sempre Riavvia sempre il contenitore indipendentemente dallo stato di uscita. Quando si specifica always , il daemon Docker tenterà di riavviare il contenitore indefinitamente. Il contenitore verrà sempre avviato all'avvio del daemon, indipendentemente dallo stato corrente del contenitore.
a meno che non-fermato Riavvia sempre il contenitore indipendentemente dal suo stato di uscita, ma non avviarlo all'avvio del daemon se il contenitore è stato precedentemente messo in stato di arresto.

Esegui un contenitore in background

Per mantenere un contenitore in esecuzione in background, fornire l'opzione della riga di comando -d durante l'avvio del contenitore:

docker run -d busybox top

L'opzione -d esegue il contenitore in modalità indipendente. È anche equivalente a -d=true .

Un contenitore in modalità distaccata non può essere rimosso automaticamente quando si ferma, questo significa che non si può usare l'opzione --rm in combinazione con l'opzione -d.

Assegna un volume a un contenitore

Un volume Docker è un file o una directory che persiste oltre la durata del contenitore. È possibile montare un file o una directory host in un contenitore come volume (ignorando UnionFS).

Aggiungi un volume con l'opzione della riga di comando -v :

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

Questo creerà un volume e lo monterà sul percorso /data all'interno del contenitore.

  • Nota: puoi usare il flag --rm per rimuovere automaticamente il volume quando il contenitore viene rimosso.

Montare le directory host

Per montare un file o una directory host in un contenitore:

docker run -d -v "/home/foo/data:/data" awesome/app bootstrap.sh
  • Quando si specifica una directory host, è necessario fornire un percorso assoluto.

Questo monterà la directory host /home/foo/data su /data all'interno del contenitore. Questo volume "directory host bind-montato" è la stessa cosa di un mount --bind Linux mount --bind e quindi installa temporaneamente la directory host sul percorso contenitore specificato per la durata della vita del contenitore. Le modifiche nel volume dall'host o dal contenitore si riflettono immediatamente nell'altra, poiché sono la stessa destinazione su disco.

Esempio UNIX che monta una cartella relativa

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

Denominare i volumi

Un volume può essere denominato fornendo una stringa anziché un percorso di directory host, la finestra mobile crea un volume utilizzando tale nome.

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

Dopo aver creato un volume con nome, il volume può essere condiviso con altri contenitori usando quel nome.

Impostazione delle variabili di ambiente

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

Sia -e che --env possono essere usati per definire le variabili d'ambiente all'interno di un contenitore. È possibile fornire molte variabili d'ambiente usando un file di testo:

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

Esempio di file delle variabili di ambiente:

# This is a comment
TEST_HOST=10.10.0.127

Il --env-file accetta un nome file come argomento e si aspetta che ogni riga sia nel formato VARIABLE=VALUE , imitando l'argomento passato a --env . Le righe di commento devono essere precedute solo da # .

Indipendentemente dall'ordine di questi tre flag, il --env-file viene elaborato per primo, quindi i flag -e / --env . In questo modo, qualsiasi variabile di ambiente fornita singolarmente con -e o --env sovrascriverà le variabili fornite nel file di testo --env-var .

Specifica di un nome host

Per impostazione predefinita, i contenitori creati con la finestra mobile vengono assegnati con un nome host casuale. Puoi dare al contenitore un nome host diverso passando il flag --hostname:

docker run --hostname redbox -d ubuntu:14.04

Esegui un contenitore in modo interattivo

Per eseguire un contenitore in modo interattivo, passa le opzioni -it :

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

-i mantiene aperto STDIN, mentre -t alloca uno pseudo-TTY.

Contenitore in esecuzione con limiti di memoria / scambio

Imposta limite di memoria e disabilita il limite di swap

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

Imposta sia la memoria che il limite di swap. In questo caso, container può utilizzare 300M di memoria e 700M di swap.

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

Ottenere una shell in un contenitore (distaccato) in esecuzione

Accedere a un contenitore in esecuzione

Un utente può inserire un contenitore in esecuzione in una nuova shell bash interattiva con il comando exec .

Supponiamo che un contenitore sia chiamato jovial_morse quindi è possibile ottenere una bash shell pseudo-TTY interattiva eseguendo:

docker exec -it jovial_morse bash

Accedere a un contenitore in esecuzione con un utente specifico

Se si desidera immettere un contenitore come utente specifico, è possibile impostarlo con il parametro -u o --user . Il nome utente deve esistere nel contenitore.

-u, --user Nome utente o UID (formato: <name|uid>[:<group|gid>] )

Questo comando si jovial_morse a jovial_morse con l'utente dockeruser

docker exec -it -u dockeruser jovial_morse bash

Accedere a un contenitore in esecuzione come root

Se vuoi accedere come root, usa semplicemente il parametro -u root . L'utente root esiste sempre.

docker exec -it -u root jovial_morse bash

Accedi ad un'immagine

Puoi anche accedere a un'immagine con il comando run , ma questo richiede un nome immagine invece di un nome contenitore.

docker run -it dockerimage bash

Accedi ad un'immagine intermedia (debug)

Puoi anche accedere a un'immagine intermedia, creata durante la creazione di un Dockerfile.

Output della docker build . della 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

Si noti che ---> Running in 02071fceb21b nell'output ---> Running in 02071fceb21b , è possibile accedere a queste immagini:

docker run -it 02071fceb21b bash

Passando stdin al contenitore

In casi come il ripristino di un dump del database, o altrimenti che desideri spingere alcune informazioni attraverso una pipe dall'host, è possibile utilizzare il flag -i come argomento per docker run docker exec o docker exec .

Ad esempio, supponendo di voler mettere su un client mariadb containerizzato un dump del database che si ha sull'host, in un file dump.sql locale, è possibile eseguire il seguente comando:

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

In generale,

docker exec -i container command < file.stdin

O

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

Scollegamento da un contenitore

Mentre è collegato a un contenitore in esecuzione con una pty assegnata (funzione docker run -it ... ), è possibile premere Control P - Control Q per staccare.

Sovrascrittura della direttiva del punto di inserimento dell'immagine

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

Questo comando sovrascriverà la direttiva ENTRYPOINT di example-app quando viene creata l' test-app del contenitore. La direttiva CMD dell'immagine rimarrà invariata se non diversamente specificato:

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

Nell'esempio precedente, sia l' ENTRYPOINT che il CMD dell'immagine sono stati sostituiti. Questo processo contenitore diventa /bin/bash /app/test.sh .

Aggiungi la voce host al contenitore

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

Questo comando aggiunge una voce al /etc/hosts del contenitore, che segue il formato --add-host <name>:<address> . In questo esempio, il app-backend nome verrà risolto in 10.15.1.24 . Ciò è particolarmente utile per legare insieme componenti di applicazioni diverse tra loro.

Impedisci il blocco del contenitore quando non ci sono comandi in esecuzione

Un contenitore si fermerà se nessun comando è in esecuzione in primo piano. L'utilizzo dell'opzione -t impedisce al contenitore di fermarsi, anche quando viene rimosso con l'opzione -d .

docker run -t -d debian bash

Fermare un contenitore

docker stop mynginx

Inoltre, l'id contenitore può anche essere utilizzato per arrestare il contenitore anziché il suo nome.

Questo fermerà un contenitore funzionante inviando il segnale SIGTERM e quindi il segnale SIGKILL se necessario.

Inoltre, il comando kill può essere utilizzato per inviare immediatamente un SIGKILL o qualsiasi altro segnale specificato usando l'opzione -s .

docker kill mynginx

Segnale specificato:

docker kill -s SIGINT mynginx

L'arresto di un contenitore non lo elimina. Usa la docker ps -a per vedere il tuo contenitore fermato.

Esegui un altro comando su un contenitore in esecuzione

Quando richiesto, puoi dire a Docker di eseguire comandi aggiuntivi su un contenitore già in esecuzione usando il comando exec . È necessario l'ID del contenitore che è possibile ottenere con la docker ps .

docker exec 294fbc4c24b3 echo "Hello World"

È possibile allegare una shell interattiva se si utilizza l'opzione -it .

docker exec -it 294fbc4c24b3 bash

Esecuzione di app GUI in un contenitore Linux

Per impostazione predefinita, un contenitore Docker non sarà in grado di eseguire un'applicazione GUI.

Prima di ciò, il socket X11 deve essere prima inoltrato al contenitore, quindi può essere utilizzato direttamente. Anche la variabile d'ambiente DISPLAY deve essere inoltrata:

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

All'inizio questo non funzionerà, dal momento che non abbiamo impostato le autorizzazioni sull'host del server X:

cannot connect to X server unix:0

Il modo più veloce (ma non il più sicuro) è quello di consentire l'accesso direttamente con:

xhost +local:root

Dopo aver terminato con il contenitore, possiamo tornare allo stato originale con:

xhost -local:root

Un altro (più sicuro) modo è quello di preparare un Dockerfile che costruirà una nuova immagine che utilizzerà le credenziali dell'utente per accedere al server X:

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}

Quando si richiama la docker build dalla riga di comando, dobbiamo passare le variabili ARG che appaiono nel file Docker:

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> .

Ora, prima di generare un nuovo contenitore, dobbiamo creare un file xauth con autorizzazione di accesso:

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

Questo file deve essere montato nel contenitore durante la sua creazione / esecuzione:

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow