Manipulations de base avec docker

Samuel Chevalley
14 décembre 2016

Installation

Prérequis : Os 64bit et une version du kernel >= 3.10
L’exemple suivant sera effectué sur un CentOS 7.

Ajout du dépôt docker :

[root@localhost yum.repos.d]# cat >> /etc/yum.repos.d/docker.repo << EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF


 
Installation du package :

yum update && yum install docker-engine

 
Activation du service au boot du système :

systemctl enable docker

 
Démarrage du service :

systemctl start docker

 

Récupération d’une image

Imaginons que nous voulons récupérer l’image d’une debian :

[root@localhost yum.repos.d]# docker search -f=is-official=true debian
NAME          DESCRIPTION     STARS     OFFICIAL   AUTOMATED
debian        Debian is ...   1816      [OK]
neurodebian   NeuroDebi ...   31        [OK]

L’option -f=is-official=true permet juste d’avoir une liste d’image moins longue en demandant d’afficher seulement les images officielles.
 
Nous allons donc récupérer la première image nommée « debian » :

[root@localhost yum.repos.d]# docker pull debian
Using default tag: latest
latest: Pulling from library/debian
75a822cd7888: Pull complete
Digest: sha256:f7062cf040f67f0c26ff46b3b44fe036c29468a7e69d8170f37c57f2eec1261b
Status: Downloaded newer image for debian:latest

 
Vérification qu’elle est bien dans notre bibliothèque d’images :

[root@localhost yum.repos.d]# docker images
REPOSITORY   TAG        IMAGE ID          CREATED         SIZE
debian      latest    19134a8202e7     14 hours ago      123 MB

 

Création d’un container

Maintenant que nous avons une image, nous pouvons en créer un container où nous pourrons faire ce que nous voudrons dessus (mise en place d’un serveur web par exemple) :

[root@localhost yum.repos.d]# docker create -ti 19134a8202e7
9c37889984b8ca2418ef5628a4d3355217813d6ea112b159aef7feacd6b4e21d

L’option « t » (–tty) fournit un terminal au docker.
L’option « i » (–interactive) permet de dialoguer avec le container (couplé à -t).
 
Vérification que le container a bien été créé :

[root@localhost yum.repos.d]# docker ps -a
CONTAINER ID      IMAGE              COMMAND         CREATED    STATUS    PORTS      NAMES
9c37889984b8    19134a8202e7      "/bin/bash"      3 seconds ago   Created           jovial_aryabhata

Nous avons donc bien un nouveau container avec l’ID 9c37889984b8 et qui porte bien l’ID de l’image debian que nous avons récupéré (19134a8202e7).
 
Nous voyons aussi qu’il a le status de « Created », nous allons donc le démarré et vérifier qu’il est bien :

[root@localhost yum.repos.d]# docker start 9c37889984b8
9c37889984b8

[root@localhost yum.repos.d]# docker ps -a
CONTAINER ID      IMAGE              COMMAND         CREATED    STATUS    PORTS      NAMES
9c37889984b8    19134a8202e7      "/bin/bash"      3 seconds ago     Up 2 seconds           jovial_aryabhata

Nous pouvons maintenant nous connecter sur ce container afin d’y travailler :

[root@localhost yum.repos.d]# docker attach 9c37889984b8

root@9c37889984b8:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

 
Pour en sortir il faut donc faire un « exit » ce qui va stopper le container (car le « attach » n’alloue pas un nouveau tty mais utilise l’orignal). Pour pouvoir se connecter/déconnecter et travailler sur notre container, il faut utiliser l’option « exec » (qui va créer un nouveau process tty) :

root@9c37889984b8:/# exit
exit

[root@localhost yum.repos.d]# docker ps -a
CONTAINER ID      IMAGE              COMMAND         CREATED    STATUS    PORTS      NAMES
9c37889984b8    19134a8202e7      "/bin/bash"      3 seconds ago     Exited (0) 2 seconds ago           jovial_aryabhata

[root@localhost yum.repos.d]# docker start 9c37889984b8
9c37889984b8

[root@localhost yum.repos.d]# docker exec -it 9c37889984b8 bash

root@9c37889984b8:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@9c37889984b8:/# exit
exit

[root@localhost yum.repos.d]# docker ps -a
CONTAINER ID      IMAGE              COMMAND         CREATED    STATUS    PORTS      NAMES
9c37889984b8    19134a8202e7      "/bin/bash"      3 seconds ago     Up 8 seconds           jovial_aryabhata

 
Remarque : il est aussi possible de passer par la commande « docker run » qui fera en une fois le « docker create/start/attach » :

