====== Utilisation de docker ====== ===== Objectif ===== L'objectif de cette documentation est d'apprendre à utiliser les commandes de base de docker ainsi que de créer à partir de celle-ci des images et d'instancier des conteneurs. ===== Présentation des commandes ===== Il existe de nombreuse commande sur docker, le liste complète est disponible en utilisant //docker --help// nous allons ici présenter les plus importante pour débuter avec docker. \\ attach Entrer dans le conteneur via un shell conteneur build Construire un image depuis un fichier Dockerfile commit Créer une nouvelle image de l'évolution du conteneur cp Copier des fichiers/dossiers entre l'hôte et le conteneur create Créer un nouveau conteneur diff Vérifier les changements sur le conteneur events Obtenir un journal d’événements du service docker exec Exécuter une commande dans le conteneur cible history Voir l'historique d'une image images Lister les images présente sur l'hôte logs Voir les logs du conteneur port Voir la liste des ports redirigés par le proxy docker sur le conteneur ps Lister les conteneurs démarré (avec l'option -a tous les conteneurs) pull Télécharger une image depuis un registre push Envoyer une image sur un registre restart Redémarrer un conteneur rm Supprimer un ou plusieurs conteneurs rmi Supprimer une ou plusieurs images run Lancer une commande dans un nouveau conteneur (create + start) search Rechercher une image dans le hub docker start Démarrer un ou plusieurs conteneurs stats Afficher les statistiques d'un ou plusieurs conteneurs stop Arrêter un ou plusieurs conteneurs tag Tager une image dans un registre top Voir les processus en cours d’exécution dans le conteneur volume Gérer les volumes docker ===== Docker build ===== Avec les différentes commandes que nous avons vue précédemment nous pouvons créer des Dockerfile qui vont nous permettre de construire une image. ==== Apache 2 Dockerfile ==== # On definit quel est l'image de base à utiliser FROM cg44/debian:jessie # Les personnes qui maintiennent cette image MAINTAINER Laurent Souchet MAINTAINER Charly Beaupeux # Les varibles d'environnement ENV APACHE_RUN_USER=www-data \ APACHE_RUN_GROUP=www-data \ APACHE_LOG_DIR=/var/log/apache2 \ APACHE_LOCK_DIR=/var/lock/apache2 \ APACHE_PID_FILE=/var/run/apache2.pid # Les différentes commandes pour installer apache ainsi que les modules nécessaire RUN apt-get update -y \ && apt-get install -y --no-install-recommends apache2 apache2-mpm-worker apache2-mpm-event libapache2-mod-fcgid \ && a2dismod mpm_prefork \ && a2enmod ssl rewrite proxy proxy_fcgi actions alias env headers mime dir \ # On supprime le cache apt pour alléger l'image && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # On indique à Docker les ports que le conteneur écoute EXPOSE 80 443 # Dossier de données que l'on rends pérenne VOLUME ["/etc/apache2/sites-enabled", "/etc/apache2/ssl", "/var/log/apache2", "/var/www"] # La commande executer au demarrage du conteneur ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] ==== PHP-fpm Dockerfile ==== # On definit quel est l'image de base à utiliser FROM cg44/debian:jessie # Les personnes qui maintiennent cette image MAINTAINER Laurent Souchet MAINTAINER Charly Beaupeux # Les varibles d'environnement RUN apt-get update -y && \ apt-get install -y --no-install-recommends php5-fpm php5-curl php5-ldap php5-memcache php5-memcached \ php5-mssql php5-mysqlnd php5-pgsql php5-sqlite php5-xdebug php5-gd && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Les différentes commandes pour installer php5 ainsi que les modification à effectuer dans le fichier de configuration RUN sed -i "s/;date.timezone =.*/date.timezone = Europe\/Paris/" /etc/php5/fpm/php.ini && \ sed -i "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=1/" /etc/php5/fpm/php.ini && \ sed -i "s/display_errors = Off/display_errors = stderr/" /etc/php5/fpm/php.ini && \ sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 1G/" /etc/php5/fpm/php.ini && \ sed -i "s/;opcache.enable=0/opcache.enable=0/" /etc/php5/fpm/php.ini && \ sed -i "s/;daemonize\s*=\s*yes/daemonize = no/g" /etc/php5/fpm/php-fpm.conf && \ sed -i "/^listen = /clisten = 9000" /etc/php5/fpm/pool.d/www.conf && \ sed -i "/^listen.allowed_clients/c;listen.allowed_clients =" /etc/php5/fpm/pool.d/www.conf && \ sed -i "/^;catch_workers_output/ccatch_workers_output = yes" /etc/php5/fpm/pool.d/www.conf # On indique à Docker les ports que le conteneur écoute EXPOSE 9000 # Dossier de données que l'on rends pérenne VOLUME ["/var/www"] # La commande executer au demarrage du conteneur ENTRYPOINT ["/usr/sbin/php5-fpm", "-F"] ==== Postgres Dockerfile ==== # On definit quel est l'image de base à utiliser FROM cg44/debian:jessie # Les personnes qui maintiennent cette image MAINTAINER Laurent Souchet MAINTAINER Charly Beaupeux # Les varibles d'environnement ENV PG_MAJOR=9.4 ENV PG_VERSION=9.4.5-0+deb8u1 ENV PGDATA=/var/lib/postgresql/data ENV PGDIR=/etc/postgresql/$PG_MAJOR/main ENV DBUSER=unusual ENV DBPWD=5uP3r?4s5w02D ENV DBBASE=anydb ENV PATH=/usr/lib/postgresql/$PG_MAJOR/bin:$PATH # Les différentes commandes pour installer postgres ainsi que les dossier nécessaire RUN apt-get update -y \ && apt-get install -y --no-install-recommends postgresql-$PG_MAJOR=$PG_VERSION \ && mkdir -p /var/run/postgresql \ && chown -R postgres /var/run/postgresql \ # On supprime le cache apt pour alléger l'image && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # On copie le script dans le conteneur COPY init.sh / # On indique à Docker les ports que le conteneur écoute EXPOSE 5432 # Dossier de données que l'on rends pérenne VOLUME ["/var/lib/postgresql/data"] # On change d'utilisateur USER postgres # On change le dossier de travail WORKDIR /var/lib/postgresql # La commande executer au demarrage du conteneur ENTRYPOINT ["/init.sh"] ===== Docker run ===== ==== Apache 2 run.sh ==== #!/bin/bash docker run -dti -p 80:80 -p 443:443 --link php --name apache -v /data/apache2/etc/apache2/sites-enabled/:/etc/apache2/sites-enabled/ -v /data/apache2/etc/apache2/ssl:/etc/apache2/ssl -v /data/apache2/var/log/apache2:/var/log/apache2 -v /data/apache2/var/www:/var/www -h apache debiandockerdev2:5000/cg44/apache2:latest ==== PHP-fpm run.sh ==== #!/bin/bash docker run -dtiv /data/apache2/var/www:/var/www --link postgres --name php -h php debiandockerdev2:5000/cg44/php:latest ==== Postgres run.sh ==== #!/bin/bash docker run -dtiv /data/postgres/var/lib/postgresql/data:/var/lib/postgresql/data --name postgres -h postgres debiandockerdev2:5000/cg44/postgres:latest Ainsi que le script d'initialisation #!/bin/bash if [[ -z "$(ls -A "$PGDATA")" || "$1" = "master" || "$1" = "slave" ]] then if [ -z "$(ls -A "$PGDATA")" ] then chmod 700 $PGDATA chown -R postgres $PGDATA initdb sed -i "s,#listen_addresses = 'registry.cg44.fr',listen_addresses = '*',g" $PGDATA/postgresql.conf sed -i "s,#data_directory = 'ConfigDir',data_directory = '$PGDATA',g" $PGDATA/postgresql.conf sed -i "s,#hba_file = 'ConfigDir/pg_hba.conf',hba_file = '$PGDATA/pg_hba.conf',g" $PGDATA/postgresql.conf echo "host all all 172.17.0.0/16 md5" >> $PGDATA/pg_hba.conf pg_ctl -D $PGDATA -o "-c listen_addresses=''" -w start psql -U postgres << EOF create user $DBUSER createdb; alter user $DBUSER encrypted password '$DBPWD'; create database $DBBASE template template0 encoding 'unicode'; alter database $DBBASE owner to $DBUSER; grant all privileges on database $DBBASE to $DBUSER; EOF echo "L'utilisateur et la base de données ont bien été créer et sont préte !" fi if [ "$1" = "master" ] then echo "master" if [ ! $(pgrep postgres) ] then pg_ctl -D $PGDATA -o "-c listen_addresses=''" -w start fi echo "création $REPUSER" psql -U postgres << EOF create user $REPUSER replication; alter user $REPUSER encrypted password '$REPPWD'; EOF sed -i "s,#wal_level = minimal,wal_level = hot_standby,g" $PGDATA/postgresql.conf sed -i "s,#max_wal_senders = 0,max_wal_senders = 1,g" $PGDATA/postgresql.conf elif [ "$1" = "slave" ] then sed -i "s,#hot_standby = off,hot_standby = on,g" $PGDATA/postgresql.conf echo "standby_mode = 'on'" > $PGDATA/recovery.conf echo "primary_conninfo = 'host=$REPMASTERIP port=5432 user=$REPUSER password=$REPPWD'" >> $PGDATA/recovery.conf fi else postgres -D $PGDATA fi ===== Scripts ===== Nous avons réalisé trois scripts permettant de facilité certaines opérations. Le premier consiste à effacer l'ensemble des images sans tag, lister sous le tag //// : #!/bin/bash docker rmi $(docker images | grep "^" | awk '{print $3}') Le second nous permet de déclencher l'arrêt de l'ensemble des conteneurs actif sur notre machine : #!/bin/bash docker stop $(docker ps -a -q) Enfin, le dernier nous permet d'arrêter, détruire puis reconstruire de nouveaux conteneurs pour notre mode "brick" Postegre / PHP / Apache : #! /bin/sh # Fonction d'arret et suppression clean() { process=$(docker ps -a) echo "Arret du conteneur $1 + suppresion" if ( echo $process | grep "$1" > /dev/null ); then docker stop $1 docker rm $1 fi } # Fonction de lancement start() { echo "Start conteneur $1" /docker/$1/run.sh sleep 5 } # Nettoyage des conteneurs clean "postgres" clean "php" clean "apache" # Demarrage des conteneurs start "postgres" start "php" start "apache"