Docker
EN CHANTIER
Article en cours d'écriture et/ou de test. Certains éléments peuvent être incomplets et mener à un résultat non fonctionnel.Merci de ne pas rager.
Docker permet de s’assurer de la portabilité de son application, en fournissant un moyen pour que quel que soit l’environnement d’exécution, son comportement soit le même.
Le conteneur embarque tout l’environnement (bibliothèques, applicatifs, etc.), les développeurs peuvent développer dans un environnement d’exécution exactement identique à celui qui sera en production. Les opérateurs (sysadmin, netadmin) n’ont plus à s’inquiéter du fait qu’une mise à jour d’une dépendance puisse avoir un impact sur les autres applications.
Installation
Via Script
Télécharger Curl
apt install curl
Utilisation du script d'installation de Docker
curl https://get.docker.com/ | bash
Via APT
Installation des paquets permettant la connexion à un dépôt HTTPS
apt install apt-transport-https ca-certificates curl software-properties-common gpg
Ajout du dépôt dans le sources.list
echo -e '#Dépôt docker\ndeb [arch=amd64] https://download.docker.com/linux/debian buster stable' >> /etc/apt/sources.list.d/docker.list
Téléchargement et importation de la clé GPG du dépôt
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
Mise à jour de la base apt
apt update
Installation du démon docker
apt install docker-ce
Droits utilisateurs
Si vous voulez utiliser un utilisateur non-root pour l'utilisation de Docker, ajouter le groupe docker a l'utilisateur :
usermod -aG docker <UTILISATEUR>
puis fermer la session (utilisateur) puis l'allumer.
ATTENTION
D’un point de vue sécurité : donner à un utilisateur l’accès à la commande docker, c’est lui donner un accès root au système hôte (qui exécute le démon docker).Ou est docker?
Le contenue des conteneurs docker et autre configuration sont stockés dans /var/lib/docker
.
ASTUCE
Cette info est donné avec la commandedocker info
dans la section Root Dir
.Utilisation
Gestion des images
Récupérer une image sur le docker HUB
docker image pull <NOM DE L'IMAGE>
Ici, on va récupérer une image debian
docker image pull debian
en donnant juste le nom "debian", sans la vesion, docker a charger la dernière version de debian Nous pouvons lui précisé la version voulu :
docker image pull debian:strech
Nous pouvons aller voir les images disponibles sur le site https://hub.docker.com
Lister les images
docker images ls
-a
permet de voir toutes les couches
Rechercher une image
docker search <NOM DE L'IMAGE>
Suprimer une image
docker rm <NOM DE L'IMAGE>
Créer une image a partir d'un conteneur
docker commit <NOM DU CONTENEUR> <NOM DE L'IMAGE>
ATTENTION
Cette pratique n'est pas recomandé, il faut utiliser le dockerfileAjouter un tag a l'image
docker image tag <NOM DE L'IMAGE>:<TAG> <NOUVEAU NOM DE L'IMAGE>:<NOUVEAU TAG>
le tag par defaut est : latest
Gestion des conteneurs
Lister les conteneurs
Liste les conteneurs démarré
docker container ls
ou
docker container ps
ou
docker ps
Avec l'argument -a
nous pouvons voir tous les conteneurs même arrêté.
Lancer un conteneur
docker container run <NOM DE L'IMAGE>
Exemple:
On va lancer un conteneur qui va instencier debian
docker container run debian
ou
docker run debian
Si nous listons les conteneurs, nous ne trouvons pas notre conteneur lancé... avec l'argument -a
, nous voyons que notre conteneur est arrêté, cela est normal. Car le conteuneur a fini sont execution avec un "exit 0".
-ti
permet d'intergéagire avec le conteneur.
docker run -it debian
-d
permet de détacher le conteneur (daemon)
docker run -it debian -d
Si nous listons les conteneurs, nous voyons que celui-ci tourne. Nous voyons aussi qu'il a un nom spécifique.
--name
permet de donner un nom personalisé--rm
le conteneur est killé si il est en exit
Nous pouvons modifier la commande par defaut avec cette commande
docker run -it debian <COMMANDE>
Accèder au conteneur
docker container attach <NOM DU CONTENEUR>
Démarer un conteneur
docker container start <NOM DU CONTENEUR>
Arrêter un conteneur
Arrêter le conteneur
docker container stop <NOM DU CONTENEUR>
Killer le conteneur
docker container kill <NOM DU CONTENEUR>
Killer tous les conteneur arrêté
docker container prune
Lancer une commande au sein du conteneur
docker exec -it <NOM DU CONTENEUR> <COMMANDE>
Supprimer un conteneur
docker container rm <NOM DU CONTENEUR>
Gestion des volumes
Par défaut, les données dans Docker sont comme les conteneurs : elles sont éphémères. Il est possible d’avoir un conteneur et de le maintenir “à la main”, comme on le ferait avec une VM. Mais c’est perdre de vue ce qui est à la base de la conception de Docker : l’automatisation, la répétition, et la mutualisation des images de bases.
Une mise à jour d’une image nécéssitera donc un nouveau conteneur pour pouvoir l’utiliser, par défaut avec des données vierges.
Pour répondre à cette problématique de persistance des données, Docker met à disposition un mécanisme de volumes.
Les volumes sont donc persistants.
Créer un volume
docker volume create <NOM DU VOLUME>
Lister les volumes
docker volume ls
Supprimer un volume
docker volume rm <NOM DU VOLUME>
Information sur le volume
docker volume inspect <NOM DU VOLUME>
Monter un volume sur un conteneur
- Montage read write
docker run -it -v <NOM DU VOLUME>:<POINT DE MONTAGE DANS LE CONTENEUR> <NOM DE L'IMAGE>
- Montage read-only
docker run -it -v <NOM DU VOLUME>:<POINT DE MONTAGE DANS LE CONTENEUR>:ro <NOM DE L'IMAGE>
Monter un dossier local sur un conteneur
docker run -it -v <REPERTOIRE LOCAL>:<POINT DE MONTAGE DANS LE CONTENEUR> <NOM DE L'IMAGE>
Gestion des réseaux
- MODE BRIDGE : par defaut, nommé "docker0"
- MODE NONRESEAU : pas de reseau
- MODE CONTENEUR : utilise la pile réseau d'un autre conteneur
- MODE HOST : voire les interfaces du host
Créer un réseau
docker network create <NOM DU RESEAU>
Liste les réseau
docker network ls
Attacher un reseau au conteneur
docker run -itd --name <NOM DU CONTENEUR> --network <NOM DU RESEAU> <NOM DE L'IMAGE>
Exposition de port réseaux
docker container run -p <PORT HOTE>:<PORT CONTENEUR>/<UDP ou TCP> -d <NOM DE L'IMAGE>
Dockerfile
Permet de créer sa propre image
Fichier
Créer un fichier Dockerfile
, ici nous allons personnaliser un debian
#Créer une image a partir de debian jessie
FROM debian:jessie
#Informations
LABEL NOM Nicolas
#Execute une commande dans l'image
RUN apt update && apt install -y vim
#Copier un fichier dans l'image
ADD titi /data/
#Défini une variable d'environement
ENV CONFIG /etc/
#Execute cette commande au lancement du conteneur
RUN /bin/bash
Construction de l'image
aller dans le dossier ou ce trouve votre Dockerfile
et taper cette commande:
docker image build -t <NOM DE L'IMAGE> .
Docker compose
Installation
Télécharger le bin de docker-compose
curl -L https://github.com/docker/compose/releases/download/1.13.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
Le rendre executable
chmod +x /usr/local/bin/docker-compose
Utilisation
Préparer un fichier docker-compose.yml
. Ici on va préparer treafik (un reverse-proxy) :
version: '2'
services:
proxy:
image: traefik
command: --web --docker --docker.domain=docker.local --logLevel=DEBUG
networks:
- webgateway
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /root/traefik/traefik.toml:/traefik.toml
networks:
webgateway:
driver: bridge
Pour executer docker-compose
docker-compose up -d
Stats
Pour voir l'utilisation CPU et RAM des conteneurs
docker stats
Sauvegarde
Exporter
docker container export <NOM DU CONTENEUR>
Importer
docker container import <NOM DU CONTENEUR>
Log
docker container log <NOM DU CONTENEUR>
Publier une image sur son registry
Créer une registry
Docker propose une registry dans Docker Hub
docker run -p 5000:5000 -v /HDD/LOCAL:/var/lib/registry -d registry
Source de la section
Envoyer une image
changer le tag
docker tag httpd-alpine:latest 127.0.0.1:5000/httpd-alpine:latest
puis envoyer
docker push 127.0.0.1:5000/httpd-alpine:latest
Récupérer une image
docker pull 127.0.0.1:5000/httpd-alpine:latest