Table des matières

, , ,

docker

Docker est un logiciel libre (sous licence Apache 2.0) à mi-chemin entre la virtualisation applicative et l'automatisation. Il permet de manipuler des conteneurs de logiciels. Il isole les processus les uns des autres pour créer une virtualisation de haut niveau.

Dans l'esprit docker: un processus = un conteneur.
Facteur à prendre en compte dans le choix LXC vs DOCKER.

Contrairement aux autres systèmes de (para)virtualisation, Docker n'embarque pas un système d’exploitation invité mais ne s'occupe que de la partie haut niveau. Il utilise le noyau de l'hôte et ne fait fonctionner que le strict nécessaire sur les invités.

Docker permet aussi de partager, télécharger et installer facilement des applications depuis un dépôt d'images, Docker Hub.

Pour mettre en place un serveur LAMP grâce à Docker, n'hésitez pas à consulter ce tutoriel.
À l'heure actuelle, Docker n'est pas compatible avec Windows Subsystem for Linux 1. Pour l'utiliser vous devez convertir votre subsystem en version 2 (wsl.exe --set-version ubuntu 2).

Fonctionnement

Containers

Docker fonctionne en différenciant les containers (qui hébergent chacun un service), de l'hôte, la machine sur laquelle il est installé.

Ces containers sont basés sur des distributions Linux minimalistes (souvent Alpine ou Debian-slim, Ubuntu est aussi disponible), sur lesquelles on passe des commandes, pour installer des logiciels ou les configurer. Cela se fait dans un fichier Dockerfile (qui est donc une liste de commandes, un peu comme un script bash, qui décrit l'image du container).
On peut échanger ce fichier Dockerfile et les images générées sur Docker Hub en particulier, ce qui permet aux éditeurs et développeurs de distribuer leurs applications web.
Ceci permet de télécharger des images pré-construites, qui embarquent donc toutes les dépendances (jusqu'au système) d'une application web ou autre (on trouve aussi des outils en ligne de commande, qui ne sont pas spécifiques aux serveurs). Il suffit d'une ligne de commande pour les récupérer et les exécuter.

La communication entre l'intérieur du container et l'hôte, ou avec un autre container, ajoute donc un niveau de complexité. Les containers sont des bacs à sable, leur contenu est isolé comme derrière un pare-feu global (c'est un principe qu'on retrouve avec Flatpak par exemple, et cela assure une certaine sécurité par design).
Pour utiliser un container on peut faire correspondre un port interne à un port externe, un répertoire interne à un répertoire externe, lui passer les variables d'environnement de son choix, etc. : il faut définir chaque moyen de communication.

Docker Compose

Tout ces paramètres peuvent évidemment rendre la ligne de commande assez longue !
C'est là l'intérêt du fichier docker-compose.yml qui les décrit en YAML, un format particulièrement lisible !

Un seul fichier docker-compose.yml permet de décrire plusieurs containers (pour un serveur LAMP par exemple Apache, PHP-FPM, MariaDB, MailHog, etc.).
Le déploiement d'un environnement complet pour une, voire plusieurs application(s) web peut alors se résumer à la récupération d'un docker-compose.yml (parfois accompagné d'autres fichiers : Dockerfile, fichiers de configuration destinés à être copiés dans le container, etc.) suivie de la commande :

docker compose up

La définition complète de l'environnement pèse ainsi seulement quelques kilooctets, et son partage ou sa migration vers une nouvelle machine sont extrêmement rapides et faciles.

Non-persistance

Un autre niveau de complexité vient du fait que pour permettre ce fonctionnement, tous les containers doivent être réinitialisés à chaque lancement.
Toutes les données devant être persistées, fichiers et bases de données, doivent se trouver ailleurs, généralement sur l'hôte ou dans un volume spécifique.
D'où l'intérêt primordial des correspondances hôte:container (c'est la syntaxe utilisée) décrites au paragraphe précédent. On ne conserve jamais rien d'utile seulement dans un container !

Installation

Vous trouverez des informations en anglais concernant l'installation de Docker sur Ubuntu sur son site officiel.

Dépôts APT Ubuntu

Docker est disponible dans les dépôts officiels d'Ubuntu.
Pour l'installer il suffit donc d'installer le paquet docker.io, et le paquet docker-compose-v2 pour profiter de Docker Compose.

Il existe aussi une version communautaire disponible sur les anciennes versions d'Ubuntu depuis le paquet docker-ce. Cette version est cependant particulièrement ancienne, et aujourd'hui déconseillée.
Si on préfère Podman à Docker, il suffit d'installer à la place les paquets podman et podman-compose.

Dépôts APT Docker

C'est la méthode officiellement recommandée par les développeurs de Docker.1)

Ajouter la clé GPG officielle de Docker :

sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

Ajouter le dépôt aux sources APT :

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update

Installer les paquets docker :

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Snap

Docker est disponible en snap depuis Snapcraft.

On peut simplement installer l'application Docker depuis le centre d'applications (Snap Store), ou installer le paquet docker en ligne de commande :

snap install docker

FIXME Docker Compose est-il inclus ?

Désinstaller les anciennes versions

Les anciennes versions de Docker étaient appelées docker, docker.io (si vous lui préférez la version officielle) ou docker-engine. Si celles-ci sont installées, désinstallez-les :

# pour vérifier ce qui est installé lié à docker :
dpkg -l |grep -E "^ii.+docker"
# puis supprimer
sudo apt autoremove docker.io docker-compose

Le contenu de /var/lib/docker/, y compris les images, les conteneurs, les volumes et les réseaux, sont préservés. Si vous n'avez pas besoin de sauvegarder vos données existantes et que vous souhaitez commencer par une installation propre, reportez-vous à uninstall Docker Engine(en).

Docker Desktop

Il existe aussi Docker Desktop qui inclut beaucoup de chose donc Docker Compose, Kubernetes… et une interface graphique… MAIS la page https://docs.docker.com/desktop/install/linux-install/ (EN) précise bien que sous Linux, cela nécessite une machine virtuelle pour fonctionner, ce qui est un peu dommage… libre à vous !

Pour profiter d'une interface graphique il est probablement bien plus pratique d'utiliser Portainer, lui-même étant distribué en image Docker !

Configuration

Dans un environnement privé, vous pouvez éventuellement ajouter votre utilisateur au groupe docker afin de manipuler les containers sans avoir à utiliser sudo systématiquement :

N'ajoutez pas votre utilisateur au groupe docker sur un serveur accessible publiquement : cette méthode pose un problème de sécurité. Il devient en effet possible d'élever les privilèges de l'utilisateur sans entrer à nouveau de mot de passe. Si vous êtes sur un serveur en production n'entrez pas cette commande et utilisez la commande sudo docker au lieu de docker pour l'ensemble des opérations.
sudo usermod -aG docker $USER
Vous devez fermer et rouvrir votre session pour que les changements prennent effet.

Une fois Docker installé, vous pouvez lancer le service :

sudo service docker start

et vérifier s'il fonctionne correctement (n'oubliez pas le sudo devant la commande docker si vous n'avez pas ajouté votre utilisateur au groupe docker) :

docker run hello-world

À la première exécution, Docker ne doit pas trouver l'image de l'application hello-word en local. Il va alors tenter de télécharger la dernière version. En cas de réussite, il exécute l'application qui affiche une simple page d'explication sur la sortie standard et s'arrête.

Utilisation

Manipulation d’images

Prendre une Debian sur le dépôt officiel de Docker et se connecter dessus :

docker pull debian
docker run -i -t debian /bin/bash

Faire tout ce qu’on veut sur la nouvelle image

root@xxxxxx# …

Et sauvegarder les changements

root@xxxxxx# exit
docker commit xxxxxx le_nom_de_l_image

Supprimer une image :

docker image rm id_ou_nom_de_l_image

ou:

docker rmi id_ou_nom_de_l_image

Manipulation de conteneurs

JOB1=$(docker run -d conteneur)
docker logs $JOB1
docker stop $JOB1

Voir les conteneurs actifs ou les lister tous ou lister id des actifs :

docker container ps
docker container ps -a
docker container ps -q

Supprimer un conteneur ou supprimer tous les conteneurs :

docker container rm $JOB1
docker container rm id_du_conteneur
docker container rm $(docker container ps -a -q)

Manipulation de volumes

Créer un volume

docker volume create le_nom_du_volume

Lister les volumes

docker volume ls

Supprimer un ou plusieurs volumes (-f pour forcer la suppression)

docker volume rm le_nom_du_volume1 le_nom_du_volume2

Supprimer les volumes orphelins vue que avec l'utilisation progressive de docker il y'aura pas mal de volumes orphelins qui prendraient beaucoup d'espace disque

docker volume rm $(docker volume ls -qf dangling=true)

Import, export

Une des grandes forces de Docker est de pouvoir exporter et importer très facilement les images.

Exporter un container en tar.gz :

docker export 419eed6ff306 > nginx.tgz

Importer un tar.gz :

docker import - nginx < nginx.tgz

Automatisation avec un Dockerfile

Le dockerfile est un fichier texte qui inclut une liste d'actions à exécuter pour construire une image.

Par exemple une image simpliste de Apache pourrait ressembler à ça :

# Apache et PHP dans un container
#
# VERSION               0.0.1
#

FROM     debian:wheezy
MAINTAINER Adminrezo "admin@adminrezo.fr"

ENV DEBIAN_FRONTEND noninteractive

# Depots, mises a jour et installs

RUN (apt-get update && apt-get upgrade -y -q && apt-get dist-upgrade -y -q && apt-get -y -q autoclean && apt-get -y -q autoremove)
RUN apt-get install -y -q apache2 libapache2-mod-php5 php5 supervisor
RUN rm /var/www/index.html
ADD index.php /var/www/index.php

# Config de Apache

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2

EXPOSE 80

# Demarrage des services

RUN mkdir -p /var/log/supervisor
ADD apache.conf /etc/supervisor/conf.d/apache.conf

CMD source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND

Construire un conteneur :

docker build -t nom_du_conteneur .

Divers

Date et heure

La date et l'heure du conteneur est basée sur celle du système hôte. Cependant il est possible de constater un écart d'heure entre le système et le conteneur. Ceci est dû au fait que le conteneur peut-être configuré sur un autre fuseau horaire (timezone).

Cette technique ci-dessus n'est pas forcément pertinente/persistante. Préférer ce qui suit :

Désinstallation

Pour supprimer cette application, il suffit de supprimer son paquet. Selon la méthode choisie, la configuration globale de l'application est conservée ou supprimée. Les journaux du système, et les fichiers de préférence des utilisateurs dans leurs dossiers personnels sont toujours conservés.

Voir aussi


Contributeurs : Chacmool, chamblard, krodelabestiole