Docker – 1. bien débuter : les commandes essentielles

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.

hub de docker

Et celle qui m’intéresse c’est l’image ubuntu-xfce-vnc.

image vnc dans le hub de docker

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.

exemple de Tag sur le hub de docker

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

3 thoughts on “Docker – 1. bien débuter : les commandes essentielles

  1. Bonjour, ton blogue est très réussi! Je te dis bravo! C’est du beau boulot! 🙂
    Ailsun Silvio Oscar

  2. 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.

Comments are closed.