Manipulations de base avec docker
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
Pour supprimer tout ce qui n’est pas utilisé :
[root@localhost yum.repos.d]# docker system prune -a WARNING! This will remove: - all stopped containers - all networks not used by at least one container - all images without at least one container associated to them - all build cache Are you sure you want to continue? [y/N] y Deleted Containers: ce4aa72ad4445fa0e5f1a22dd13c1b045a89836cee54cd299a9a160521853dbd ........
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/