Docker Commandes générales

Quelques commandes basiques pour utiliser Docker.

Les commandes propres aux images

Rechercher une image en ligne (Ici on cherche Debian avec au moins une validation de 50 étoiles) :

# docker search --filter=stars=50 debian

Récupérer une image, ici celle de Debian :

# docker pull debian

Lister les images présentes sur le serveur :

# docker images

Supprimer les images :

# docker rmi <name OR ID>

Supprimer les images utilisées par des containers :

# docker rmi --force <name OR ID>

Supprime toutes les images (l’option -q indique l’ID) :

# docker rmi $(docker images -q)

Archiver une image :

# docker save -o /my/save/path/save01.tar <name OR ID>

Historique des commandes faites sur une image

# docker history <name OR ID>

Connaître tous les détails d’une image :

# docker inspect <name OR ID>

Renommer une image. L’ancienne image sera conservée et une nouvelle apparaîtra, rien n’empêche de supprimer l’ancienne, les noms des images sont en minuscules sans accent, acceptent les chiffres et les caractères ., _, - du moment que ces derniers ne soient ni à la fin, ni au début.

# docker tag <name OR ID> nouveau.nom

Exporter une image vers un dossier (On peut exporter cette nouvelle image pour la déplacer vers un autre serveur par exemple, ou faire des tests dans un environnement de développement). Cette commande va créer un fichier .tar :

# docker save -o <chemin> <id ou nom de l'image>

Importer une image. Une fois l’image copiée vers la nouvelle machine, il faut la charger dans dDocker pour l’utiliser.

# docker load -i <image exportée>.tar

Les commandes propres aux containers

La commande run (précisions)

Lancer un nouveau container (Run a command in a new container cf manual).

La commande run permet de lancer un conteneur à partir d’une image, ici celle de Debian. L’image est récupérée sur l’hôte local ou directement téléchargée si elle n’y est pas. Une fois le container instancié, Docker exécute à l’intérieur de celui-ci la commande choisie et retourne le résultat. Une fois le résultat de la commande envoyé, le container se termine, sa durée de vie dépend donc du temps de vie des processus exécutés.

# docker run debian
# docker run debian /bin/echo 'Hello World!
# docker run debian ls -l

Nous pouvons directement entrer dans le container grâce aux options -t qui assigne un terminal à l’intérieur du conteneur, et -i qui nous y connecte en récupérant directement l’entrée standard (STDIN). Pour en sortir CTRL+P puis CTRL+Q parfois CTRL+C.

# docker run -it debian /bin/bash
# docker run -it debian

Daemoniser le container, avec l’otpion -d :

#  docker run -d debian
# docker run -dt debian
# docker run -d debian /bin/sh -c "while true; do echo hello world; sleep 1; done"

Lancer le container sur des ports spécifiques. Il s’agit d’un forward des ports de l’hôte vers le container :

# docker run -it -p n1:n1 -p n2:n2 --name <Nom.Du.Container> <ID or Name IMAGE>
# docker run -it -p 80:80 --name container.03.nginx debian.nginx.clean
# docker run -it -p 8181:80 --name container.04.nginx debian.nginx.clean

Lancer un container et lier un volume. La machine hôte et le container partageront le même dossier tools. Sur l’hôte il se situe dans /root/tools, dans le container il se situe dans /home/tools :

# docker run -v /chemin/hôte:/chemin/container -it --name <NomNouveauContainer> <NomImage>
# docker run -v /root/tools:/home/tools -it --name testLier debian

Autres commandes pour les containers

Lancer un nouveau container (Run a command in a new container cf manual) :

# docker run debian
# docker run debian /bin/echo 'Hello World!
# docker run -it debian /bin/bash (ok pour celui ci)

Créer un container :

# docker create --tty --interactive --name="VotreNomInstance" debian
# docker create -it --name="VotreNomInstance" debian

Lancer un container :

# docker start <name OR ID>

Attacher une sortie standard (=entrer dans) à un container déjà lancé :

# docker attach <name OR ID>

Créer et lancer un container en même temps :

# docker start --attach -i <ID or Name> 			//une fois connecté appuyer sur entré
# docker start <ID or Name> && docker attach <ID or Name> //Obligé de la faire en 2 parties

Lancer une commande dans un container déjà lancé (Run a command in a running container). Ici les fichiers se trouve déjà dans les containers.

