====== Installer Docker et Docker Compose ======
===== Installer le dépôt Docker =====
* Méthode installation pour Debian : https://docs.docker.com/engine/install/debian/
* Installer le dépôt Docker :
* Mettre à jour les dépôts : ''apt update''
* Installer les paquets suivant : ''apt install ca-certificates curl gnupg''
* Ajouter la clé du dépôt Docker :
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
* Ajouter le fichier apt contenant le dépôt Docker :
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
===== Installer Docker =====
* Installer les paquets nécessaire : ''apt install apt-transport-https gnupg2 software-properties-common''
* Installer Docker : ''apt install docker-ce docker-ce-cli containerd.io''
* Activer le service Docker au démarrage : ''systemctl enable docker''
* Ajouter l'utilisateur //admin// au groupe //docker// : ''usermod -aG docker admin''
* Se connecter sur une console avec l'utilisateur //admin// et tester Docker : ''docker run hello-world''
* Si le message d'erreur ''docker: Got permission denied while trying to connect to the Docker daemon socket'' apparait :
* Essayer de sourcer à nouveau le fichier ''.bashrc'' : ''source ~/.bashrc''
* Essayer de redémarrer la machine pour activer la prise en compte de Docker
* Tester à nouveau le bon fonctionnement de Docker : ''docker run hello-world''
==== Limiter la mémoire et le CPU des containers Docker ====
Afin de pouvoir limiter la consommation de mémoire et de CPU des containers Docker, il est nécessaire de vérifier que le noyau Linux est compilé avec les bonnes options :
Si le noyau est correctement compiler, vous pouvez passer à l'étape suivante :
* Vérifier si la configuration de l'hôte est nécessaire : '' docker info ''
* Si la commande précédente afficher le message suivant il est nécessaire de suivre les étapes suivantes : **WARNING: No swap limit support**
* Éditer le fichier de configuration de Grub et y ajouter/compléter le contenu suivant : '' vi /etc/default/grub ''
GRUB_CMDLINE_LINUX="cdgroup_enable=memory swapaccount=1"
* Valider la prise en compte de la modification précédente avec la commande : '' update-grub ''
* Redémarrer la machine : ''reboot''
* Vérifier que le message **WARNING: No swap limit support** a disparu : '' docker info ''
==== Déplacer le dossier contenant les données de Docker ====
* Par défaut, les données de Docker sont stockées dans un unique dossier : ''/var/lib/docker/''
* Passer en root : ''sudo -i''
* Commencer par arrêter le service : ''systemctl stop docker''
* Vérifier l'arrêt : ''systemctl status docker''
* Vérifier qu'il n'y ait plus de processus Docker : ''ps faux | grep -i docker''
* Créer un fichier ''/etc/docker/daemon.json'' dans lequel vous indiquerez le nouveau dossier : ''vi /etc/docker/daemon.json''
* Contenu du fichier ''/etc/docker/daemon.json'' :
{
"data-root": "/data/docker"
}
* Créer le dossier de destination des données de Docker : ''sudo mkdir /data/docker''
* Copier les données dans le nouveau dossier : ''rsync -avxP /var/lib/docker/ /data/docker''
* Vérifier que les tailles des 2 dossiers correspondent : ''du -hs /var/lib/docker/; du -hs /data/docker''
* Renommer l'ancien dossier : ''mv /var/lib/docker /var/lib/docker.old''
* Redémarrer le service Docker : ''systemctl start docker''
* Vérifier le statut : ''systemctl status docker''
* Accéder aux interfaces web des outils utilisant Docker, si Portainer est installé vérifier le paramètre //Root directory// de l'hôte.
* Si tout est ok, supprimer l'ancien dossier : ''rm -rf /var/lib/docker.old''
===== Installer Docker Compose =====
* Dans les versions récentes de Docker, Compose est directement intégré à la commande ''docker''. Si la commande suivante afficher la version de Compose, inutile de suivre les étapes suivantes : ''docker compose version''
* Installer //docker-compose// v2 : ''apt install docker-compose-plugin''
* Vérifier la version installée : ''%%docker --help |grep compose%%''
* NOTES : supprimer l'ancienne version v1 télécharger manuellement : ''rm -f /usr/local/bin/docker-compose ; rm -f /etc/bash_completion.d/docker-compose''
===== Activer IPv6 pour Docker =====
* Éditer le fichier ///etc/docker/daemon.json// : ''vi /etc/docker/daemon.json''
* Ajouter les paramètres suivant :
{
"ipv6": true,
"fixed-cidr-v6": "c01d:c01a:cafe::/64",
"experimental": true,
"ip6tables": true
}
* Redémarrer Docker : ''systemctl restart docker''
* Vérifier la prise en compte d'IPv6 dans le réseau par défaut : ''docker network inspect bridge|grep EnableIPv6''
* Si vous avez déjà créer votre réseau local Docker (Ex. //nginx-proxy//) :
* éteindre tous les containers via Portainer par exemple.
* supprimer votre réseau : ''docker network rm nginx-proxy''
* [[serveurs:installation:docker#creation_d_un_reseau_local_docker|créer à nouveau le réseau externe (nginx-proxy) avec l'activation d'IPv6]]
* Redémarrer toutes les stacks avec : ''docker compose down; docker compose up -d''
* Si vous utiliser le container [[https://hub.docker.com/r/nginxproxy/nginx-proxy|nginxproxy/nginx-proxy]] activer l'écoute sur les IPv6 en plus d'IPv4:
ports:
- "0.0.0.0:80:80"
- "0.0.0.0:443:443"
- "[::]:80:80"
- "[::]:443:443"
* Vous pouvez vérifier la bonne écoute sur les ports 80 et 443 de l'IPv6 locale avec : ''ss -6ltpn''
* Si vous utiliser [[https://hub.docker.com/r/nginxproxy/docker-gen|nginxproxy/docker-gen]], activer le support d'IPv6 dans le fichier //docker-compose.yml// :
environment:
ENABLE_IPV6: true
* Tester la connectivité IPv6 vers votre site web avec : https://ready.chair6.net/
===== Création d'un réseau local Docker =====
* Créer un réseau local de type bridge "utilisateur" compatible IPv4 et IPv6 avec : '' docker network create --driver=bridge --ipv6 --subnet=172.18.5.0/24 --ip-range=172.18.5.0/24 --subnet a1f:ea75:ca75::/48 --gateway=172.18.5.1 nginx-proxy ''
* Ainsi, depuis un container associé à ce réseau, il est possible d'adresser l'hôte avec l'IP de la gateway, soit : 172.18.5.1
* De limiter les accès sur un outil de l'hôte aux IP des container de ce réseau qui seront créé parmi (--ip-range) : 172.18.5.0/24
===== Activer l'API Docker sur l'instance =====
Voir la [[serveurs:installation:db-srv:docker-api|documentation d'activation de l'API Docker]].
===== Mise à jour de Docker et Docker Compose =====
* La mise à jour se fait via le système de paquet de Debian à l'aide d'Apt.
* Suite à une mise à jour de Docker sur l'instance "db", il est nécessaire de [[serveurs:installation:db-srv:docker-api|mettre à jour le fichier systemd]] s'il n'a pas encore été surchargé.
===== Copier les fichiers docker-compose.yml depuis le dépôt Github sinp--srv =====
Les fichiers //docker-compose.yml// des différents outils de suivi sont hébergés dans un dépôt Github. Il est nécessaire de copier ces fichiers sur les différentes instances afin de pouvoir les installer.
* Les dépôts :
* SINP PACA : https://github.com/cbn-alpin/sinp-paca-srv
* SINP AURA : https://github.com/cbn-alpin/sinp-aura-srv
* Ces depôts contiennent les dossiers de base suivant :
* //bkp-srv// : les fichiers pour l'instance "bkp-srv"
* //db-srv// : les fichiers pour l'instance "db-srv"
* //shared// : les fichiers communs aux différentes instances.
* //web-srv// : les fichiers pour l'instance "web-srv"
* Chacun de ces dossiers de base contient ensuite une arborescence de dossiers comparable à celle du serveur correspondant.
* Les fichiers //docker-compose.yml// sont hébergés par le dossier de l'utilisateur //admin//.
* Pour chaque serveur, synchroniser ces fichiers avec le serveur correspondant en utilisant ''rsync'' :
* Se placer à la racine du dépôt
* Lancer la commande ''rsync'' suivante, ici pour //web-srv// et le dossier ///web-srv/home/admin/docker// avec l'option ''%%--dry-run%%'' (à supprimer quand tout est ok) : rsync -av ./web-srv/home/admin/docker/ admin@web--sinp:/home/admin/docker/ --dry-run
===== Renommer une stack générer via docker-compose =====
Lorsqu'on lancer ''docker-compose up'', Docker-Compose se charge de créer les volumes nommés. Lors de leur création, il utilise le nom du dossier dans lequel se trouve le fichier ''docker-compose.yml''. Ainsi, si l'on change ultérieurement ce nom de dossier, Docker-Compose recréer de nouveaux volumes nommés au prochaine lancement.
Il est donc nécessaire de suivre la procédure suivante pour renommer le dossier d'une stack créé par Docker-Compose :
* Se placer dans le dossier de la stack et arrêter les services : ''docker-compose down''
* Renommer le dossier de la stack. Ex. : ''mv monitor.silene.eu monitor''
* Lister tous les volumes utilisés par la stack via Portainer via le menu "Volumes" puis utiliser le filtre en tapant le premier mot composant le nom du dossier. Ex. : pour le dossier "monitor.silene.eu", taper "monitor". La stack correspondante est nommée "monitorsileneeu".
* Pour chaque volume listé, il est nécessaire de :
* créer un nouveau volume avec le nouveau nom :
docker volume create \
--label com.docker.compose.project= \
--label com.docker.compose.version= \
--label com.docker.compose.volume= \
--name _
* Ex. :
docker volume create \
--label com.docker.compose.project=monitor \
--label com.docker.compose.version=1.24.1 \
--label com.docker.compose.volume=influxdb-storage \
--name monitor_influxdb-storage
* S'assurer via Portainer que le nouveau volume a été créé correctement (nom et labels).
* Copier les données de l'ancien volume vers le nouveau :
docker run --rm -it \
-v _:/from:ro \
-v _:/to \
alpine ash -c "cd /from ; cp -av . /to"
* Ex. :
docker run --rm -it \
-v monitorsileneeu_influxdb-storage:/from:ro \
-v monitor_influxdb-storage:/to \
alpine ash -c "cd /from ; cp -av . /to"
* Se placer dans le nouveau dossier de la stack et lancer les services : ''docker-compose up -d''
* Vérifier que tout fonctionne correctement
===== Déplacer les données (volumes nommés) de Docker d'un serveur à un autre =====
Il est possible de déplacer les volumes nommés d'un serveur à un autre :
* Mettre à jour Docker sur les 2 instances pour avoir la même version installée.
* Arrêter les services utilisant les volumes sur les serveur d'origine : ''docker compose down''
* Si possible arrêter également Docker : ''systemctl stop docker''
* Rechercher les dossiers des volumes nommées concernés dans : ''/var/lib/docker/volumes/''
* Une fois repéré, copier chaque dossier sur le serveur de destination. Il est neccessaire de passer par l'utilisateur //admin// car il n'y a pas d'accès direct à root sur le serveur de destination. Ex. avec le volume nommé //matomo-storage// dans la stack //analytics// : ''rsync -e 'ssh -p ' -avxP analytics_matomo-storage/ admin@bkp-paca-sinp:~/dwl/analytics_matomo-storage/''
* Sur le serveur de destination, déplacer le dossier dans l'emplacement (non standard) des données de docker (sur ''/data/docker/'') : ''mv analytics_matomo-storage /data/docker/volumes/''
* Modifier le propriétaire qui a été défini à //admin// par le propriétaire initial, généralement //root// (vérifier sur le serveur d'origine) : ''chown --from=admin root -R /data/docker/volumes/analytics_matomo-storage ''
* Modifier le DNS pour faire pointer le nom de domaine sur le nouveau serveur.
* Vous pouvez maintenant ré-installer les fichiers Docker Compose sur le nouveau serveur.
* Modifier les éventuels fichiers de configuration ou ''.env'' pour adapter la configuration au nouveau serveur.
* Relancer la stack : ''docker compose up -d''
* Vérifier que tout fonctionne à nouveau.
===== Commandes utiles =====
* Accéder aux logs du service Docker : '' journalctl -x -u docker.service ''
==== Docker ====
* Lancer une image : ''docker run ''
* Lister toutes les images : ''docker image ls -a''
* Supprimer une image : ''docker image rm ''
* Lister tous les containers : ''docker container ls --all''
* Supprimer un container : ''docker container rm ''
* Construire une image à partir d'un fichier //Dockerfile// présent dans le dossier courant : ''docker build -t : .''
* Se connecter à un container : ''docker exec -it /bin/bash''
* Depuis un container (si ''ip'' est installé - paquet //iproute2//), afficher l'IP de l'hôte : ''ip route|awk '/default/ { print $3 }'''
* Informations sur la place occupée par Docker :
* Résumé de la place occupée : docker system df
* Infos détaillées dont la place occupée par chaque volume : docker system df --verbose
* Nettoyage :
* **ATTENTION:** **s'assurer au préalable que tous les containers utiles sont bien actif sur l'hôte !**
* Nettoyer tout (images, containers et réseaux) inactifs : docker system prune
* Nettoyer tout (images, containers et réseaux) et les volumes contenant des données (!!) inactifs : docker system prune --volumes
==== Docker Compose ====
* **Source** : https://opensharing.fr/docker-compose-commandes-utiles
* ** build **:
* Construire ou reconstruire les images des services dont le Dockerfile a été modifié : '' docker-compose build [SERVICE...] ''
* Construire ou reconstruire les images avec les dernières versions des images de base : '' docker-compose build --pull [SERVICE...] ''
* Construire ou reconstruire les images sans utiliser le cache : '' docker-compose build --no-cache ''
* ** config **:
* Vérifier la configuration et la syntaxe du fichier Docker Compose : '' docker-compose config ''
* Lister les services définis dans le fichier Docker Compose : '' docker-compose config --services ''
* Lister les volumes définis dans le fichier Docker Compose : '' docker-compose config --volumes ''
* ** down ** :
* Arrêter les services, supprimer les containers et les réseaux de l’application : '' docker-compose down ''
* Arrêter les services, supprimer les containers, les réseaux et les volumes : '' docker-compose down --volumes ''
* Arrêter les services, supprimer les containers, les réseaux, les volumes et les images construites et téléchargées (**ATTENTION** : la suppression des volumes entraine la perte de toutes les données associées aux containers) : '' docker-compose down --volumes --rmi all ''
* ** up **:
* Reconstruire et redémarrer un service seulement : '' docker-compose up -d --no-deps --build ''
* ** Divers ** :
* Exécuter une commande à l'intérieur d'un container : '' docker-compose exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...] ''
* Lister les images utilisées (téléchargées et construites) par les containers de services : '' docker-compose images [SERVICE...] ''
* Afficher la sortie produite par les services spécifiés : '' docker-compose logs [options] [SERVICE...] '' Ex. '' docker-compose logs -f --tail=3 ''