Recherche…


Syntaxe

  • docker run [OPTIONS] IMAGE [COMMAND] [ARG ...]

Lancer un conteneur

docker run hello-world

Cela va récupérer la dernière image hello-world du Docker Hub (si vous ne l'avez pas déjà fait), créer un nouveau conteneur et l'exécuter. Vous devriez voir un message indiquant que votre installation semble fonctionner correctement.

Exécuter une commande différente dans le conteneur

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

Cette commande dit à Docker de créer un conteneur à partir de l'image docker/whalesay et d'exécuter la commande cowsay 'Hello, StackExchange!' dedans. Il devrait imprimer une image d'une baleine disant Hello, StackExchange! à votre terminal.

Si le point d’entrée de l’image est la valeur par défaut, vous pouvez exécuter toute commande disponible dans l’image:

docker run docker/whalesay ls /

S'il a été modifié lors de la création de l'image, vous devez le restaurer à la valeur par défaut

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

Supprimer automatiquement un conteneur après l'avoir exécuté

Normalement, un conteneur Docker persiste après sa sortie. Cela vous permet d'exécuter à nouveau le conteneur, d'inspecter son système de fichiers, etc. Cependant, vous souhaitez parfois exécuter un conteneur et le supprimer immédiatement après sa fermeture. Par exemple, pour exécuter une commande ou afficher un fichier à partir du système de fichiers. Docker fournit l'option de ligne de commande --rm à cette fin:

docker run --rm ubuntu cat /etc/hosts

Cela créera un conteneur à partir de l'image "ubuntu", affichera le contenu du fichier / etc / hosts et supprimera le conteneur immédiatement après sa fermeture. Cela permet d'éviter d'avoir à nettoyer les conteneurs après avoir fait des expériences.

Remarque: L'indicateur --rm ne fonctionne pas avec l' --detach -d ( --detach ) dans le docker <1.13.0.

Lorsque l' --rm est définie, Docker supprime également les volumes associés au conteneur lorsque le conteneur est supprimé. Ceci est similaire à l'exécution de docker rm -v my-container . Seuls les volumes spécifiés sans nom sont supprimés .

Par exemple, avec docker run -it --rm -v /etc -v logs:/var/log centos /bin/produce_some_logs , le volume de /etc sera supprimé, mais pas le volume de /var/log . Les volumes hérités via --volumes-from seront supprimés avec la même logique - si le volume d'origine a été spécifié avec un nom, il ne sera pas supprimé.

Spécifier un nom

Par défaut, les conteneurs créés avec l' docker run reçoivent un nom aléatoire tel que small_roentgen ou modest_dubinsky . Ces noms ne sont pas particulièrement utiles pour identifier la fonction d'un conteneur. Il est possible de fournir un nom au conteneur en passant l'option de ligne de commande --name :

docker run --name my-ubuntu ubuntu:14.04

Les noms doivent être uniques. Si vous transmettez un nom déjà utilisé par un autre conteneur, Docker imprimera une erreur et aucun nouveau conteneur ne sera créé.

La spécification d'un nom sera utile lors du référencement du conteneur dans un réseau Docker. Cela fonctionne pour les conteneurs Docker d'arrière-plan et de premier plan.

Les conteneurs sur le réseau de pont par défaut doivent être liés pour communiquer par nom.

Liaison d'un port de conteneur à l'hôte

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

Pour utiliser des ports sur l'hôte ont été exposés dans une image (via la directive EXPOSE Dockerfile ou l'option de ligne de commande --expose pour docker run ), ces ports doivent être liés à l'hôte à l'aide de la commande -p ou -P options de ligne. L'utilisation de -p nécessite que le port particulier (et l'interface hôte facultative) soit spécifié. L'utilisation de l'option de ligne de commande majuscule -P force Docker à lier tous les ports exposés de l'image d'un conteneur à l'hôte.

