# Docker # [Docker] Installation ## [![horizontal-logo-monochromatic-white.png](https://wiki.neopipe.fr/uploads/images/gallery/2023-07/scaled-1680-/horizontal-logo-monochromatic-white.png)](https://wiki.neopipe.fr/uploads/images/gallery/2023-07/horizontal-logo-monochromatic-white.png) ## Installation #### Debian ```bash apt-get update && apt-get install ca-certificates curl gnupg -y && install -m 0755 -d /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && chmod a+r /etc/apt/keyrings/docker.gpg && 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" | tee /etc/apt/sources.list.d/docker.list > /dev/null && apt-get update && apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y ``` #### Ubuntu ```bash apt-get update && apt-get install ca-certificates curl gnupg && install -m 0755 -d /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && chmod a+r /etc/apt/keyrings/docker.gpg && echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && apt update && apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ``` #### CentOS / Alma Linux / Rocky Linux ```bash yum install -y yum-utils && yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ``` #### Arch Linux / Manjaro ``` pacman -Sy docker && systemctl enable --now docker.service ``` #### Alpine Linux ```bash apk policy docker && apk add docker && rc-update add docker boot && service docker start ``` ## Mettre l'utilisateur dans le groupe docker Pour mettre l'utilisateur dans le groupe docker et ainsi pouvoir lancer des conteneurs avec d'autres utilisateurs que root : ```bash usermod -aG docker ``` Puis : ```bash newgrp docker ```

Relancez votre session pour prendre en compte les changements.

# [Docker] Cheat-sheet ## Introduction Cette page répertorie des commandes docker pour administrer vos conteneurs. ## Commandes de base #### Démarrer un conteneur ```bash docker run -d -p --name ``` #### Arrêter un conteneur ```bash docker stop ``` #### Supprimer un conteneur ```bash docker rm ```

Le conteneur doit être arrêté pour le supprimer.

#### Redémarrer un conteneur ```bash docker restart ``` ## Images #### Télécharger une image Docker ```bash docker pull ``` #### Lister les images présente sur le système ```bash docker images ``` #### Supprimer une image docker ```bash docker rmi ``` #### Supprimer les images inutilisées ```bash docker images -f dangling=true ``` ## Réseaux #### Création de réseau Docker Pour créer un réseau simple sur Docker, il faut exécuter la commande suivante : ```bash docker network create --driver ```
**Types de drivers****Description****Commande**
**bridge** (default)Créer un réseau Naté et isolé pour les conteneurs.docker network create --driver bridge <NET\_NAME>
**host**Utilise directement le réseau de l'hôtedocker run --network host --name <CT\_NAME> <IMG>
**overlay**Permet aux conteneurs qui ne sont pas sur le même hôte d'appartenir à un même réseau (très utilisé avec Docker Swarm).docker network create --driver overlay <NET\_NAME>
**macvlan**Donne une adresse MAC aux conteneur ce qui les fait apparaître comme de véritables appareils du réseau de l'hôte.docker network create -d macvlan --subnet=<NET\_ID/MASK> --gateway=<IP> -o parent=<IFACE> <NET\_NAME>
#### Lister les réseaux existants ```bash docker network ls ``` #### Afficher le détail d'un réseau ```bash docker network inspect ``` #### Supprimer un réseau ```bash docker network rm ``` #### Connecter un conteneur à un réseau ```bash docker network connect ``` #### Déconnecter un conteneur d'un réseau ```bash docker network disconnect ``` #### Créer un réseau isolé ```bash docker network create --driver bridge --subnet isolated_network ``` ## Volumes #### Créer un volume ```bash docker volume create ``` #### Attacher un volume à un conteneur ```bash docker run -d -v :/data --name ```

Les volumes docker sont stockés dans **/var/lib/docker/volumes** .