# docker exec -it <name OR ID> /bin/bash
# docker exec -it <name OR ID> pytnon3 fichier.py

Lister les containers lancés :

# docker ps -a 

Sortir du container sans le stopper :

# CRTL+p CTRL+q

Sortir du container et le stopper :

# exit  (parfois logout)

Supprimer un container. Le -f (force) permet de le supprimer même si il tourne :

# docker rm [-f] <name OR ID>

Supprime tous les containers :

# docker rm -f $(docker ps -a -q)

Mettre un container en pause :

# docker pause <name OR ID>

Mettre un container en dépause :

# docker unpause <name OR ID>

Commit un container (Le commit va créer une nouvelle image à partir de ce container, sorte de save à un instant T) :

# docker commit -a "Auteur" -m "message optionnel" <NAME or ID> <Tag pour l'image>
# docker commit -a "Bojack" -m "sauvegardeLamp" 479cd5744ea8 lampV2

Exporter un container dans une archive :

# docker export -o /root/containerBCK.tar <ID or Name>

Renommer un container :

# docker rename <name OR ID> <New_Name>

Affiche les logs d’un container (L’historique des commandes faites à l’intérieur d’un container). Ça affiche ce qui est envoyé sur stdout dans le conteneur) :

# docker logs <name OR ID>

Voir les différences apportées au container par rapport à son image d’origine :

# docker diff <name OR ID>

Les lettres en début de ligne correspondent à : A -> ajouts, C -> modification, D -> suppressions.

Adresse IP du container :

# ip -4 -o a show eth0 (depuis le container)
# docker inspect --format "{{.NetworkSettings.IPAddress}}" <Name or ID> (depuis l'hôte)

Afficher les ressources utilisées par le conteneur :

# docker stats $(docker ps | awk '{if(NR>1) print $NF}')

Commandes générales

Voir les processus Docker (les containers actifs) :

# docker ps

Retourne tous les containers avec l’option -a (par défaut, Docker ne retourne que les containers qui sont à l’état ‘running’ avec la command ps). L’option -q permet de récupérer juste les identifiants de nos containers :

# docker ps -a -q

Copier un fichier depuis le container vers la machine hôte :

# docker cp <containerId>:/my/file /host/path/target

Copier un fichier depuis l’hôte vers le container :

# docker cp /my/file <containerId>:/my/file/container/path/target

Récupérer l’adresse IP d’un container :

# docker inspect --format "{{.NetworkSettings.IPAddress}}" <Name or ID>

ou si ça ne fonctionne pas, plus simplement :

# docker inspect <Name or ID> | grep IPAddress

L’aide dans Docker

L’aide générale :

# docker -h

L’aide pour une commande spécifique :

# docker <nomCommande> --help

L’aide pour gérer un container Docker :

# docker container --help

Usage: docker container COMMAND

Manage containers

Commands:
attach Attach local standard input, output, and error streams to a running container
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
exec Run a command in a running container
export Export a container's filesystem as a tar archive
inspect Display detailed information on one or more containers
kill Kill one or more running containers
logs Fetch the logs of a container
ls List containers
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
prune Remove all stopped containers
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
run Run a command in a new container
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes

Run 'docker container COMMAND --help' for more information on a command.

Docker et le réseau

Lister les réseaux Docker

Commandes relatives au sous-réseau créer par Docker : voir Doc

Voici ce que vous devriez voir si vous n’avez jamais ajouté de réseau ni initialisé de Docker Swarm.

$ docker network ls
NETWORK ID NAME DRIVER SCOPE
98039f916d36 bridge bridge local
cc8ab50579fd host host local
33e6bcac12a6 none null local

Par défaut les containers Dockers créés communiquent entre eux car ils sont sur le même network. Ils partagent également leur variable d’environnement : voir Doc

À l’origine, le seul moyen de partager les variables d’environnement entre deux conteneurs était de les lier à l’aide de l’indicateur –link. Ce type de partage de variable n’est pas possible avec les réseaux définis par l’utilisateur.

  • Plusieurs conteneurs peuvent monter un fichier ou un répertoire contenant les informations partagées, à l’aide d’un volume Docker.
  • Plusieurs conteneurs peuvent être démarrés ensemble à l’aide de docker-compose et le fichier docker-compose peut définir les variables partagées.
  • Vous pouvez utiliser des services Swarm au lieu de conteneurs autonomes et partager les configurations.