Politique de redémarrage du conteneur (démarrage d'un conteneur au démarrage)

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

Par défaut, Docker ne redémarre pas les conteneurs lorsque le démon Docker redémarre, par exemple après le redémarrage du système hôte. Docker fournit une stratégie de redémarrage pour vos conteneurs en fournissant l'option de ligne de commande --restart . La fourniture de --restart=always provoquera toujours le redémarrage d'un conteneur après le redémarrage du démon Docker. Cependant, lorsque ce conteneur est arrêté manuellement (par exemple, avec docker stop <container> ), la stratégie de redémarrage ne sera pas appliquée au conteneur.

Plusieurs options peuvent être spécifiées pour l'option --restart , en fonction de l'exigence ( --restart=[policy] ). Ces options affectent également le démarrage du conteneur au démarrage.

Politique Résultat
non La valeur par défaut Ne redémarre pas automatiquement le conteneur lorsque le conteneur est arrêté.
en cas d'échec [: max-retries] Redémarrez uniquement si le conteneur se termine par un échec ( non-zero exit status ). Pour éviter de le redémarrer indéfiniment (en cas de problème), il est possible de limiter le nombre de tentatives de redémarrage des tentatives du démon Docker.
toujours Toujours redémarrer le conteneur quel que soit le statut de sortie. Lorsque vous spécifiez always , le démon Docker essaiera de redémarrer le conteneur indéfiniment. Le conteneur démarrera également toujours au démarrage du démon, quel que soit l'état actuel du conteneur.
à moins que arrêté Redémarrez toujours le conteneur quel que soit son état de sortie, mais ne le démarrez pas au démarrage du démon si le conteneur a déjà été mis à l'arrêt.

Exécuter un conteneur en arrière-plan

Pour garder un conteneur en cours d'exécution en arrière-plan, -d option de ligne de commande -d lors du démarrage du conteneur:

docker run -d busybox top

L'option -d exécute le conteneur en mode détaché. C'est aussi équivalent à -d=true .

Un conteneur en mode détaché ne peut pas être supprimé automatiquement lorsqu'il s'arrête, cela signifie que l'on ne peut pas utiliser l'option --rm en combinaison avec l'option -d.

Attribuer un volume à un conteneur

Un volume Docker est un fichier ou un répertoire qui persiste au-delà de la durée de vie du conteneur. Il est possible de monter un fichier hôte ou un répertoire dans un conteneur en tant que volume (en contournant UnionFS).

Ajoutez un volume avec l'option de ligne de commande -v :

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

Cela créera un volume et le montera sur le chemin /data à l'intérieur du conteneur.

  • Remarque: Vous pouvez utiliser le drapeau --rm pour supprimer automatiquement le volume lorsque le conteneur est supprimé.

Montage des répertoires hôtes

Pour monter un fichier ou un répertoire hôte dans un conteneur:

docker run -d -v "/home/foo/data:/data" awesome/app bootstrap.sh
  • Lors de la spécification d'un répertoire hôte, un chemin absolu doit être fourni.

Cela montera le répertoire hôte /home/foo/data sur /data à l'intérieur du conteneur. Ce volume "répertoire hôte monté sur une liaison" est identique à un mount --bind Linux mount --bind et monte donc temporairement le répertoire hôte sur le chemin de conteneur spécifié pendant la durée de vie du conteneur. Les modifications du volume à partir de l'hôte ou du conteneur sont reflétées immédiatement dans l'autre, car elles sont la même destination sur le disque.

UNIX exemple de montage d'un dossier relatif

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

Nommer les volumes

Un volume peut être nommé en fournissant une chaîne au lieu d'un chemin de répertoire hôte, docker créera un volume utilisant ce nom.

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

Après avoir créé un volume nommé, le volume peut être partagé avec d'autres conteneurs utilisant ce nom.

Définition des variables d'environnement

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

Les deux --env -e et --env peuvent être utilisées pour définir des variables d'environnement à l'intérieur d'un conteneur. Il est possible de fournir de nombreuses variables d'environnement en utilisant un fichier texte:

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

Exemple de fichier de variable d'environnement:

# This is a comment
TEST_HOST=10.10.0.127

L' --env-file prend un nom de fichier comme argument et s'attend à ce que chaque ligne soit au format VARIABLE=VALUE , imitant l'argument passé à --env . Les lignes de commentaires ne doivent être précédées que du préfixe # .

Indépendamment de l'ordre de ces trois indicateurs, les --env-file sont traités en premier, puis les indicateurs -e / --env . De cette façon, toutes les variables d'environnement fournies individuellement avec -e ou --env remplaceront les variables fournies dans le fichier texte --env-var .

Spécifier un nom d'hôte

Par défaut, les conteneurs créés avec l'exécution de docker reçoivent un nom d'hôte aléatoire. Vous pouvez donner au conteneur un nom d'hôte différent en passant le drapeau --hostname:

docker run --hostname redbox -d ubuntu:14.04

Exécuter un conteneur de manière interactive

Pour exécuter un conteneur de manière interactive, -it options -it :

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

-i garde STDIN ouvert, alors que -t alloue un pseudo-TTY.

Conteneur en cours d'exécution avec limites de mémoire / swap

Définir la limite de mémoire et désactiver la limite de swap

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

Définissez à la fois la mémoire et la limite de swap. Dans ce cas, le conteneur peut utiliser 300M de mémoire et 700M de swap.

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

Mettre un shell dans un conteneur en cours d'exécution

Connectez-vous à un conteneur en cours d'exécution

Un utilisateur peut entrer un conteneur en cours d'exécution dans un nouveau shell interactif bash avec la commande exec .

Supposons qu'un conteneur s'appelle jovial_morse vous pouvez alors obtenir un shell pseudo-TTY interactif en exécutant:

docker exec -it jovial_morse bash

Se connecter à un conteneur en cours d'exécution avec un utilisateur spécifique

Si vous souhaitez entrer un conteneur en tant qu'utilisateur spécifique, vous pouvez le définir avec le paramètre -u ou --user . Le nom d'utilisateur doit exister dans le conteneur.

-u, --user Nom d'utilisateur ou UID (format: <name|uid>[:<group|gid>] )

Cette commande se connecte à jovial_morse avec l'utilisateur dockeruser

docker exec -it -u dockeruser jovial_morse bash

Connectez-vous à un conteneur en cours d'exécution en tant que root

Si vous voulez vous connecter en tant que root, utilisez simplement le paramètre -u root . L'utilisateur racine existe toujours.

docker exec -it -u root jovial_morse bash

Connectez-vous à une image

Vous pouvez également vous connecter à une image avec la commande run , mais cela nécessite un nom d'image au lieu d'un nom de conteneur.

docker run -it dockerimage bash

Connectez-vous à une image intermédiaire (debug)

Vous pouvez également vous connecter à une image intermédiaire créée lors de la création d'un fichier Dockerfile.

Sortie de 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

Notez le ---> Running in 02071fceb21b , vous pouvez vous connecter à ces images:

docker run -it 02071fceb21b bash

Passer stdin au conteneur

Dans des cas tels que la restauration d'une sauvegarde de base de données ou si vous souhaitez transmettre certaines informations via un canal depuis l'hôte, vous pouvez utiliser l' -i en tant qu'argument pour docker run ou docker exec .

Par exemple, en supposant que vous souhaitiez mettre à la disposition d'un client mariadb conteneurisé un vidage de base de données sur l'hôte, dans un fichier dump.sql local, vous pouvez exécuter la commande suivante:

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

En général,

docker exec -i container command < file.stdin

Ou

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

Détachement d'un conteneur

docker run -it ... vous êtes attaché à un conteneur en cours d'exécution avec un pty assigné ( docker run -it ... ), vous pouvez appuyer sur Control P - Control Q pour le détacher.

Remplacement de la directive sur les points d'entrée d'image

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

Cette commande remplace la directive ENTRYPOINT de l'image example-app lorsque l' test-app conteneur est créée. La directive CMD de l'image restera inchangée sauf indication contraire:

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

Dans l'exemple ci-dessus, les ENTRYPOINT et CMD de l'image ont été remplacés. Ce processus de conteneur devient /bin/bash /app/test.sh .

Ajouter une entrée hôte au conteneur

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

Cette commande ajoute une entrée au fichier /etc/hosts du conteneur, qui suit le format --add-host <name>:<address> . Dans cet exemple, le nom app-backend sera résolu en 10.15.1.24 . Ceci est particulièrement utile pour lier ensemble des composants d'applications disparates par programmation.

Empêcher le conteneur de s'arrêter quand aucune commande n'est en cours d'exécution

Un conteneur s'arrêtera si aucune commande n'est exécutée au premier plan. L'utilisation de l'option -t empêchera le conteneur de s'arrêter, même s'il est détaché avec l'option -d .

docker run -t -d debian bash

Arrêter un conteneur

docker stop mynginx

De plus, l'ID du conteneur peut également être utilisé pour arrêter le conteneur au lieu de son nom.

Cela arrêtera un conteneur en cours d'exécution en envoyant le signal SIGTERM, puis le signal SIGKILL si nécessaire.

De plus, la commande kill peut être utilisée pour envoyer immédiatement un SIGKILL ou tout autre signal spécifié en utilisant l'option -s .

docker kill mynginx

Signal spécifié:

docker kill -s SIGINT mynginx

L'arrêt d'un conteneur ne le supprime pas. Utilisez le docker ps -a pour voir votre conteneur arrêté.

Exécuter une autre commande sur un conteneur en cours d'exécution

Si nécessaire, vous pouvez demander à Docker d'exécuter des commandes supplémentaires sur un conteneur déjà en cours à l'aide de la commande exec . Vous avez besoin de l'ID du conteneur que vous pouvez obtenir avec docker ps .

docker exec 294fbc4c24b3 echo "Hello World"

Vous pouvez attacher un shell interactif si vous utilisez l'option -it .

docker exec -it 294fbc4c24b3 bash

Exécution d'applications GUI dans un conteneur Linux

Par défaut, un conteneur Docker ne pourra pas exécuter une application graphique.

Avant cela, le socket X11 doit être transmis en premier au conteneur, de sorte qu'il puisse être utilisé directement. La variable d'environnement DISPLAY doit également être transmise:

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

Cela échouera au début, car nous n'avons pas défini les autorisations sur l'hôte du serveur X:

cannot connect to X server unix:0

Le moyen le plus rapide (mais pas le plus sûr) est d’autoriser l’accès directement avec:

xhost +local:root

Après avoir fini avec le conteneur, nous pouvons revenir à l’état initial avec:

xhost -local:root

Une autre méthode (plus sûre) consiste à préparer un fichier Dockerfile qui générera une nouvelle image qui utilisera les informations d'identification de notre utilisateur pour accéder au serveur 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}

Lorsque vous appelez docker build partir de la ligne de commande, vous devez transmettre les variables ARG qui apparaissent dans le fichier 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> .

Maintenant, avant de créer un nouveau conteneur, nous devons créer un fichier xauth avec une autorisation d'accès:

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

Ce fichier doit être monté dans le conteneur lors de sa création / exécution:

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow