Docker les bases gérer ses images et ses conteneurs (Article 2)

Salut 😀 second article sur la partie Docker. Dans ce tuto nous verrons qu’est-ce qu’une image et qu’est ce qu’un conteneur. On va voir ensuite comment gérer ses images et ses conteneurs.

1. Qu’est ce qu’une image ? Qu’est ce qu’un conteneur ?

image : une image pourrait s’apparenter au binaire de l’application ce qui va être exécuté(instancier) pour créer le conteneur.

conteneur : un conteneur (voir l’article 1 aussi)pourrait s’apparenter au processus exécuté.

2. Les commandes de bases

Rechercher des images Docker :

Exemple ici je recherche des images Apache (ou plutôt httpd pour l’image officielle) :

root@DockerSAVOIRITLAB:~# docker search apache

On voit que l’image officielle est httpd(entre autres).

Téléchargez une image :

root@DockerSAVOIRITLAB:~# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
f7ec5a41d630: Pull complete 
d1589b6d8645: Pull complete 
83d3755a8d28: Pull complete 
f8459b08e404: Pull complete 
30fabbf5a067: Pull complete 
Digest: sha256:a6e472ad921c93d9fc2cbe2ff07560b9a526c145c4e10faff3aeb28c48cce585
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest

Je peux désormais afficher mes images sur ma machine :

root@DockerSAVOIRITLAB:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
httpd        latest    0b932df43057   2 weeks ago   138MB

On observe que j’ai une image actuellement celle que j’ai télécharger.

Je vais télécharger 3 autres image nginx, cenots et ubuntu:

root@DockerSAVOIRITLAB:~# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
f7ec5a41d630: Already exists 
aa1efa14b3bf: Pull complete 
b78b95af9b17: Pull complete 
c7d6bca2b8dc: Pull complete 
cf16cd8e71e0: Pull complete 
0241c68333ef: Pull complete 
Digest: sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest


root@DockerSAVOIRITLAB:~# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
345e3491a907: Pull complete 
57671312ef6f: Pull complete 
5e9250ddb7d0: Pull complete 
Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

root@DockerSAVOIRITLAB:~# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete 
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

J’aiffiche les images disponibles en locale :

rootroot@DockerSAVOIRITLAB:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ubuntu       latest    7e0aa2d69a15   39 hours ago   72.7MB
nginx        latest    62d49f9bab67   11 days ago    133MB
httpd        latest    0b932df43057   2 weeks ago    138MB
centos       latest    300e315adb2f   4 months ago   209MB

Supprimer une image (ubuntu par exemple ) :

root@DockerSAVOIRITLAB:~# docker rmi ubuntu
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93
Deleted: sha256:7e0aa2d69a153215c790488ed1fcec162015e973e49962d438e18249d16fa9bd
Deleted: sha256:3dd8c8d4fd5b59d543c8f75a67cdfaab30aef5a6d99aea3fe74d8cc69d4e7bf2
Deleted: sha256:8d8dceacec7085abcab1f93ac1128765bc6cf0caac334c821e01546bd96eb741
Deleted: sha256:ccdbb80308cc5ef43b605ac28fac29c6a597f89f5a169bbedbb8dec29c987439

Il ne me reste plus donc que 3 images :

root@DockerSAVOIRITLAB:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    62d49f9bab67   11 days ago    133MB
httpd        latest    0b932df43057   2 weeks ago    138MB
centos       latest    300e315adb2f   4 months ago   209MB

3. Créer et gérer ses conteneurs

Lancer un conteneur :

root@DockerSAVOIRITLAB:~# docker run archlinux
Unable to find image 'archlinux:latest' locally
latest: Pulling from library/archlinux
af673a1a7ea6: Pull complete 
5f5707973f57: Pull complete 
Digest: sha256:8035b19f13374fa96784a7177887d6ef6ea8bec6d2742c1a410c19034438e049
Status: Downloaded newer image for archlinux:latest

Le problème avec cette commande c'est que le conteneur s’exécute puis se stop.

Remarque: Comme je n'ai pas l'image en local il me la télécharge.

Lancer un conteneur à partir d’une image local (en mode détaché pour qu’il ne s’arrête pas):

root@DockerSAVOIRITLAB:~# docker run -d -it centos

-d : détaché
-it : terminal
-i : interactive
-t : tty (terminal)

Afficher les conteneurs en cours d’éxécution :

root@DockerSAVOIRITLAB:~# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
c660c184d5d1   centos    "/bin/bash"   3 seconds ago   Up 2 seconds             romantic_einstein

Voir tous les conteneurs y compris ce qui ne sont pas en cours d’exécution:

root@DockerSAVOIRITLAB:~# docker ps -a
CONTAINER ID   IMAGE       COMMAND           CREATED          STATUS                     PORTS     NAMES
ecb15afa1b49   archlinux   "/usr/bin/bash"   6 minutes ago    Exited (0) 6 minutes ago             priceless_agnesi
c660c184d5d1   centos      "/bin/bash"       17 minutes ago   Up 17 minutes                        romantic_einstein

On voit mon conteneur archlinux qui a le status excited et mon autre conteneur centos qui est up depuis 17 minutes.

S’attacher à un conteneur :

root@DockerSAVOIRITLAB:~# docker attach romantic_einstein
[root@c660c184d5d1 /]# 

Je suis maintenant dans mon conteneur pour en sortir je pourrai faire « exit » mais si je fais cela mon conteneur sera stopper pour éviter cela je vais faire : Ctrl + p q.

Stopper un conteneur :

root@DockerSAVOIRITLAB:~# docker stop romantic_einstein 
romantic_einstein

J’ai stoppé mon conteneur créer à partir de l’image centos on peut voir que je n’ai plus de conteneurs en cours d’exécution :

