Je vous présente un tutoriel pour bien débuter avec Docker. Vous allez découvrir les premières commandes essentielles, l’installation de docker, l’utilisation des ports, des volumes et du réseau (network).
Installation de docker
Dans un premier temps je vais installer docker, et je vais l’installer sur une Ubuntu 18.04 LTS et je lance les commandes apt-get pour l’installation de docker. Je vous donne également la commande pour faire une installation manuelle de docker avec curl pour ne pas passer par apt-get et obtenir une version plus récente.
lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.2 LTS Release: 18.04 Codename: bionic apt-get update apt-get install -y linux-image-extra-virtual apt-get install -y docker.io curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh
Je peux regarder quelle est la version de docker.
docker --version Docker version 18.09.2, build 6247962
Je vous montre quelques commandes pour configurer le démarrage de docker. Par défaut à la première installation docker, il est lancé automatiquement (enfin, en utilisant apt-get !).
# Démarrer/Stoper le Service systemctl start docker systemctl stop docker # Activer/Desactiver au Boot systemctl enable docker systemctl disable docker # Status actuel du Service systemctl status docker
Pour activer docker à chaque démarrage de la machine, je l’active, et tout de suite je peux vérifier que c’est bien le cas avec un docker status.
systemctl enable docker systemctl status docker | grep Active Active: active (running) since Sun 2019-04-14 16:43:28 CEST; 26s ago
Installer votre première image docker
Maintenant, je vais pouvoir installer ma première image. Je ne vais pas créer une image, mais la télécharger sur le hub de docker, où chacun peut partager ses propres images, dont des images officielles. Je vais prendre une image de vnc, cela va me permettre de vous montrer la récupération d’une image et l’utilisation des ports dans le prochain paragraphe. Je vais donc sur ce lien https://hub.docker.com et je recherche une image vnc.
Et celle qui m’intéresse c’est l’image ubuntu-xfce-vnc.
Pour récupérer l’image que je viens de trouver, je vais utiliser la commande docker pull, et indiquer simplement le nom de cette image.
docker pull consol/ubuntu-xfce-vnc Using default tag: latest latest: Pulling from consol/ubuntu-xfce-vnc 18d680d61657: Pull complete 0addb6fece63: Pull complete 78e58219b215: Pull complete eb6959a66df2: Pull complete 050ba7f6a6d0: Pull complete 9130ad467993: Pull complete a09a96229be2: Pull complete b45561e4ed47: Pull complete 7cdd56d5c7af: Pull complete 81e1cf2684ce: Pull complete f18e2de6417a: Pull complete cf74f8bb0fce: Pull complete 7619d6de44e8: Pull complete 248abfb784e8: Pull complete 302acf4f5983: Pull complete e6c0012b0c4b: Pull complete 6ee631c3760c: Pull complete 58f14ba63738: Pull complete 3ea050c3cbec: Pull complete Digest: sha256:34825e1b94fa7e438d49b35a3f935927e9cc31c03cbd46ab170586ab4b76d7d2 Status: Downloaded newer image for consol/ubuntu-xfce-vnc:latest
« Using default tag: latest » indique le tag utilisé, ici le dernier. Sur l’onglet Tags sur le hub docker de cette image on peut voir qu’il y a différents tags, on peut donc choisir par exemple une version plus ancienne.
S’il y a un onglet dockerfile (que l’on verra dans un prochain article), vous pourrez vérifier s’il n’y pas de commandes critiques à l’intérieur du code. Toujours faire cette vérification lorsque que l’on télécharge sur internet. Je sais, c’est chronophage mais c’est important de le faire.
Une fois qu’il a fini le téléchargement de l’image, je vais utiliser une nouvelle commande pour voir les images que j’ai en local sur mon serveur. Avec cette commande docker image ls ou plus simplement docker images.
docker images REPOSITORY TAG IMAGE ID CREATED SIZE consol/ubuntu-xfce-vnc latest a86ae35bf09a 5 months ago 1.18GB
Utiliser les ports avec docker
Maintenant je vais créer et lancer un conteneur et cela va me permettre, aussi, de vous montrer l’utilisation des ports.
Pour cela, j’utilise la commande docker run, qui permet de créer et d’exécuter dans la foulée un conteneur. Le -d indique de le lancer en tâche fond, il va me rendre la main en continuant de fonctionner. Ensuite, je vais utiliser les ports. Dans la documentation de cette image, il est indiqué de prendre les ports 5901 et 6901 et le mot passe par défaut est vncpassword. Je vais également lui donner un nom (vnc1) avec --name
, c’est plus sympa de travailler avec un nom que les ID utilisés par défaut, même si ce sont ces ID qui font toujours références. Et pour finir, le nom de l’image que je veux utiliser.
docker run -d -p 5901:5901 -p 6901:6901 --name vnc1 consol/ubuntu-xfce-vnc
Une fois créé et exécuté, je peux faire un docker ps pour afficher les conteneurs encours d’exécution.
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a2eb85ff1dda consol/ubuntu-xfce-vnc "/dockerstartup/vnc_…" 7 minutes ago Up 7 minutes 0.0.0.0:5901->5901/tcp, 0.0.0.0:6901->6901/tcp vnc1
Pour me connecter sur le service vnc que je viens de lancer, j’utilise UltraVNC Viewer, en indiquant les valeurs suivant, l’adresse IP de mon serveur et suivi du port 5901 81.28.96.120:5901
Cette image est en fait une interface graphique xfce avec vnc serveur d’installé, c’est pour cela qu’elle fait plus de 1GB. Je vois même qu’il y a Firefox d’installé également.
Maintenant, je veux un deuxième conteneur en utilisant la même image ubuntu-xfce-vnc. Mais je ne vais pas pouvoir utiliser les mêmes ports, car ils sont déjà pris par le premier conteneur vnc1.
Dans ce cas, j’utilise des ports différents, en faisant un mapping des ports, 5902 vers 5901. Et en lui donnant également un nom différent (vnc2).
Un docker ps va bien m’afficher les deux conteneurs. Et je peux me connecter avec UltraVNC Viewer sur le deuxième service vnc que je viens de lancer en indiquant les valeurs suivant, 81.28.96.120:5902. Et je constate bien, que je peux me connecter sur ces deux services simultanément.
docker run -d -p 5902:5901 -p 6902:6901 --name vnc2 consol/ubuntu-xfce-vnc docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 177f4c9425b9 consol/ubuntu-xfce-vnc "/dockerstartup/vnc_…" About a minute ago Up About a minute 0.0.0.0:5902->5901/tcp, 0.0.0.0:6902->6901/tcp vnc2 a2eb85ff1dda consol/ubuntu-xfce-vnc "/dockerstartup/vnc_…" 7 minutes ago Up 7 minutes 0.0.0.0:5901->5901/tcp, 0.0.0.0:6901->6901/tcp vnc1
Pour arrêter ces deux conteneurs, j’utilise la commande docker stop, en indiquant le nom ou l’ID du conteneur à stopper. Je peux même en indiquer plusieurs sur la même ligne. Un docker ps n’affichera plus ces conteneurs, mais pour afficher les ceux qui existent et qui ne sont pas en cours d’exécution, je lance un docker ps -a.
docker stop vnc1 vnc2 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 177f4c9425b9 consol/ubuntu-xfce-vnc "/dockerstartup/vnc_…" 3 minutes ago Exited (0) 13 seconds ago vnc2 a2eb85ff1dda consol/ubuntu-xfce-vnc "/dockerstartup/vnc_…" 9 minutes ago Exited (0) 13 seconds ago vnc1
Si je veux relancer un conteneur, je fais uniquement un docker start, car le docker run l’a déjà créé. Quand je n’ai plus besoin d’un conteneur, je fais un stop et je le supprime avec un docker rm. Mais si je veux tous les supprimer en même temps, je peux faire une commande dans commande, c’est-à-dire je luis dis de supprimer les conteneurs que la commande docker ps -aq va me lister. L’image principale ubuntu-xfce-vnc existe toujours et me prend 1GB. Comme je n’en ai plus besoin, je vais la supprimer également avec un docker rmi (rm d’une image).
docker start vnc2 docker stop vnc1 vnc2 docker rm vnc1 vnc2 # tout supprimer docker rm $(docker ps -aq) docker rmi consol/ubuntu-xfce-vnc
Je vérifie que je n’ai plus de conteneur et d’image. Et c’est bien le cas.
docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES docker images REPOSITORY TAG IMAGE ID CREATED SIZE
Utiliser une adresse IP statique (network)
Pour vous monter cela, je récupère une image d’un serveur web Apache sur le hub de docker, qui se nomme wity/apache. Cela devrait aller assez vite, car cette image n’est pas très grande.
docker pull wity/apache
Il faut comme information, le nom de l’interface de mon serveur qui gère l’adresse IP 81.28.96.120. Pour cela, j’utilise la commande ip addr show avec un grep pour n’afficher seulement ce qui m’intéresse. Ici, il m’indique ens3 comme interface, mais cela peut être également eth0, ou autre.
Cela va me servir pour créer un réseau avec docker network. Je veux utiliser, ici, le réseau 81.28.111.0/24 pour pouvoir appliquer, par exemple, l’adresse IP 81.28.111.201 à un conteneur. Une fois ce réseau créé, je peux l’afficher avec un docker network ls.
Dans l’ordre, -d indique d’utiliser le device macvlan de docker, le sous-réseau 111.0/24, comme interface parente ens3, et pour finir je lui attribue un nom (net111).
ip addr show | grep 81.28.96.120 inet 81.28.96.120/24 brd 81.28.96.255 scope global ens3 docker network create -d macvlan --subnet=81.28.111.0/24 -o parent=ens3 net111 docker network ls NETWORK ID NAME DRIVER SCOPE bb1c3669174a bridge bridge local 91037e44de45 host host local 6ee4868af6d6 net111 macvlan local 3e13004e2d90 none null local
Ensuite, je vais créer et lancer trois conteneurs avec trois adresses IP différentes, en utilisant le network docker que je viens d’ajouter. En indiquant, cette fois, l’option --net
et --ip
, trois noms différents, et pour finir le nom de l’image wity/apache.
docker run -d --net net111 --ip 81.28.111.201 --name apache201 wity/apache docker run -d --net net111 --ip 81.28.111.202 --name apache202 wity/apache docker run -d --net net111 --ip 81.28.111.203 --name apache203 wity/apache
Je peux maintenant tester dans un navigateur ou en ligne de commande que cela fonctionne bien. Ici, je vais le faire en ligne de commande en utilisant wget. Je constate que cela répond comme attendu (It works !).
wget -q -O - http://81.28.111.201/ It works ! wget -q -O - http://81.28.111.202/ It works ! wget -q -O - http://81.28.111.202/ It works !
Utilisation des volumes avec docker
Toujours en utilisant cette même image wity/apache et le réseau net111, je vous montre l’utilisation des volumes avec docker. Je supprime les trois conteneurs précédents. Et je crée un nouveau conteneur.
Mais cette fois, je ne vais pas faire un docker run tout de suite, comme cela vous allez voir que l’on peut aussi créer un conteneur sans l’exécuter tout de suite. Et seulement après, je le lance avec un docker start. Et je vérifie avec un wget, qu’il fonctionne.
docker create --net net111 --ip 81.28.111.205 -t --name apache205 wity/apache docker start apache205 wget -q -O - http://81.28.111.205/ It works !
Maintenant, je vais exécuter une commande directement dans un conteneur avec un docker exec. Cela va me permettre de lancer des commandes comme si je faisais un chroot dans celui-ci. Je vais lui dire de m’afficher le contenu de l’index.html avec la commande cat. Puis de modifier ce fichier en remplaçant « It works ! » par Bonjour (sans tenir compte du code html) avec la commande echo. En actualisant la page ou avec un wget je vérifie qu’il m’affiche bien Bonjour. Pour sortir de ce chroot, un simple exit suffit.
docker exec -it apache205 sh sh-4.4# cat /srv/www/htdocs/index.html <html><body><h1>It works!</h1></body></html> sh-4.4# echo "Bonjour" > /srv/www/htdocs/index.html sh-4.4# exit wget -q -O - http://81.28.111.205/ Bonjour
Si je fais stop/star du conteneur docker restart apache205, il affiche toujours mon Bonjour. Ok, super !
wget -q -O - http://81.28.111.205/ Bonjour
Maintenant, si je supprime ce conteneur et je le recrée à nouveau. Mon Bonjour n’est plus là, pas bien !
docker stop apache205 && docker rm apache205 docker create --net net111 --ip 81.28.111.205 -t --name apache205 wity/apache docker start apache205 wget -q -O - http://81.28.111.205/ It works !
C’est là, que les volumes avec docker vont me permettre de conserver certaines données dans un dossier spécifique, même si un conteneur est supprimé et réinstallé.
Je vais créer dans le dossier /mnt de mon serveur un nouveau dossier apache205-volume qui va être mappé avec le dossier www d’Apahe du conteneur. Je crée le fichier index.html avec un Bonjour à l’intérieur. Je supprime le conteneur précédent apache205. Et je le recrée toujours en utilisant les mêmes options mais en ajoutant un volume avec l’option -v. Ce volume va mapper le dossier /srv/www/htdocs vers /mnt/apache205-volume. Et du coup, il va bien m’afficher mon Bonjour du fichier /mnt/apache205-volume/index.html, génial non !
mkdir /mnt/apache205-volume echo "Bonjour" > /mnt/apache205-volume/index.html docker stop apache205 && docker rm apache205 docker create -v /mnt/apache205-volume:/srv/www/htdocs --net net111 --ip 81.28.111.205 -t --name apache205 wity/apache docker start apache205 http://81.28.111.205 Bonjour wget -q -O - http://81.28.111.205/ Bonjour
Un condensé des commandes utilisées :
Voilà, on a vu l’installation de docker, l’utilisation des ports, du réseau (network) avec une adresse IP fixe et l’utilisation des volumes. Je vous mets, ci-dessous, un condensé de toutes les commandes.
# Docker - 1. bien débuter : les commandes essentielles # # l'installation, les ports, les volumes et les réseaux (network) # # Je vous présentente un tutoriel pour bien débuter avec Docker. # Vous allez découvrir les premières commandes essentielles, l'installation # l'utilisation des ports, des volumes et du réseaux (network). Install Docker -------------- root@ns1358:~# apt-get install -y linux-image-extra-virtual apt-get install -y docker.io curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh docker --version Docker version 18.09.2, build 6247962 # Démarrer/Stoper le Service systemctl start docker systemctl stop docker # Activer/Desactiver au Boot systemctl enable docker systemctl disable docker # Status actuel du Service systemctl status docker root@ns1081:~# systemctl enable docker systemctl status docker | grep Active Active: active (running) since Sun 2019-04-14 16:43:28 CEST; 26s ago # Port/mapping installer un serveur vnc/ubuntu # -------------------------------------------- # Commande pour installer (récupérer, déployer) une image de container sur sa machine # https://hub.docker.com/ ?vnc # https://hub.docker.com/r/consol/ubuntu-xfce-vnc # Desktop environment Xfce4 or IceWM # VNC-Server (default VNC port 5901) # noVNC - HTML5 VNC client (default http port 6901) # connect via VNC viewer localhost:5901, default password: vncpassword #Tags (13) #nightly 479 MB #Last update: 21 hours ago #dev 468 MB #Last update: 2 months ago #1.4.0 471 MB #Last update: 3 months ago #latest 475 MB docker pull consol/ubuntu-xfce-vnc Using default tag: latest latest: Pulling from consol/ubuntu-xfce-vnc 18d680d61657: Pull complete 0addb6fece63: Pull complete 78e58219b215: Pull complete eb6959a66df2: Pull complete 050ba7f6a6d0: Pull complete 9130ad467993: Pull complete a09a96229be2: Pull complete b45561e4ed47: Pull complete 7cdd56d5c7af: Pull complete 81e1cf2684ce: Pull complete f18e2de6417a: Pull complete cf74f8bb0fce: Pull complete 7619d6de44e8: Pull complete 248abfb784e8: Pull complete 302acf4f5983: Pull complete e6c0012b0c4b: Pull complete 6ee631c3760c: Pull complete 58f14ba63738: Pull complete 3ea050c3cbec: Pull complete Digest: sha256:34825e1b94fa7e438d49b35a3f935927e9cc31c03cbd46ab170586ab4b76d7d2 Status: Downloaded newer image for consol/ubuntu-xfce-vnc:latest docker images REPOSITORY TAG IMAGE ID CREATED SIZE consol/ubuntu-xfce-vnc latest a86ae35bf09a 5 months ago 1.18GB docker run -d -p 5901:5901 -p 6901:6901 --name vnc1 consol/ubuntu-xfce-vnc # vnc:81.28.96.120:5901 docker run -d -p 5902:5901 -p 6902:6901 --name vnc2 consol/ubuntu-xfce-vnc # vnc:81.28.96.120:5902 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 177f4c9425b9 consol/ubuntu-xfce-vnc "/dockerstartup/vnc_…" About a minute ago Up About a minute 0.0.0.0:5902->5901/tcp, 0.0.0.0:6902->6901/tcp vnc2 a2eb85ff1dda consol/ubuntu-xfce-vnc "/dockerstartup/vnc_…" 7 minutes ago Up 7 minutes 0.0.0.0:5901->5901/tcp, 0.0.0.0:6901->6901/tcp vnc1 docker stop vnc1 vnc2 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 177f4c9425b9 consol/ubuntu-xfce-vnc "/dockerstartup/vnc_…" 3 minutes ago Exited (0) 13 seconds ago vnc2 a2eb85ff1dda consol/ubuntu-xfce-vnc "/dockerstartup/vnc_…" 9 minutes ago Exited (0) 13 seconds ago vnc1 docker start vnc1 vnc2 docker stop vnc1 vnc2 docker rm vnc1 vnc2 # tout supprimer docker rm $(docker ps -aq) docker rmi consol/ubuntu-xfce-vnc docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES docker images REPOSITORY TAG IMAGE ID CREATED SIZE # TEST Apache2 static IP # ---------------------- docker pull wity/apache ip addr show | grep 81.28.96.120 inet 81.28.96.120/24 brd 81.28.96.255 scope global ens3 docker network create -d macvlan --subnet=81.28.111.0/24 -o parent=ens3 net111 docker network ls NETWORK ID NAME DRIVER SCOPE bb1c3669174a bridge bridge local 91037e44de45 host host local 6ee4868af6d6 net111 macvlan local 3e13004e2d90 none null local docker run -d --net net111 --ip 81.28.111.201 --name apache201 wity/apache docker run -d --net net111 --ip 81.28.111.202 --name apache202 wity/apache docker run -d --net net111 --ip 81.28.111.203 --name apache203 wity/apache http://81.28.111.201 http://81.28.111.202 http://81.28.111.203 # TEST2 Apache avec volume # ------------------------ docker create --net net111 --ip 81.28.111.205 -t --name apache205 wity/apache docker start apache205 http://81.28.111.205 docker exec -it apache205 sh sh-4.4# cat /srv/www/htdocs/index.html <html><body><h1>It works!</h1></body></html> sh-4.4# echo "Bonjour" > /srv/www/htdocs/index.html sh-4.4# exit http://81.28.111.205 Bonjour docker restart apache205 http://81.28.111.205 Bonjour docker stop apache205 && docker rm apache205 docker create --net net111 --ip 81.28.111.205 -t --name apache205 wity/apache docker start apache205 http://81.28.111.205 It works! docker stop apache205 && docker rm apache205 mkdir /mnt/apache205-volume echo "Bonjour" > /mnt/apache205-volume/index.html docker create -v /mnt/apache205-volume:/srv/www/htdocs --net net111 --ip 81.28.111.205 -t --name apache205 wity/apache docker start apache205 http://81.28.111.205 Bonjour wget -q -O - http://81.28.111.205/ Bonjour
Bonjour, ton blogue est très réussi! Je te dis bravo! C’est du beau boulot! 🙂
Ailsun Silvio Oscar
Bonjour, merci pour le commentaire 😉
Merci pour ton blog il est vraiment super et va me servir à rediger mes propres fiches d’installation et d’utilisation de docker. C’est dommage qu’un travail comme celui ci ne gagne pas plus à être connu.