Docker
Conteneurs de course
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