[root@localhost ~]# docker run -it debian:latest
root@5fafe3c0f83a:/#

Attention, ici il faut donc utiliser le nom de l’image et non son ID . Dans le cas où nous aurions plusieurs images debian, si on ne rajoute pas le tag au nom (:latest), docker choisit de lui même la latest.
 

Modification du container / création de backup

Imaginons que nous voulons avoir un serveur apache, il faut donc se connecter sur le container et installer le package apache2 (comme si nous étions sur une machine normale), nous allons aussi dire à apache d’écouter sur le port 500 (nous verrons ensuite pourquoi) :

[root@localhost yum.repos.d]# docker exec -it 9c37889984b8 bash
root@71b8862615f2:/etc/apt# apt-get update && apt-get install apache2
.........
root@e5bf43e4831f:/# vi /etc/apache2/ports.conf #ici indiquer le port d'écoute 500

root@e5bf43e4831f:/# /etc/init.d/apache2 start
root@e5bf43e4831f:/# systemctl enable apache2 #pour que apache se lance au boot

 
Apache a été installé et configuré, nous pouvons alors faire une sauvegarde de notre container :

[root@localhost yum.repos.d]# docker commit 71b8862615f2
sha256:f4ff7cc68d31eb52b8e8eaecb0a130be521d848d0bf0aa46c018ae3087ba497c
[root@localhost yum.repos.d]# docker images
REPOSITORY    TAG      IMAGE ID        CREATED             SIZE
<none>      <none>    f4ff7cc68d31    4 seconds ago       220.8 MB
debian      latest    19134a8202e7    17 hours ago        123 MB

 
Une nouvelle image a bien été générée (il s’agit donc d’une debian avec apache2 d’installé et configuré), nous allons la nommée pour nous aider et enlever les <none> :

[root@localhost yum.repos.d]# docker tag f4ff7cc68d31 debian:apache2Port500
[root@localhost yum.repos.d]# docker images
REPOSITORY    TAG              IMAGE ID          CREATED          SIZE
debian     apache2Port500     f4ff7cc68d31    6 minutes ago    220.8 MB
debian     latest             19134a8202e7    17 hours ago     123 MB

 
Nous allons supprimer l’ancien container et en créer un nouveau avec notre nouvelle image :

[root@localhost yum.repos.d]# docker stop  9c37889984b8
e72c14f32fff
[root@localhost yum.repos.d]# docker rm 9c37889984b8
e72c14f32fff
[root@localhost yum.repos.d]# docker create -ti -p 80:500 f4ff7cc68d31

[root@localhost yum.repos.d]# docker ps -a
CONTAINER ID   IMAGE           COMMAND         CREATED            STATUS                      PORTS                     NAMES
e5bf43e4831f   f4ff7cc68d31    "/bin/bash"     About a minute ago    Created                                            hungry_lalande
71b8862615f2   19134a8202e7    "/bin/bash"     23 minutes ago       Exited (0) 11 minutes ago                          admiring_ptolemy

[root@localhost yum.repos.d]# docker start e5bf43e4831f

[root@localhost yum.repos.d]# docker ps -a
CONTAINER ID   IMAGE           COMMAND         CREATED            STATUS                      PORTS                     NAMES
e5bf43e4831f   f4ff7cc68d31    "/bin/bash"     About a minute ago    Up 45 seconds             0.0.0.0:80->500/tcp      hungry_lalande
71b8862615f2   19134a8202e7    "/bin/bash"     23 minutes ago       Exited (0) 11 minutes ago                          admiring_ptolemy

L’option « -p » permet de binder un port du conteneur vers un port du host (donc ici de binder le port 500 du container vers le port 80 de mon host).

Si dans un navigateur, on entre l’IP de l’host dans l’url sans port (port 80 par défaut), on verra s’afficher la page d’apache par défaut hébergé sur le container.

 

Supprimer des images et des containers

Pour supprimer un container, il faut déjà le stopper et utiliser la commande « docker rm CONTAINER_ID ». Pour une image, il ne faut pas qu’elle soit utilisée par un container, puis « docker rmi IMAGE_ID ».

