Versions
7 oct 2015 : création
Contactez-nous
Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81
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
Note : on ne peut plus ajouter de commentaire sur ce site