Navigation

Versions

7 oct 2015 : création

Contactez-nous

Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81

Par Philippe Le Van (twitter accountplv) Dernière mise à jour : 07 October 2015

Aide mémoire Docker

Introduction

Docker est un outil génial qui change considérablement nos façons de penser l'ingénierie système et l'hébergement.

Quand on débarque, on a besoin de beaucoup de pratique avant d'être efficace. Ce tutoriel a pour objectif de donner de façon très concise quelques commandes très utilisées.

Merci à @ElieCharra pour les (nombreuses) corrections.

Commandes d'exécution

Lancer un docker venant du docker hub

Nous allons prendre l'exemple de postgres. Le dans docker hub, le lien est ici : https://hub.docker.com/_/postgres/

# Lancer en daemon
docker run --name my-local-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
# -d sert à lancer postgres en tâche de fond (le docker rend la main)
# -e permet de passer des variables d'environnement au container
# --name permet de spécifier un nom pour le container qui tourne

# voir la liste des container lancés
docker ps

# voir la liste des container lancés, y compris ceux qui sont arrêtés
docker ps -a

# arrêter le container
docker stop my-local-postgres

# effacer un container
docker rm my-local-postgres

# relancer mon container
docker run --name my-local-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres

# entrer dans mon container avec un shell
docker exec -ti my-local-postgres /bin/bash
# on est maintenant dans le container en root
# su - postgres
# psql
# ...
# vous pouvez maintenant jouer avec votre container qui tourne
# on ressort du shell avec un exit et on revient dans le host

# je stoppe mon container et je le relance avec :
# * partage de répertoire avec le host
# * variables d'environnement du docker passées dans un fichier d'env
docker stop my-local-postgres
docker rm my-local-postgres
docker run --name my-local-postgres \
    -v /var/lib/postgres_sur_le_host/data:/var/lib/postgresql/data \
    --env-file=/etc/sysconfig/docker-postgres-params.env \
    -d postgres

# Si un port est en écoute dans le container, on peut faire le mapper vers un port du host avec "-p"
docker run --name xxx -p 127.0.0.1:80:8080 -d nom_dans_docker_hub

# Si un container expose un port 8080, l'option --link container-name-distant:container-courant va
# mapper les ports exposés d'un container à l'autre.
docker run --name xxx --link db:db -d nom_dans_docker_hub

Lancer un docker avec systemd

Si on veut que son docker se lance au démarrage et puisse être lancé avec systemctl, on peut créer un fichier systemd.

Attention : il n'y a plus de "-d" dans la commande docker lancée. C'est systemd qui s'occupe de lancer le docker en tache de fond. Mais pour systemd le docker doit être lancé en front.

Si je reprends l'exemple de postgresql ci-dessus, ça donne :

[Unit]
Description=Postgresql
After=docker.service

[Service]
ExecStartPre=-/bin/bash -c 'mkdir -p /var/lib/postgres/data'
ExecStartPre=-/usr/bin/docker kill postgres
ExecStartPre=-/usr/bin/docker rm postgres
ExecStart=/usr/bin/docker run \
    -v /var/lib/postgres/data:/var/lib/postgresql/data \
    --env-file=/etc/sysconfig/postgres \
    --name postgres \
    postgres

ExecStop=/usr/bin/docker stop postgres

[Install]
WantedBy=multi-user.target

Jouer avec des Dockerfile

Builder et lance une image depuis un dockerfile

# Créer une image à partir d'un Dockerfile dans le répertoire courant
docker build -t myself/my-image .
# note : le "-t myself/my-image" est facultatif, mais c'est plus pratique pour récupérer
# son image dans la liste des images

# voir la liste des images disponibles sur son poste
docker images
# on doit retrouver myself/my-image

# lancer son image
docker run --name my-docker-instance myself/my-image

# Cas particulier, si mon dockerfile s'appelle autrement ou bien est ailleurs :
docker build -t mon_nom/mon_projet - < /path_to_my_dir/dockerfile_name

Exemple commenté de dockerfile

Nous prenons comme exemple le dockerfile du projet Kanboard et nous ajoutons des commentaires dans le code.

# on indique de quelle distribution on part dans le docker hub
FROM ubuntu:14.04
# hum... c'est le mainteneur
MAINTAINER Frederic Guillot <fred@kanboard.net>

# toute les commandes à lancer dans la distrib choisie pour que le service puisse tourner
RUN apt-get update && apt-get install -y apache2 php5 php5-gd php5-sqlite git curl && apt-get clean
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf && a2enmod rewrite
RUN sed -ri 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf
RUN curl -sS https://getcomposer.org/installer | php -- --filename=/usr/local/bin/composer
RUN cd /var/www && git clone --depth 1 https://github.com/fguillot/kanboard.git
RUN cd /var/www/kanboard && composer --prefer-dist --no-dev --optimize-autoloader --quiet install
RUN rm -rf /var/www/html && mv /var/www/kanboard /var/www/html
RUN chown -R www-data:www-data /var/www/html/data

# on déclare les volumes à monter quand quelqu'un monte le docker
# s'il n'y a pas de -v dans le run du docker, ce volume est monté dans
# un répertoire du host choisi par docker. 
# WARNING : un utilisateur peut monter le répertoire du docker qu'il
# avec -v, même si le volume n'est pas déclaré.
VOLUME /var/www/html/data

# Le docker lancé expose le port 80. On peut le récupérer dans le host avec -p 127.0.0.1:80:80
EXPOSE 80

# des valeurs par défaut pour des variables d'environnement. On peut les écraser au
# run du docker avec -e VAR=VALUE ou --env-file=/.../fichier_de_var
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid

# toutes les commandes précédentes sont lancées dans la phase de build.
# La commande suivante (CMD xxx) est lancée au moment du run.
CMD /usr/sbin/apache2ctl -D FOREGROUND

Conclusion

N'hésitez pas à faire vos remarques/ajouts/corrections en commentaire.

Commentaires

Ajouter un commentaire
Awesome issues here. I'm very satisfied to see your post. Thank you a lot and I am having a look forward to touch you.
Will you kindly drop me a e-mail?