Docker

De Banane Atomic
Aller à la navigationAller à la recherche

Liens

Généralités

Docker permet de créer des environnements isolés du reste du système.
Il ne permet pas de faire de virtualisation et donc de faire fonctionner d'autres OS.
Couplé avec un système de virtualisation (Hyper-V), il permet de créer des environnements isolés sur d'autres OS virtualisés (containers Linux sous un OS Windows).

  • une image représente le programme avant son installation (installer ou une archive zip)
  • un container représente le programme une fois installé
Les images dockers sont pour les systèmes 64 bits.

Container

Un container est une instance d'une image. Il est créé à partir d'une image mais ne modifie jamais celle-ci.

run

Lance une commande dans un nouveau container. Téléchargement de l'image si besoin et création du container.

Bash.svg
docker run <Repository<:Tag>>
# --name <ContainerName>
# -it : open a shell on the container
# -d : detach, run container in background and print container ID
# -v <LocalPath>:<ContainerPath> : monter un dossier local dans le container (-v c:/local/folder:/media/docker/folder)
# --rm : Automatically remove the container when it exits
# -p 8080:80 : mapping du port 8080 du host vers le port 80 du container

start

Bash.svg
# démarrer d'un container
docker start <ContainerName ou ContainerId>
# -ai : open a shell on the container

# arrêter un container
docker stop <ContainerName ou ContainerId>

autres

Bash.svg
# lister les containers actifs
docker ps
# -a tous les containers
# lister tous les containers et leur tailles
docker ps -as --format "{{.Names}}    \t{{.Size}}\t\t{{.Image}}"

# info sur un container
docker inspect <ContainerName ou ContainerId>
# get the IPs of all the running containers
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

# renommer un container
docker rename <ContainerName> <NewContainerName>

# supprimer un container
docker rm <ContainerName ou ContainerId>
# supprimer tous les containers
docker rm $(docker ps -a -q)

# se connecter au container via un terminal bash
docker exec -ti <ContainerName> /bin/bash
# -t : tty, allocate a pseudo-TTY
# -i : interactive, keep STDIN open even if not attached
# -e LANG=C.UTF-8 , force the encoding to utf8
# Ctrl+P+Q pour sortir du terminal bash sans tuer le processus

# exécuter une commande dans un container
docker exec <ContainerName> touch /tmp/test
# -e VAR=1  définit une variable d'environnement
# -w /root  change le working directory

# copier un fichier dans un container
docker cp /path/local-file.txt <ContainerName>:/tmp/file.txt

# suivre le log d'un container en direct
docker logs -f <ContainerName>

# lister les volumes
docker volume ls
# supprimer tous les volumes
docker volume rm $(docker volume ls -q)

Images

Bash.svg
# lister les images
docker images

# télécharger une image depuis Docker Store
docker pull <Repository<:Tag>>

# sauvegarder l'état du container dans une image
docker commit <ContainerId> <ImageName>

# supprimer une image
docker rmi <Repository:<Tag> ou ImageId>
# supprimer toutes les image
docker image rm $(docker images -a -q)

# renommer une image : créer un nouveau tag et supprimer l'ancien
docker tag [image_ID] [Nouveau_Tag]
docker rmi [Ancien_Tag]

# lister les dangling images
docker images -f dangling=true
# supprimer les dangling images
docker images purge

# rechercher une image sur docker store
docker search <image name>

Images utiles:

  • ubuntu
  • debian
  • alpine
  • microsoft/dotnet
  • nginx

build

Bash.svg
# use Dockerfile. Build context .
docker build -t [image-name] .

# use Other-Dockerfile. Build context .
docker build -t [image-name] -f ./Other-Dockerfile .
Dockerfile
FROM [image-name]
RUN [command]
COPY [source] [destination]
Avec COPY, la source doit se trouver dans le build context.

Exemples

PHP

Bash.svg
# apache avec php
docker run -dit --name apache-php -p 8080:80 -v /host/path:/var/www/html php:7.2-apache
Dockerfile
FROM php:7.2-cli
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
CMD [ "php", "./your-script.php" ]

apache

Bash.svg
docker run -dit --name apache -p 8080:80 -v /host/path:/usr/local/apache2/htdocs/ httpd

mariadb

docker-compose.yml
image: mariadb
restart: always
environment:
    MYSQL_ROOT_PASSWORD: ***
    # optional, create a database and a user with full rights on that db
    MYSQL_DATABASE: mydb
    MYSQL_USER: myuser
    MYSQL_PASSWORD: ***
    # bugfix
    MYSQL_INITDB_SKIP_TZINFO: 1

Restore sql dump file

Depuis un hôte Linux:

Bash.svg
# restore sql dump file
docker exec -i [mariadb-comtainer] sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /path/host/dump.sql

