Introduction aux containers Docker

Docker est un logiciel open source qui permet d’automatiser le déploiement d’applications en les empaquetant, ainsi que ses dépendances dans des containers virtuels. La force de ce concept est que ses containers peuvent ensuite être déployé sur n’importe plateforme où peut être installer l’API de Docker. .

docker logo

Le Concept

Docker s’appuie à la base sur le format de conteneur Linux standard LXC auquel il a adossé une API qui permet d’exécuter des processus de manière isolée. En effet, contrairement aux machines virtuelles classiques qui utilisent un système hôte (“guest OS”), les conteneurs Docker ne contiennent que les applications/librairies en utilisant le système d’exploitation de l’infra.

La figure ci-dessous résume bien le concept:

Comme c’est le système hôte qui lance directement les conteneurs son exécution est aussi rapide que si il s’exècutait directement sur celui-ci. De plus même si nous ne sommes pas sur une machine virtuelle les ressources utilisé par le container sont isolés de son hôte. Un container Docker, un dockerfile, est un simple fichier texte qui définit une séquence de commandes UNIX. Ces commandes vont s’exécuter les unes après les autres permettant pour finaliser l’installation d’une application. On retrouve le principe d’héritage car un conteneur peut en utiliser un autre pour en étendre ses fonctionnalités. Du coup les conteneurs sont très léger et peuvent être stocké sur un repository central pour être utilisé par d’autres instance docker.

Disponibilité de Docker

Docker est disponible sur les plateformes suivantes :

  • Les distributions Linux : Ubuntu, Fedora, RHEL, Centos, Gentoo, ArchLinux, openSUSE, CRUX,…
  • Les système de cloud : Amazon EC2, Google Compute Engine et Rackspace.
  • Les systèmes d’exploitations Mac Os X et Windows. Sous Windows Docker s’appuie sur une mini VM Linux tournant sous VirtualBox packagé dans le produit Docker ToolBox.

Installation de Docker sur Ubuntu

Docker est disponible sur toutes les versions disponibles d’Ubuntu et ce depuis la version 12.04 L.T.S. Ici je ne documenterai que l’installation sur Ubuntu 18.04. Pour les autres versions je vous renvoi sur la page du projet : docs.docker.com

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get install docker-ce docker-ce-cli containerd.io

Pour terminer l’installation :

Pour vérifier que l’installation de Docker est terminé lançons simplement les commandes suivantes :

sudo groupadd docker
sudo usermod -aG docker $USER

Test du premier container :

docker run hello-world

Normalement cette commande va télécharger tout ce qu’il faut pour créer un container.

Premières commandes

Dans un premier temps on va construire une simple image Docker en utilisant la dernière image Alpine disponible.

docker search alpine

La première image est la bonne, l’officielle.

NAME                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
alpine                                 A minimal Docker image based on Alpine Linux…   5692                [OK]

Pour télécharger l’image en local il suffit de faire :

docker pull alpine

Vous remarquerez qu’il récupère la dernière version disponible qu’il appelle latest. Chaque image possède un identifiant auquel peux être adjoint des tags, latest étant la dernière version stable d’alpine. Mais si dans nos fichiers de déclarations nous indiquons latest nous ne contrôlerons plus la version utilisé pour construire notre container. Pour récupérer la liste de tous les tags d’une image officielle il suffit de taper la commande suivante :

curl -L -s ’https://registry.hub.docker.com/v2/repositories/library/alpine/tags?page_size=1024’|jq ’."results"[]["name"]’

"edge"
"20190925"
"latest"
"3.10.2"
"3.10"
"3"
"3.8.4"
...

La on voit que la dernière version disponible est la 3.10.2 donc pour la récupérer il suffit de lancer la commande suivante :

docker pull alpine:3.10.2

Pour lister les images en local :

docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
alpine                            3.10.2              961769676411        5 weeks ago         5.58MB
alpine                            latest              961769676411        5 weeks ago         5.58MB

vous remarquerez que l’image ID est identique car docker ne duplique pas les données.

Construction d’une simple image

Pour construire une image on utilise le format Dockerfile

vi Dockerfile

On y colle le contenu suivant :

FROM alpine:3.10.2
RUN apk update
RUN apk upgrade

Pour lancer la construction de l’image :

docker build .

ou

docker builf -f Dokerfile .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM alpine:3.10.2
 ---> 961769676411
Step 2/3 : RUN apk update
 ---> Running in ff0b9c41c6e5
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
v3.10.2-80-g68e4e4a13a [http://dl-cdn.alpinelinux.org/alpine/v3.10/main]
v3.10.2-83-g64319a6606 [http://dl-cdn.alpinelinux.org/alpine/v3.10/community]
OK: 10336 distinct packages available
Removing intermediate container ff0b9c41c6e5
 ---> 497b57586909
Step 3/3 : RUN apk upgrade
 ---> Running in 874225a869dd
(1/2) Upgrading libcrypto1.1 (1.1.1c-r0 -> 1.1.1d-r0)
(2/2) Upgrading libssl1.1 (1.1.1c-r0 -> 1.1.1d-r0)
OK: 6 MiB in 14 packages
Removing intermediate container 874225a869dd
 ---> 9c5a9a6e761f
Successfully built 9c5a9a6e761f

On voit qu’il réalise les opérations demandées et que pour chaque instruction du fichier Dockerfile il indique à partir de quel image ID il réalise la commande demandée.

  • FROM alpine : 961769676411 qui correspond à celui de l’image téléchargée précédemment.
  • RUN apk update : ff0b9c41c6e5
  • RUN apk upgrade : 874225a869dd
  • Successfully built : 9c5a9a6e761f

Info importante docker par défaut détruit les conteneurs intermédiaires. Donc si on lance la commande docker images on doit obtenir ce ID dans la liste retournée :

REPOSITORY TAG IMAGE ID CREATED SIZE 9c5a9a6e761f 5 minutes ago 10.2MB

On voit que cette image n’a pas de TAG. Pour tagger une image lors de la construction il suffit d’ajouter l’option -t tag:xxx

docker build . -t test:0.1
...
docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
test                              0.1                 9c5a9a6e761f        7 minutes ago       10.2MB

Pour tagger une image existante il suffit de taper la commande suivante

docker tag 9c5a9a6e761f test:latest

REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
test                              0.1                 9c5a9a6e761f        9 minutes ago       10.2MB
test                              latest              9c5a9a6e761f        9 minutes ago       10.2MB

Comme on s’y attendait on retrouve bien le même ID pour les images 0.1 et latest.

Plus d’infos : docker.com


Alimenter un blog comme celui-ci est aussi passionnant que chronophage. En passant votre prochaine commande (n'importe quel autre article) au travers des liens produits ci-contre, je touche une petite commission sans que cela ne vous coûte plus cher. Cela ne me permet pas de gagner ma vie, mais de couvrir les frais inhérents au fonctionnement du site. Merci donc à vous!

comments powered by Disqus