Docker
Esecuzione di contenitori
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