Démarrer avec les conteneurs Docker
Publié le : 11 août 2019 | Mis à jour le : 1 mars 2023Docker est un logiciel open source qui permet d’automatiser le déploiement d’applications en les empaquetant, ainsi que ses dépendances dans des conteneurs virtuels. La force de ce concept est que ses conteneurs peuvent ensuite être déployés sur n’importe plateforme où peut être installé l’API de Docker.
Table des matières
Quel est l’intérêt de Docker ?
Docker permet non seulement d’exécuter des conteneurs, mais aussi de simplifier leur conception, la gestion des images…,
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 s’il s’exécutait directement sur celui-ci. De plus même si nous ne sommes pas sur une machine virtuelle les ressources utilisées par le conteneur sont isolés de son hôte. Un conteneur 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égers et peuvent être stocké sur un repository central pour être utilisé par d’autres instances docker.
Disponibilité de Docker
Docker est disponible sur les plateformes suivantes :
- Les distributions Linux : Ubuntu, Fedora, RHEL, Centos, Gentoo, ArchLinux, openSUSE, CRUX,…
- Les systèmes 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 renvoie 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 conteneur :
docker run hello-world
Normalement cette commande va télécharger tout ce qu’il faut pour créer un conteneur.
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ée pour construire notre conteneur. 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'| jq '."results"[]["name"]'
"latest"
"edge"
"3.16.2"
"3.16"
"3.15.6"
"3.15"
"3.14.8"
"3.14"
"3.13.12"
"3.13"
Là, 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 quelle 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 taguer 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 taguer 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
.
Si vous voulez plus loin, je vous propose toute une série de billets sur le sujet :
- Analyse des problèmes de sécurité de Docker
- Quelques règles d’installation de Docker pour renforcer son fonctionnement
- Comment ne pas intégrer de secrets dans vos containers
- Construire des images Docker avec Ansible
- Protéger ses secrets dans Docker
- Tester ses images Docker avec conteneur-structure-test
- Faire du reverse Engineering sur des images du Docker Hub
- Sécuriser l’installation de Docker
- Utiliser Ansible pour piloter Docker
- Utiliser Docker sur Windows
- Django - Lancer des tests unitaires avec Docker
- Utiliser la conteneur Registry de Gitlab
- Optimisation de la taille des images Docker
- Scanner vos images Docker à la recherche de vulnérabilités
- Builder des images avec Buildkit sur Podman
- Builder des images à destination de plusieurs archis en une commande
- Optimiser le temps de build des images python