Docker
Conteneur qui facilite le déploiement logiciel : leur configuration sera garantie identique et automatisée.
Sommaire
Vocabulaire
- Image : Systeme de fichier et paramètres, ne change jamais
- Container : Instance d'une image
Sources
https://docs.docker.com/engine/getstarted/step_two/
Installation
- Sous Arch Linux
Installer le paquet docker
pacman -S docker
Lancement
- sous Arch Linux
lancer le service docker.service
systemctl start docker.service
operation sur les images
par example, avec l'image httpd
Télécharger une image
commande pull
docker pull httpd
Lister les image
- commande images pour lister les dernières images crées
docker images
- on peut aussi chercher des images avec un 2eme agrument, par exemple lister les images contenant 'php'
docker images php
- Lister les images sans tag
docker images | grep "^<none>" | awk '{print $3}'
Lancer un container
commande docker run
docker run httpd
La commande docker run prend en argument une image est crée un conteneur où lancer une session.
Docker doit être lancé par un utilisateur appartenant au groupe docker ou par root (voir Linux)
on peut tester que tout fonctionne bien en lançant docker hello-world
sudo docker run hello-world
On peut aussi preciser un TAG
docker run httpd:my-tag
Options de docker run
Un container peut etre lancé en mode Detached (en arrière plan) ou Foreground (au premier plan)
- -d lancer en mode Detached
- --name Pour nommer le container
- -i Ouvrir stdin (permet de l'utilisation du clavier)
- -t Ouvre un pseudo TTY
- --rm Pour effacer le container a la fin d'une session en mode Forefround
- -v host:dock Pour monter un repertoire host dans le système de fichier du container docker
- -p PORT_HOST:PORT_CONTAINER exposer un port
Sources
https://docs.docker.com/engine/reference/run/
effacer une image
Une image ne peut être effacée que si aucun contenter, même arrête, ne l'utilise.
docker rmi <image_id>
effacer toutes les images sans tag
docker rmi $(docker images | grep "^<none>" | awk '{print $3}')
Construire une image
Avec un fichier nommé Dockerfile dans le répertoire spécifié en deuxième argument
docker build .
indiquer un nom avec -t
docker build . -t 'drev/something'
renommer une image
docker tag IMAGE_CURRENT_ID IMAG_NEW_NAME
example
docker tag c140b5a2b4b7 'drev/something'
Operations sur les containers
Lister
- Containers lancés
docker ps
- Tout les containers
docker ps -a
arreter un container
docker stop CONTAINER_NAME
effacer un container
Un container doit être stoppé pour être effacé
docker rm CONTAINER_NAME
Effacer tout les containers
docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)
S'attacher à un container
- commande attach
docker attach httpd
Attention ! Pour quitter faire un
C-p C-q
un C-c va tuer le processus
(c.f https://docs.docker.com/engine/reference/commandline/attach/)
exec
permet de lancer une commande dans un container en fonction
exemple : Lancer un shell dans un container
docker exec -it "CONTAINER_NAME" bash
Dockerfile
Fichier nommée 'Dockerfile' contaneant une serie d'instruction pour construire une image
La commande pour lancer
docker build .
on peut aussi utilier l'option -t pour tagger l'image
docker build -t REPO:TAG
Instructions Dockerfile
COPY
Ajouter un fichier
COPY <fichier dans l'hôte> <chemin dans l'image>
- Il existe aussi la commande ADD qui peut télécharger des fichiers depuis une URL et décompresser des archives
ENV
Definir une variable d'environnement
RUN
EXPOSE
Ouvre un port au système hôte
CMD
VOLUME
Sources
https://docs.docker.com/engine/reference/builder/
Inspecter un container
commande inspect
option format
Permet de filtrer le contenu retourné par inspect
exemples:
- Récupérer l'ID
docker inspect --format '{{ .Id }}' <container name>
- Récupérer l’adresse IP
docker inspect --format '{{.NetworkSettings.IPAddress}}' <container name>
Cas d'utilisations
creer un volume
Un volume est une zone mémoire où un container peut écrire
Creation d'un volume nommé v1
docker volume create --name v1
le volume sera crée sous /var/lib/docker/volumes/v1
Monter un répertoire
L'argument volume permet de monter un répertoire depuis l'hôte dans l'image
option -v CHEMIN_HOTE:CHEMIN_IMAGE
docker run -v /home/odrevet/projects:/root/projects -it drev/makedeb
Enregistrer les modifications sur le disque
par défaut, les modifications apportée dans une image ne sont pas enregistrée,
Commit
$ docker run -it ubuntu root@285d69284806:/# touch root/test root@285d69284806:~# exit $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 285d69284806 ubuntu "/bin/bash" 49 seconds ago Exited (0) 30 seconds ago high_fermat $ docker commit 285d69284806 drev/test $ docker run -it drev/test root@682b03f9a73f:/# ls root/ test
S'attacher en root a un container
docker exec -u 0 -it ID bash
Creation d'un .deb sous docker
LAMP avec docker