Docker : Le tutoriel pour manipuler les containers
Présentation
Docker (que je vous ai présenté la semaine dernière) est un logiciel a mi chemin entre la virtualisation applicative et l’automatisation.
Il a l’avantage de ne virtualiser que la partie application et pas du tout la partie système ni le noyau.
Il étend le principe des conteneurs Linux (LXC).
Dotcloud qui développe Docker, propose aussi un système minimaliste (CoreOS) pour héberger et hyperviser les conteneurs.
Installation
Créer le fichier /etc/apt/sources.list.d/docker.list :
deb http://get.docker.io/ubuntu docker main
Télécharger la clé GPG et installer le package :
apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
apt-get update
apt-get install lxc-docker
Manipulation d’images
Prendre une Debian sur le dépôt officiel de Docker et se connecter dessus
docker pull debian
docker run -i -t debian /bin/bash
Faire tout ce qu’on veut sur la nouvelle image
root@xxxxxx# …
Et sauvegarder les changements
root@xxxxxx# exit
docker commit xxxxxx le_nom_de_l_image
Manipuler un conteneur :
JOB1=$(docker run -d conteneur)
docker logs $JOB1
docker stop $JOB1
Voir les conteneurs qui tournent :
docker ps
docker ps -a
Supprimer un conteneur / supprimer tous les conteneurs :
docker rm $JOB1
docker rm id_du_conteneur
docker rm `docker ps -a -q`
Supprimer les images :
docker rmi id_ou_nom_de_l_image
Import / Export
Exporter un container en tar.gz :
docker export 419eed6ff306 > nginx.tgz
Importer un tar.gz :
cat nginx.tgz | docker import – nginx
Création d’images par Dockerfile
MAINTAINER : nom et mail de mainteneur du conteneur
FROM : image de base (ubuntu, debian)
VOLUME : Point de montage
RUN : commande à exécuter pour installer le conteneur.
ENTRYPOINT : commande qui s’exécute au démarrage du conteneur (une seule sera exécutée).
CMD : commande qui s’exécute au démarrage du conteneur.
ADD : Copier un fichier du répertoire courant dans le filesystem du conteneur.
USER : utilisateur qui exécute les commandes dans le conteneur.
EXPOSE : Port(s) à exposer à l’exterieur.
Construire un conteneur :
docker build -t nom_du_conteneur .
Exemple de Dockerfile : LAMP – MariaDB
Dockerfile
# lamp (d’un M qui veut dire Maria)
# Pour Debian Wheezy
#
# VERSION 0.0.1
#FROM debian:wheezy
MAINTAINER NicoENV DEBIAN_FRONTEND noninteractive
# Depots, mises a jour et installs de Apache/PHP5
RUN echo « deb http://ftp.fr.debian.org/debian/ wheezy main non-free contrib » > /etc/apt/sources.list
RUN (apt-get update && apt-get upgrade -y -q && apt-get dist-upgrade -y -q && apt-get -y -q autoclean && apt-get -y -q autoremove)
RUN apt-get install -y -q vim ssh supervisor python-software-properties apache2 libapache2-mod-php5 php5-cli php5-mysql# Installation et configuration de MariaDB
RUN apt-key adv –recv-keys –keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
RUN add-apt-repository ‘deb http://mirrors.linsrv.net/mariadb/repo/5.5/debian wheezy main’
RUN apt-get update && apt-get install -y mariadb-server
RUN service mysql start
RUN mysql -v -uroot -e’UPDATE user SET host = « % » WHERE user = « root » LIMIT 1; DELETE FROM user WHERE user = « root » AND host != « % »‘ mysql
RUN service mysql stop# Config de Apache
ADD foreground.sh /etc/apache2/foreground.sh
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2# Verification de PHP
ADD index.php /var/www/index.php
#RUN rm /var/www/index.html# Demarrage des services
RUN mkdir -p /var/log/supervisor
ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf
ADD start.sh /start.shEXPOSE 80 22
# Si MariaDB doit être exposée à l’extérieur
# EXPOSE 3306CMD [« /bin/bash », « -e », « /start.sh »]
foreground.sh
#!/bin/bash
read pid cmd state ppid pgrp session tty_nr tpgid rest < /proc/self/stat
trap « kill -TERM -$pgrp; exit » EXIT TERM KILL SIGKILL SIGTERM SIGQUITsource /etc/apache2/envvars
apache2 -D FOREGROUND
start.sh
#!/bin/bash
supervisord
supervisord.conf
[supervisord]
nodaemon=true[program:sshd]
command=/usr/sbin/sshd -D
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
autorestart=true[program:httpd]
command=/usr/sbin/apache2ctl start
stopsignal=6[program:mariadb]
command=/usr/sbin/mysqld
stdout_logfile=/tmp/%(program_name)s.stdout
stderr_logfile=/tmp/%(program_name)s.stderr
stopsignal=6
Ressources :