Docker : les commandes de base

Références : les commandes de base sur les Images, Container, Dockerfile, docker-compose.yml

, par Christophe

Dockerfile : creer une image à partir d’une autre image

Exemple de Dockerfile

#Commentaires ...
FROM debian:jessie
FROM debian:jessie
MAINTAINER tofulm <tofulm@gmail.com>

RUN apt-get -y update
RUN apt-get install -y vim zsh tmux

#APACHE
RUN apt-get install -y apache2
RUN a2enmod userdir
RUN a2enmod rewrite
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
RUN service apache2 restart

#PHP
RUN apt-get install -y php5 php5-mysql php5-cgi php5-cli php5-gd \
    php5-imagick php5-curl php5-sqlite php5-xsl php5-xdebug
RUN apt-get install -y libapache2-mod-php5

RUN apt-get install -y sudo
RUN useradd -ms /bin/zsh tof -G www-data,sudo

WORKDIR /var/www/html

ADD ./apache.sh /usr/local/bin/
RUN chmod 755 /usr/local/bin/apache.sh

EXPOSE 80
EXPOSE 443

CMD ["apache.sh", "arg2", "arg2"]

Descriptions

  • FROM permet de définir depuis quelle base votre image ve être créée
  • MAINTAINER permet de définir l’auteur de l’image et s’écrit de la manière suivante Nom
  • RUN permet de lancer une commande, mais aura aussi pour effet de créer une image intermédiaire.
  • COPY permet de copier un fichier depuis la machine hôte
  • ADD permet de copier un fichier depuis la machine hôte ou depuis une URL
  • EXPOSE permet d’exposer un port du container vers l’extérieur
  • ENTRYPOINT permet d’ajouter une commande qui sera exécutée par défaut, et ce, même si on choisit d’exécuter une commande différente de la commande standard
  • CMD détermine la commande qui sera exécutée lorsque le container démarrera. Vient apres ENTRYPOINT
  • WORKDIR permet de définir le dossier de travail pour toutes les autres commandes (par exemple RUN, CMD, ENTRYPOINT et ADD)
  • ENV permet de définir des variables d’environnements qui pourront ensuite être modifiées grâce au paramètre de la commande run —env =.
  • VOLUMES permet de créer un point de montage qui permettra de persister les données.

Creer une image qui s’appelera : prefixe_du_tag/nom_du_tag

Dans le repertoire contenant le fichier Dockerfile :

docker build -t prefixe_du_tag/nom_du_tag .

Attention, ne pas oubier le ’.’ final

Supprimer une image :

On liste les images : docker images

docker rmi -f "id_image"

Creer un conteneur à partir d’une IMAGE

docker run --rm -ti prefixe_du_tag/nom_du_tag -p port_exterieur:port_interieur -v /repertoire/exterieur:/repertoire/interieur script_a_lancer.sh

-ti : avoir une invite de commande du conteneur --name : nom du conteneur -d : en tache de fond -p 80:80 exterieux:conteneur -v dossier_ext:dossier_conteneur : lier un fichier ext:int du conteneur --rm : supprime le conteneur après son arret Si on ajoute : script_a_lancer.sh il remplace le script lancé par la commande : CMD du Dockerfile

Quelques commandes sur une conteneur lancé en tache de fond avec l’option -d

On récupère l’id du conteneur : docker ps -a

Puis on se connecte dans ce conteneur : docker exec -ti "id_conteneur" bash

Pour stopper un conteneur : docker stop "id_conteneur"

Supprimer un conteneur

On liste les conteneurs : docker ps

docker rm -f "id_conteneur"

Enregistrement d’un conteneur

Arret, log et suppression du conteneur

docker logs "id_conteneur"
docker diff
docker commit "id_conteneur" nom_nouveau_conteneur
docker save "mon_nom" > /home/mon_user/

docker-compose.yml

Lancer un docker-compose dans le répertoire contenant le docker-compose.yml

docker-compose up -d

-d : en arrière plan

Exemple de docker-compose.yml

web:
  image: gamuza/debian8
  restart: always
  ports:
    - "80:80"
  volumes:
    - /home/docker/www/:/var/www/html/
    - /home/docker/debian8/php/php.ini:/etc/php5/apache2/conf.d/30-custom.ini
    - /home/docker/vhost/:/etc/apache2/sites-enabled/
  environment:
    - ALLOW_OVERRIDE=true
  links:
    - "mariadb:db"
    - "mailhog:mailhog"

phpmyadmin:
  image: phpmyadmin/phpmyadmin
  ports:
    - "8081:8080"
  environment:
    - MYSQL_ROOT_PASSWORD=iopklm
  links:
    - "mariadb:db"

mariadb:
  image: mariadb:10.0
  environment:
    - MYSQL_ROOT_PASSWORD=mon_super_mdp
    - TERM=dumb
  volumes:
    - /home/docker/debian8/mysql:/var/lib/mysql
    - /home/docker/debian8/dump:/dump

mailhog:
  restart: always
  image: mailhog/mailhog
  ports:
    - "8025:8025"
    - "1025:1025"

Références :