Docker

De Wiki doc

Révision datée du 3 août 2019 à 18:03 par Ycharbi (discussion | contributions) (→‎Via APT : Mise à jour de l'installation pour Debian Buster.)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

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 commande docker 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 dockerfile

Ajouter 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