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 |
Daemoniser le container, avec l’otpion -d
:
# docker run -d debian |
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> |
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> |
Autres commandes pour les containers
Lancer un nouveau container (Run a command in a new container cf manual) :
# docker run debian |
Créer un container :
# docker create --tty --interactive --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é |
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 |
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> |
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) |
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 |
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 |
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 |
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 // ? |
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 |
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. |
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 |
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)**