#### Faire du bind mount Ce type de montage spécifie l'emplacement du volume sur le système hôte : ```bash docker run -d -v /root/my_app/data:/data --name ``` #### Lister les volumes ```bash docker volume ls ``` #### Afficher les détails d'un volume ```bash docker volume inspect ``` #### Créer un volume en lecture seule ```bash docker run -d -v /root/my_app/data:/data:ro --name ``` #### Supprimer un volume ```bash docker volume rm ``` #### Nettoyer les volumes non utilisés ```bash docker volume prune ``` #### Copier un fichier de l'hôte sur un volume ```bash docker cp /path/to/file.txt :/data/file.txt ``` #### Faire une sauvegarde d'un volume ```bash docker run --rm --volumes-from -v $(pwd):/backup ubuntu tar cvzf /backup/backup.tar.gz /data ``` ## Dockerfile Le **Dockerfile** est un fichier permettant de créer une image docker pour votre application : ``` # Utilise l'image Python comme base FROM python:3.8 # Définit l'espace de travail WORKDIR /app # Copie les fichiers de l'application dans l'espace de travail COPY . /app # Installe les dépendances RUN pip install -r requirements.txt # Expose le port 5000 du conteneur EXPOSE 5000 # Lance le script au démarrage de l'application. CMD ["python", "app.py"] ``` #### Build une image à partir d'un Dockerfile ```bash docker build -t . ``` ## Sécurité #### Lancer un conteneur avec les droits d'un utilisateur non-root ```bash docker run -u ``` #### Créer un secret ```bash echo "" | docker secret create - ``` #### Ajouter un health check sur un conteneur Cette option permet d'éteindre un conteneur automatique si celui-ci est en panne (pour éviter les problèmes de sécurité et les comportements inattendus) : ```bash docker run --name --health-cmd="curl --fail http://localhost:80/health || exit 1" -d ``` ## Débogage #### Ouvrir un shell dans un conteneur ```bash docker exec -it /bin/bash ``` #### Vérifier l'état du service ```bash systemctl status docker ``` #### Vérifier le fonctionnement de docker ```bash docker run hello-world ``` #### Afficher les conteneurs actifs ```bash docker ps ```

Vous pouvez ajouter l'option **-a** pour afficher tous les conteneurs.

#### Afficher les logs d'un conteneur ```bash docker logs ``` #### Afficher la configuration d'un conteneur ```bash docker inspect ``` #### Afficher les statistiques des conteneurs ```bash docker stats ``` #### Écouter les événements docker ```bash docker events ``` #### Afficher les changements dans le système de fichier d'un conteneur ```bash docker diff ``` ## Mettre à niveau un conteneur #### Arrêt du conteneur ```bash docker container stop ``` #### Recherche du nom de l'ancienne image ```bash docker ps -f name= --format "{{.Image}}" ``` #### Suppression du conteneur ```bash docker container rm ``` #### Suppression de l'ancienne image ```bash docker rmi : ``` #### Redéploiement du conteneur ```bash docker run -d --name : ``` # [Docker] Compose ## Introduction Les **stacks** docker (ensemble de conteneurs) peuvent être gérées à travers compose ou docker-compose selon les appellations. [![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2024-04/scaled-1680-/b9fimage.png)](https://wiki.neopipe.fr/uploads/images/gallery/2024-04/b9fimage.png) ## Installation Vous avez deux manières d'installer docker compose, soit via le plugin (recommandé) : ```bash apt install -y docker-compose-plugin ``` Ou en téléchargeant le binaire : ```bash curl -L https://github.com/docker/compose/releases/download/v2.22.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose ```

Selon le type d'installation, il faudra utiliser la commande **docker compose** ou la commande **docker-compose**.

## Utilisation #### Fichier compose.yml Voici un exemple de fichier **compose.yml** pour déployer un serveur web php. ```yaml version: '3.9' services: php: php:apache container_name: php environment: - PUID=1000 - GUID=1000 - TZ=Europe/Paris ports: - '80:80' - '443:443' volumes: - /website:/var/www/html ``` #### Lancer la stack ```bash docker compose up -d ``` # [Docker] Swarm ## Introduction Docker Swarm permet de faire de la répartition de charge et de la HA dans vos infrastructures Docker. Pour cela, on va mettre en place un cluster de noeuds avec des managers et des workers (masters/slaves). [![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2024-03/scaled-1680-/eVdimage.png)](https://wiki.neopipe.fr/uploads/images/gallery/2024-03/eVdimage.png) ## Prérequis - Avoir Docker installé sur tous les noeuds du cluster ## Installation Tout d'abord, rendez-vous sur votre **Manager** pour créer le cluster : ```bash docker swarm init --advertise-addr ``` Ensuite, il faut vous connecter sur chaque **Workers** pour les faire rejoindre votre cluster : ```bash docker swarm join --token ``` Le token a été affiché lors de la création du cluster sur le Manager sinon vous pouvez l'afficher avec cette commande : ```bash docker swarm join-token worker ``` Et pour faire rejoindre des managers : ```bash docker swarm join-token manager ``` ## Manuel #### Afficher les membres du cluster ```bash docker node ls ``` #### Déployer un conteneur dans le cluster ```bash docker service create --name webserver -p 8080:80 nginx ``` #### Déployer une stack dans le cluster ```bash docker stack deploy --compose-file compose.yml ``` #### Afficher les services ```bash docker service ls ``` #### Scale un service ```bash docker service scale =3 ``` #### Supprimer une stack ```bash docker stack rm ``` #### Sortir un noeud du cluster Sur le noeud : ```bash docker swarm leave ```

S'il s'agit du dernier noeud Manager du cluster, spécifier **--force** pour supprimer le cluster.

Et depuis le Manager : ```bash docker node rm ```