Les conteneurs connectés au même réseau bridge défini par l’utilisateur exposent tous les ports les uns aux autres. Pour qu’un port soit accessible aux conteneurs ou aux hôtes non-Docker sur différents réseaux, ce port doit être publié à l’aide de l’option -p ou –publish.

Le port mapping

Pour plus d’option voir Doc

Mapper le port 80 de Docker sur l’hôte :

# docker run -d -p 80:80 -p 3306:3306 <IMAGE>	

Lister les ports mappés (sur un port spécifique) :

# docker port Name or ID> (n° port)

Exemple :

[root@Stretch:~]# docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES CREATED STATUS
77e8a7051925 simple_app_web "python simple_app.py" 0.0.0.0:5000->5000/tcp simple_app_web_1 2 months ago Up 2 months
5130937e3504 redis:alpine "docker-entrypoint.s…" 6379/tcp simple_app_redis_1 2 months ago Up 2 months
8a3e386ee1ac nginx.v.03 "/bin/bash" 0.0.0.0:8181->80/tcp container.02.autre_nginx 2 months ago Up 2 months
885165689f82 phpmyadmin "/run.sh phpmyadmin" 9000/tcp, 0.0.0.0:8080->80/tcp phpmyadmin.01 3 months ago Up 2 months
072665225d96 mariadb "docker-entrypoint.s…" 3306/tcp mariadb.01 3 months ago Up 2 months
abfe88bd8a91 eecf3f5f9091 "/bin/bash" 0.0.0.0:80->80/tcp container.02.nginx 4 months ago Up 2 months

Notes générales sur l’arrêt des conteneurs

Quand un conteneur est arrêté tout est concervé, ça ne supprime rien, ni les volumes qui vont avec, ni les conteneurs eux-mêmes, ni les réseaux non plus.

Pour “nettoyer” la machine il est parfois nécessaire de faire de temps en temps :

# docker container prune  // ?
# docker network prune // retirer les réseaux qui ne servent plus
# docker image prune // retirer les vieilles images qui ne servent plus

Il est également possible de lancer un conteneur qui “nettoie” derrière lui avec :

# docker run --rm <tes autres paramètres>

Pour supprimer les datas des volumes qui sont situées dans /var/lib/docker. Attention ici ça supprime tout, supprimer les containers au cas par cas si besoin d’en concerver certains. Plus d’infos ici https://dyrk.org/2017/06/12/docker-remettre-a-neuf-votre-installation-docker-supprimer-toutes-les-donnees/.

# systemctl stop docker
# rm -fr /var/lib/docker

Important : faire ensuite systemctl restart docker

Problèmes rencontrés

Lors de la création et du lancement d’un container :

docker: Error response from daemon: driver failed programming external connectivity on endpoint mynginx7 (ee574c2e221658192c2daba66105b3c3ef15d79c7f39f16eac50e7bd55c59342):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8081 -j DNAT --to-destination 172.17.0.6:80 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).

Le service peut être relancé sans modifier le firewall, parfois cela fonctionne.

systemctl restart docker

Si cela ne fonctionne pas essayez de vider les tables et relancez sa configuration du firewal et ensuite relancez le service Docker.

Attention avec le firewal : Bien vérifier que les politiques par défaut sont bien à ACCEPT ACCEPT OUI, ACCEPT ACCEPT avant de lancer la commande ci dessous, sinon vous risquez de rendre le serveur inaccessible.

iptables -t filter -F
iptables -t filter -X

Puis relancer le service. Le service peut être relancé sans modifier le firewall, parfois cela fonctionne.

systemctl restart docker

Documentation

https://docs.docker.com/network/network-tutorial-standalone/#use-the-default-bridge-network
https://docs.docker.com/network/bridge/#differences-between-user-defined-bridges-and-the-default-bridge
https://docs.docker.com/network/links/#connect-using-network-port-mapping
https://dyrk.org/2017/06/12/docker-remettre-a-neuf-votre-installation-docker-supprimer-toutes-les-donnees/

Notes annexes

** Quand on comit un container il devient une image **

** On start + attach un container**

** On run une image et elle se transforme en container (mais problème de lancement)**

> Partager <