Depuis un hôte Windows:

Powershell.png
# copy the sql dump file from the host to the container
docker cp sql-dump.sql [mariadb-container]:/
# restore the sql dump
docker exec [mariadb-container] sh -c 'mysql -u root -p$MYSQL_ROOT_PASSWORD -D mydb -e ''source sql-dump.sql;'''

# autre solution, fonctionne mais peut créer des problème d'encoding
get-content C:\path\host\dump.sql | docker exec -i [mariadb-container] exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"

bugfix

mysql

docker-compose.yml
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
    MYSQL_ROOT_PASSWORD: ***
    # optional, create a database and a user with full rights on that db
    MYSQL_DATABASE: mydb
    MYSQL_USER: myuser
    MYSQL_PASSWORD: ***

borg

Bash.svg
# créer un container à partir de l'image archlinux
# monter Documents dans /media/data
docker run -v c:/Users/<user>/Documents:/media/data --name borg -ti alpine

# depuis le container
# màj
apk update
apk upgrade
# màj puis installer borg
apk add borgbackup

# se connecter au container
docker exec -ti borg ash

Swarm mode

Faire fonctionner plusieurs engine en même temps (ex: plusieurs services qui communiquent entre eux).

Docker Compose

docker-compose.yml
version: '3.7'
services:
    db:
        container_name: 'wiki-mariadb'
        image: mariadb:10.1
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: mediawikidb
            # bugfix
            MYSQL_INITDB_SKIP_TZINFO: 1
            
    wiki:
        container_name: 'wiki-mediawiki'
        image: mediawiki:1.33
        restart: always
        ports:
            - 8080:80
Bash.svg
# Build images if needed
# create containers if they don't exist yet or if docker-compose.yml file has changed
# start the containers
docker-compose up
# -d to run in background

# to see what is currently running
docker-compose ps

# stop the containers
docker-compose stop

# stop the containers and remove the containers and images created during ‘docker-compose up’
docker-compose down

# executes a command in a running container
docker-compose exec [service name] [command]

# displays log output from service
docker-compose logs -f [service name]

# list images
docker-compose images

Installation

Bash.svg
# installer docker et docker-compose
pacman -S docker docker-compose

# ajouter l'utilisateur au group docker
sudo gpasswd -a $USER docker
# Anyone added to the docker group is root equivalent

# démarrer le service
systemctl start docker
# vérifier que le service fonctionne
docker info

Image location

/var/lib/docker
Surcharge de docker.service pour le changement de l'emplacement de stockage des images:

/etc/systemd/system/docker.service.d/docker-storage.conf
[Service]
ExecStart= 
ExecStart=/usr/bin/dockerd --data-root=/path/to/new/location/docker -H fd://

Erreurs

Your Linux kernel version is not supported for running docker

Linux kernel version 3.8.x.x-x is not supported for running docker. Please upgrade your kernel to 3.10.0 or newer.

Windows

À l'installation, choisir entre conteneur Windows et Linux.
Au lancement Docker demande l'activation d'Hyper-V (ce qui n'est pas compatible avec VirtualBox) et de Containers features.
Activer Hyper-V à la main: Menu → Turn Windows features on or off → cocher Hyper-V

  • Historiquement Windows utilisait Hyper-V pour faire tourner une VM Linux dans laquelle était installée Docker.
  • Maintenant, Windows peut faire tourner nativement des conteneurs Linux sans VM.

Windows Containers on Windows 10

Monter un dossier host dans un container

  1. Clique-droit sur l'icône Docker → Settings → Shared Drives
Powershell.png
docker run -v [Host_path]:[Container_path] [image]
docker run --mount source=[Host_path],target=[Container_path] [image]

Installation

Powershell.png
choco install docker-desktop
# nécessite de se déloguer puis de se loguer à nouveau pour que les nouveaux droits utilisateur soient appliqués
docker-desktop inclut Docker Engine, Docker CLI client, Docker Compose, Docker Machine, et Kitematic.

GUI

Kitematic

Clique-droit sur l'icône docker → Kitematic

Si les flèches du clavier ne fonctionne pas c'est parce qu'EXEC à été lancé avec sh

Entrer la commande bash

Ou Options (engrenage en bas à gauche) → Exec command shell = bash

Portainer

Installation sur Windows avec container Linux

Powershell.png
md C:\ProgramData\Portainer
docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v C:\ProgramData\Portainer:/data portainer/portainer
Error response from daemon: driver failed programming external connectivity on endpoint nervous_meninsky (5b7b910bf03ed74ba38b7dc442b6cc6c159ad8bad75b482884de72cd5a555ad4): Error starting userland proxy: mkdir /port/tcp:0.0.0.0:9000:tcp:172.17.0.2:9000: input/output error.