root@DockerSAVOIRITLAB:~# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
root@DockerSAVOIRITLAB:~#

Start un conteneur


root@DockerSAVOIRITLAB:~# docker start romantic_einstein 
romantic_einstein

root@DockerSAVOIRITLAB:~# docker ps 
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS         PORTS     NAMES
c660c184d5d1   centos    "/bin/bash"   31 minutes ago   Up 9 seconds             romantic_einstein


Supprimer un conteneur :

root@DockerSAVOIRITLAB:~# docker rm priceless_agnesi 
priceless_agnesi

Si j’affiche mes conteneurs il me reste plus qu’un conteneur:

root@DockerSAVOIRITLAB:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS              PORTS     NAMES
c660c184d5d1   centos    "/bin/bash"   32 minutes ago   Up About a minute             romantic_einstein
root@DockerSAVOIRITLAB:~#

Lancer un conteneur en mappant le port http sur celui de l’hôte :

root@DockerSAVOIRITLAB:~# docker run -d -P httpd
54e8556f23678e3991e4d04dbade62a8f9b32b8c0825a0860757f54831c43e43

Pour connaître quel est le port externe sur la machine hôte il suffit de faire :

root@DockerSAVOIRITLAB:~# docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS          PORTS                   NAMES
54e8556f2367   httpd     "httpd-foreground"   59 seconds ago   Up 58 seconds   0.0.0.0:49154->80/tcp   optimistic_haslett
c660c184d5d1   centos    "/bin/bash"          34 minutes ago   Up 3 minutes                            romantic_einstein

Ici c’est le port 49154 de ma machine 192.168.1.204

Connectons nous dessus :

C’est la fin de ce tuto à plus tard pour un prochain article sur Docker 🙂 !

Docker explications et installation sur un machine Debian 10 (Article 1)

Je vais commencer une série sur Docker(pas d’un coup bien sûr 🙂 ) où j’expliquerai ce qu’est Docker et comment l’installer dans un premier article. Et par la suite (dans d’autres articles) j’expliquerai comment l’utiliser.

1. Qu’est ce qu’un conteneur ? Qu’est-ce que Docker ?

Vous connaissez la virtualisation avec des hyperviseurs VMWare, Hyper-V, Proxmox etc… ? Et bien dans la virtualisation vous avez une machine physique avec un OS, par dessus vous avez l’hyperviseurs (parfois même l’hypervieurs et l’OS font partie de la même couche). Au dessus de l’hyperviseur une machine virtuelle à qui nous allons attribuer des ressources hardaware (CPU, RAM etc …). Enfin sur la machine virtuelle vous avez un OS avec dedans une application.

Dans le conteneur, et bien on ne va pas avoir la couche hyperviseur ni la couche VM on va avoir le hardware, l’OS de la machine hôte puis l’applications qui s’exécutera dans un environnement isolé (le conteneur).

Schématisons cela :

Dans la virtualisation, on a la liberté d’installer un OS Windows, Linux ou autre dans une machine virtuelle alors qu’on l’a vue le conteneur n’a pas d’OS mais un environnement d’exécution; il va donc se reposer sur l’OS, c’est à dire le noyau de la machine hôte. Donc concrètement on ne pourra utiliser uniquement des conteneurs ayant le même noyau que l’hôte. C’est à dire des conteneurs Linux.

L’avantage avec la conteneurisation c’est que le conteneur va accéder plus rapidement aux ressources, le déploiement est très rapide même beaucoup plus rapide.

En résumé (ce qui ressort souvent), la virtualisation (avec les hyperviseurs) c’est de la virtualisation matérielle et les conteneurs sont de la virtualisation système.

Et Docker alors ?

Eh bien c’est un des logiciels de conteneurisation open source qui permet justement de gérer des conteneurs Linux.

2. Installer Docker sur Debian 10

Nous allons faire un « apt update » :

root@DockerSAVOIRITLAB:~# apt update

Et nous allons installer les paquets suivants :

root@DockerSAVOIRITLAB:~# apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

On ajoute ensuite la clé GPG :

curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

On ajoute ensuite le repo docker :

root@DockerSAVOIRITLAB:~# echo \
>   "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
>   $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

On update les packages (pour pouvoir installé les nouveaux)car on a rajouté un autre miroir :

root@DockerSAVOIRITLAB:~# apt update

On installe ensuite la community édition de docker :

root@DockerSAVOIRITLAB:~# apt install docker-ce 

On start le service et on l’enable(cette étape n’est pas nécessaire car de base le service est start et actif il me semble) :

root@DockerSAVOIRITLAB:~# systemctl start docker
root@DockerSAVOIRITLAB:~# systemctl enable docker
Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable docker

On va vérifier que tout est fonctionnel. On va d’abord vérifier la version de Docker :

root@DockerSAVOIRITLAB:~# docker version
Client: Docker Engine - Community
 Version:           20.10.5
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        55c4c88
 Built:             Tue Mar  2 20:17:50 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.5
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       363e9a8
  Built:            Tue Mar  2 20:15:47 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.4
  GitCommit:        05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc:
  Version:          1.0.0-rc93
  GitCommit:        12644e614e25b05da6fd08a38ffa0cfe1903fdec
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

On a la version 20.10.15 et surtout on a un docker client et un docker serveur très important pour la suite de l’utilisation de Docker.

Pour vérifier que cela fonctionne bien on va lancer un conteneur :

root@DockerSAVOIRITLAB:~# docker run  hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete 
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Tout fonctionne bien ! On d’ailleurs le message « Hello from Docker!
This message shows that your installation appears to be working correctly.
 » qui nous indique que tout fonctionne correctement.

Docker est installé on va pouvoir passer à la suite et voir comment utiliser Docker dans les prochains tutos.