Docker est un logiciel libre de containérisation. Il permet de manipuler des conteneurs de logiciels. Avec Docker un conteneur est un système léger individuel permettant de faire tourner un logiciel, qui fournit un service. Il est donc particulièrement utilisé dans des contextes de serveurs ou de cloud.
Cette pratique se rapproche donc de la virtualisation (en isolant les éléments les uns des autres), mais apporte beaucoup plus de souplesse et de légèreté (seul le noyau natif de l'hôte est utilisé). L'idée est d'isoler les services les uns des autres, ce qui apporte en sécurité et en souplesse, en permettant de les manipuler indépendamment.
Docker fonctionne sur n'importe quel système Linux, ainsi que sur Mac OS ou Windows (grâce à WSL2).
L'intérêt principal de docker est de permettre de déployer des services simplement (quelques fichiers textes et lignes de commande), indépendamment du système utilisés. Cela permet par ex. de déployer un environnement de développement ou de production en quelques minutes sur n'importe quelle machine.
Docker fournit aussi Docker Hub, un dépôt central d'images à partir duquel on peut télécharger et partager des applications sans avoir à réinventer la roue. Il s'agit souvent d'images officielles fournies par les développeurs des applications. En ce sens, Docker se rapproche de techniques de mise en paquet et de distribution de logiciels tels que Snap et Flatpak.
podamn
reste très similaire à docker
(au point que la documentation conseille de créer un alias de docker
vers podman
), mais résout en particulier des problèmes de sécurité liés à Docker (escalade de privilège de l'utilisateur qui lance les conteneurs).
Docker introduit la notion d'image, qui va servir de modèle de base depuis lequel sera instancié chaque conteneur.
On peut créer ses propres images avec un fichier Dockerfile
, ce qui revient à créer une instance Linux minimale sur laquelle on va installer et configurer les logiciels de son choix. On passe d'un Dockerfile
à une image grâce à la commande build
. Cependant on part la plupart du temps d'une image créée par quelqu'un d'autre et rendue disponible sur le dépôt Docker Hub. Le fichier Dockerfile
peut alors aussi permettre de modifier ou d'ajouter des choses à une image existante.
Quand on lance une image on créé un container, dans lequel les données ne sont pas persistées : il sera réinitialisé à chaque lancement.
Pour conserver des données on peut utiliser des volumes (une autre notion Docker), ou monter des répertoires de l'hôte dans le container.
Les paramètres peuvent être gérés par des fichiers externes (qu'on peut au choix copier dans l'image ou monter dans le container) ou par des arguments de la ligne de commandes (avec laquelle on lance le container). On peut utiliser Docker Compose pour se simplifier la ligne de commande, et entrer ainsi dans la pratique du devops en utilisant des fichiers pour décrire des environnements.
Docker s'utilise en principe en ligne de commande (il existe cependant des outils comme Portainer pour gérer ses conteneurs graphiquement). Étant donné le nombre de paramètres de configuration nécessaires à l'utilisation de certains conteneurs, cette manière de fonctionner n'est pas toujours pratique et donne des lignes de commande excessivement longues.
Docker Compose est une extension de docker qui permet de déclarer ses conteneurs ainsi que tous leurs paramètres dans des fichiers de configuration (au format YAML). Cette manière de faire étant très pratique et courante, c'est celle que nous documenterons en particulier ici.
Pour installer Docker il suffit d'installer le paquet docker.io. Docker Compose est quant à lui disponible via le paquet docker-compose :
sudo apt install docker.io docker-compose
Il existe 2 versions de Docker : Docker CE (Community Edition) et Docker EE (Enterprise Edition). La version CE est gratuite et open-source, et correspond à la version packagée par défaut dans les dépôts Ubuntu, mais en version plus récente. C'est donc l'installation de cette version qui est décrite ci-après, et qui utilise le dépôt officiel mis à disposition par le site Docker. (page d'origine en anglais : https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce)
Mettre à jour APT :
$ sudo apt-get update
Installer les paquets permettant à APT d'utiliser un serveur HTTPS de dépôt :
$ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
Puis ajouter la clé GPG du site de Docker :
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Vérifiez que vous avez bien installé cette clé en comparant avec les 8 derniers caractères de l'empreinte ci-dessous : 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 Pour cela, taper :
$ sudo apt-key fingerprint 0EBFCD88 pub 4096R/0EBFCD88 2017-02-22 Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid Docker Release (CE deb) <docker@docker.com> sub 4096R/F273FCD8 2017-02-22
Pointer vers le dépôt de la version "stable" de Docker CE :
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
Mettre à jour l'index APT :
$ sudo apt-get update
Installer la dernière version de Docker CE :
$ sudo apt-get install docker-ce
Le script est à télécharger depuis le site officiel de Docker.
- Télécharger le script et executer le script
wget https://get.docker.com/ -O script.sh chmod +x script.sh ./script.sh
(testé avec succès sur Ubuntu 16.04 64Bits)
deb http://get.docker.io/ubuntu docker main
Dans un environnement privé, vous pouvez éventuellement ajouter votre utilisateur au groupe docker afin de manipuler les containers sans avoir à utiliser sudo systématiquement :
sudo usermod -aG docker $USER
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.
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
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)
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
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 .
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).
date cat /etc/timezone
sudo docker attach CONTENEUR date cat /etc/timezone
ou :
docker exec CONTENEUR bash -c "date ; cat /etc/timezone"
sudo docker attach CONTENEUR sudo dpkg-reconfigure tzdata
( se détacher du conteneur : CTRL-p CTRL-q )
docker run -e TZ=Europe/Amsterdam debian:jessie date
ENV TZ Europe/Amsterdam
ou encore :
ENV TZ=America/Los_Angeles RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
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.