Mémo sur les commandes utiles pour Docker.
Informations
Ce mémo évolue au fil de mes besoins.
Les ressources sont multiples. Notamment en provenance de la documentation officielle sur https://docs.docker.com/.
Les autres ressources seront affichées au fur et à mesure.
Concept
L’instance d’une image est un container.
Une image est créée avec la commande build et les instructions présentes dans le fichier « Dockerfile »
Elle produit un container lorsqu’elle est exécutée.
Docker information
Connaitre votre configuration Docker :
1 |
command docker info |
Résultat :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
Containers: 1 Running: 0 Paused: 0 Stopped: 1 Images: 1 Server Version: 17.03.1-ce Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 3 Dirperm1 Supported: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe init version: 949e6fa Security Options: apparmor seccomp Profile: default Kernel Version: 4.8.0-53-generic Operating System: Ubuntu 16.04.2 LTS OSType: linux Architecture: x86_64 CPUs: 4 Total Memory: 7.693 GiB Name: smalltux ID: M3Q6:YT4R:EBNX:FI7L:OOAC:XLQ4:YMV4:KX55:V76B:BTVN:5P2X:GFEM Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ WARNING: No swap limit support Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false |
Télécharger une image Debian
Le site Docker Hub est un annuaire qui contient énormément d’images Docker.
Récupérer la dernière image Debian Stable :
1 |
command docker pull debian |
Utiliser les tags spécifiés sur la page https://hub.docker.com/_/debian/ pour télécharger d’autres images.
Ex avec la version sid :
1 |
command docker pull debian:sid |
Exécuter une image pour vérifier qu’elle fonctionne :
1 |
command docker run -ti debian:latest bash |
ou
1 |
command docker run -ti debian:sid bash |
Résultat :
1 2 3 4 5 |
command docker run -ti debian:latest bash root@5ad9be283549:/# cat /etc/debian_version 8.7 root@5ad9be283549:/# exit |
1 2 3 4 5 |
command docker run -ti debian:sid bash root@1b8e7eea016f:/# cat /etc/debian_version 9.0 root@1b8e7eea016f:/# exit |
Étapes simples pour utiliser un container
- Créer le fichier « Dockerfile » avec les spécifications de l’image
- Créer une image : build
- Démarrer un container (instance de l’image) : run
- Modifier le container
- Enregistrer les modifications du container dans une nouvelle image : commit
Dockerfile
Dans un répertoire donné, créer un fichier « Dockerfile ».
Exemple de contenu le plus simple :
1 |
FROM debian:jessie |
Build
Pour créer une machine basée sur Debian dans un répertoire ./jbnet-test :
1 2 3 4 |
command mkdir jbnet-test command cd jbnet-test command echo "FROM debian:jessie" > Dockerfile command docker build -t jbnet-test . |
Résultat :
1 2 3 4 5 6 7 8 |
Sending build context to Docker daemon 2.048 kB Step 1/1 : FROM debian:jessie jessie: Pulling from library/debian cd0a524342ef: Pull complete Digest: sha256:c3f000ba6bbe71906ca249be92bd04dc3f514d2dd905e0c5f226e8035ee55031 Status: Downloaded newer image for debian:jessie ---> 054abe38b1e6 Successfully built 054abe38b1e6 |
Vérifier que les images jbnet-test et debian (sur laquelle jbnet-test est basée) sont disponibles :
1 |
command docker images -a |
Résultat :
1 2 3 |
REPOSITORY TAG IMAGE ID CREATED SIZE debian jessie 054abe38b1e6 13 days ago 123 MB jbnet-test latest 054abe38b1e6 13 days ago 123 MB |
Liste du ou des container créés :
1 |
command docker container ls -a |
Version dépréciée :
1 |
command docker ps -a |
Résultat : aucun container puis-qu’aucune exécution n’a été encore lancée.
Run
Lancer en mode interactif un container nommé jbnet-container basé sur l’image jbnet-test et exécuter le bash :
1 |
command docker run -ti --name jbnet-container jbnet-test bash |
Utiliser Ctrl+d pour se déconnecter
1 |
command docker container ls -a |
Résultat :
1 2 |
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 010947f73b0b jbnet-test "bash" 5 minutes ago Exited (0) 5 minutes ago jbnet-container |
Si une nouvelle commande de lancement est exécutée, il y aura 2 container dans la liste.
D’où la nécessité de faire du ménage régulièrement avec les commandes dans le paragraphe « Gérer le container et les images ».
Sinon, le disque risque d’être plein rapidement.
Modifier le contenu du conteneur
Ce sont toutes les commandes que je vais exécuter à l’intérieur, comme un « apt update && apt upgrade ».
Commit
Attention, toutes modifications appliquées dans ces container seront supprimées.
Comme pour git, il faut faire un commit pour appliquer les modifications d’un container à une image.
1 |
command docker commit 83988038ac5b jbnet-test |
83988038ac5b : id du container obtenu avec la commande « docker ps -a »
Maintenant il est possible de supprimer tous les container pour faire de la place sans perdre les modifications effectuées.
Comme un « apt update » par exemple
Même exemple avec un tag pour identifier plusieurs images (une sorte de snapshot)
1 |
command docker commit 83988038ac5b jbnet-test:v1 |
1 2 3 4 5 6 |
command docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE jbnet-test v1 ee4010a4d74a 7 seconds ago 184 MB jbnet-test latest 040fa6b1044b 5 minutes ago 174 MB debian jessie 054abe38b1e6 13 days ago 123 MB |
Même exemple en créant une nouvelle image jbnet-test2 :
1 |
command docker commit e5cbcba3dde6 jbnet-test2:v1 |
1 2 3 4 5 6 7 |
command docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE jbnet-test2 v1 54ea5a353fc3 3 seconds ago 184 MB jbnet-test v1 ee4010a4d74a 2 minutes ago 184 MB jbnet-test latest 040fa6b1044b 8 minutes ago 174 MB debian jessie 054abe38b1e6 13 days ago 123 MB |
Gérer les container et images
Liste des images :
1 |
command docker images -a |
Supprimer une image :
1 |
command docker rmi <image_id> |
Supprimer toutes les images :
1 |
command docker rmi $(docker images -q) |
Liste les id des images :
1 |
command docker images -q |
Liste des container actifs :
1 |
command docker container ls |
(anciennement ‘docker ls’)
Liste de tous les container :
1 |
command docker ps -a |
Supprimer un container :
1 |
command docker rm <container_id> |
Supprimer tous les container :
1 |
command docker rm $(docker ps -a -q) |
Appliquer les changements d’un container à une image :
1 |
docker commit container_id image_name |
Réseau
Afficher les réseaux par défaut :
1 |
command docker network ls |
Afficher les paramètres du réseau bridge :
1 |
command docker network inspect bridge |
Par défaut, les container sont sur le même réseau.
Tester l’accès réseau bridge sur un container en exécutant 2 container (debian dans l’exemple) :
1 2 |
command docker run -itd --name=networktest debian command docker run -itd --name=networktest2 debian |
Puis regarder la section « Containers » dans le résultat :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
command docker network inspect bridge [ { "Name": "bridge", "Id": "24198ec9e317da0bb806d6e9426a36137b45d706842dc739265691fd2a38eacd", "Created": "2017-05-08T09:07:03.192377178+02:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ] }, "Internal": false, "Attachable": false, "Containers": { "33146aa71ea54d10d789130a015f552ad81a768851104b6f411d031719463845": { "Name": "networktest2", "EndpointID": "c44d5ba85e6df3dcb62fc6fcb75efc9fd714ab1d01175273f5cb7618dffba94d", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" }, "b34b0f3896ba650739922f2d270016600611d57fb3ff99292ca21140ca4f9103": { "Name": "networktest", "EndpointID": "2ce2243097aa0e8a41e12a71705462821b5699c8426ec702c60c3311c3baeecb", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ] |
Déconnecter le container networktest du réseau bridge :
1 |
command docker network disconnect bridge networktest |
Créer son propre réseau bridge et vérifier sa configuration :
1 2 3 |
command docker network create -d bridge mon_reseau command docker network ls command docker network inspect mon_reseau |
Exécuter un container en utilisant ce réseau :
1 |
command docker run --network=mon_reseau -itd --name=networktest3 debian |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
command docker network inspect mon_reseau [ { "Name": "mon_reseau", "Id": "73702e00f0a7464cd18e470b32309c3b61538f1fc1bc5590b13df6a201631aba", "Created": "2017-05-08T15:37:00.162729809+02:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" } ] }, "Internal": false, "Attachable": false, "Containers": { "eb4c4bd328bfaf7d21474e2fdbda667fa6d305651a7380243a11a1f4f593d037": { "Name": "networktest3", "EndpointID": "e70574fed4a8a8bc02e505052b9746278091cd7d43f75619699b5e6b114781a5", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ] |
Plus d’info : https://docs.docker.com/engine/userguide/networking/#user-defined-networks
Vraiment interressant ce tuto mais manque qu’il faut stoper un container avant de la supprimer. Et cela se fait avec la commande :
docker stop container_name
Merci pour le complément. Je l’ajoute.
En même temps arrêter un container avant de le supprimer, bon ben ça tombe un peu sous le sens. 😉
Et ce c’est pas « docker stop container_name », (qui sera déprécié incessamment sous peu, mais « docker container stop container_name »
Tout comme certaines commandes de ce mémo que je vais modifier asap.
Avez-vous des commandes pour rendre les commande Linux sous docker accessibles car souvent elles ne le sont pas. Il faut changer les permissions.
Bonjour,
Désolé de répondre aussi tardivement, j’espère que vous avez trouvé une solution.
Sinon, il faut ajouter l’utilisateur dans le groupe Docker et se reconnecter.
Bonjour,
Je voudrais savoir s’il est possible de créer une images Dackeravec une application web et sa base de donnée, un peu comme lorsqu’on installer une la pile xampp sur linux et qui génère automatiquement un fichier index ?
Si oui comment ?
Merci et bien à vous.
Bonjour,
Désolé de répondre aussi tardivement, j’espère que vous avez trouvé une solution.
Mais la question m’a l’air assez alambiquée…
Il me faudrait connaitre le but final recherché.
Intéressante cette description, j’ai appris des choses.
Il y a un point qui me chagrine quand même.
Je comprends ici qu’il faut lancer un « docker run » pour exécuter un container.
Mais cette commande créé un nouveau container à chaque fois. C’est lourd et ça oblige à faire le ménage régulièrement.
Et ça ne présente pas d’intérêt s’il n’y a pas de changement de configuration entre chaque exécution.
Il vaut mieux privilégier « docker start » pour exécuter un container déjà existant.
En effet. C’est utile de l’ajouter.
J’avoue que depuis la parution de ce mémo, je n’utilise que docker-compose qui évite ce genre de problème. (Même pour un seul container !)