[root@localhost yum.repos.d]# docker ps -a
CONTAINER ID    IMAGE           COMMAND          CREATED             STATUS              PORTS                    NAMES
e5bf43e4831f    f4ff7cc68d31    "/bin/bash"      35 minutes ago      Up 21 minutes       0.0.0.0:80->500/tcp      hungry_lalande

[root@localhost yum.repos.d]# docker stop e5bf43e4831f
e5bf43e4831f

[root@localhost yum.repos.d]# docker rm e5bf43e4831f
e5bf43e4831f

[root@localhost yum.repos.d]# docker ps -a
CONTAINER ID   IMAGE   COMMAND    CREATED    STATUS    PORTS    NAMES

[root@localhost yum.repos.d]# docker images
REPOSITORY    TAG        IMAGE ID        CREATED             SIZE
debian        apache2    f4ff7cc68d31    43 minutes ago      220.8 MB
debian        latest     19134a8202e7    18 hours ago        123 MB

[root@localhost yum.repos.d]# docker rmi f4ff7cc68d31
Untagged: debian:apache2
Deleted: sha256:f4ff7cc68d31eb52b8e8eaecb0a130be521d848d0bf0aa46c018ae3087ba497c
Deleted: sha256:b961501bed3ecf42fac4bc768e53cb98a6580d96c2b732851ca78e87e6dbb3b0

[root@localhost yum.repos.d]# docker images
REPOSITORY    TAG        IMAGE ID            CREATED             SIZE
debian        latest     19134a8202e7        18 hours ago        123 MB

 

Lancer un container en arrière plan

Lancer un apache dans un container en mode détaché sans que le container ne se ferme (car en mode détaché, lorsque le process root se ferme, le container se ferme aussi) :

[root@localhost ~]# docker run -d -p 80:80 -v /var/www/appli1:/var/www/html debian:apache2 apachectl -D FOREGROUND
25375238a7c8e7251dedb76ca073fa633ca6abddc398db27faf213013e87a834

[root@localhost ~]# docker ps -a
CONTAINER ID    IMAGE            COMMAND               
CREATED      STATUS          PORTS                       NAMES
25375238a7c8    debian:apache2  "apachectl -D FOREG"   
2 sec ago    Up 1 seconds   0.0.0.0:80->80/tcp           mad_kowalevski

-d : lancer le container en arrière plan
-p 80:80 : binder le port 80 du container sur le port 80 de l’host
-v /var/www/appli1:/var/www/html : permet de mapper le volume /var/www/appli1 du host sur le volume /var/www/html du container (ceci est un exemple dans le cas où le documentroot du vhost apache sur le container pointe sur /var/www/html, comme ça il est possible de stocker ses appli en local et de les faire tourner via un container docker)
apachectl -D FOREGROUND : lancer apache au premier plan (ce qui permet au container de pas se fermer)

 

Le Dockerfile

Il est possible de créer une image depuis un fichier nommé « Dockerfile » (avec la majuscule), exemple pour créer une image avec un apache :

[root@localhost apache]# vi Dockerfile
#dans le Dockerfile mettre :
FROM debian       #sur quelle image se baser
MAINTAINER Samuel Chevalley    #le mainteneur
RUN apt-get update && apt-get -y upgrade && apt-get -y install apache2   #installation d'apache
CMD ["apache2ctl","-D","FOREGROUND"]  #commande pour lancer apache au premier plan

[root@localhost apache]# docker build -t debian/apache .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM debian
 ---> 19134a8202e7
Step 2 : MAINTAINER Samuel Chevalley
 ---> Using cache
 ---> f2e2f8eb4bb3
Step 3 : RUN apt-get update && apt-get -y upgrade && apt-get -y install apache2
 ---> Running in 8cec593f99af
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]
Get:2 http://security.debian.org jessie/updates/main amd64 Packages [428 kB]
...
...
...

[root@localhost apache]# docker images
REPOSITORY             TAG            IMAGE ID         CREATED             SIZE
debian/apache          latest         b969803df473     6 seconds ago       191.5 MB

[root@localhost apache]# docker run -d -p 80:80 debian/apache
218eb54c13df016a431a467351ae092aa8ca27b916bead051463290715635912

[root@localhost apache]# docker ps -a
CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS          PORTS                NAMES
218eb54c13df   debian/apache   "apache2ctl -D FOREGR"   3 seconds ago   Up 2 seconds    0.0.0.0:80->80/tcp   berserk_kowalevski

Pour les commandes disponibles sur le Dockerfile, voir https://docs.docker.com/engine/reference/builder/