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.
Lance une commande dans un nouveau container. Téléchargement de l'image si besoin et création du container.
|
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
|
|
# 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
|
# 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)
|
|
# 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
|
# 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
|
# 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" ]
|
|
docker run -dit --name apache -p 8080:80 -v /host/path:/usr/local/apache2/htdocs/ httpd
|
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:
|
# 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:
|
# 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
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
|
# 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.yml
|
version: '3.9'
services:
db:
container_name: 'wiki-mariadb'
image: mariadb:10.5.8
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mediawikidb
# bugfix
MYSQL_INITDB_SKIP_TZINFO: 1
wiki:
container_name: 'wiki-mediawiki'
image: mediawiki:1.35.1
restart: always
ports:
- 8080:80
|
|
# 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
|
|
# 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
# se reloguer ne semble pas suffire, il faut redémarrer
# 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
- Clique-droit sur l'icône Docker → Settings → Shared Drives
|
docker run -v [Host_path]:[Container_path] [image]
docker run --mount source=[Host_path],target=[Container_path] [image]
|
|
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 |
Installation sur Windows avec container Linux
|
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.