Docker 101

Depuis quelques temps, je me suis à découvrir Docker pour des besoins d’environnement de développement.

Cela permet de remplacer sur sa station de travail des éléments pour les “virtualiser” sous forme de conteneurs dans Docker, en découpant chaque besoin en conteneur dont on aura besoin : base de données, LDAP, frontend, backend, API, LDAP, etc

Ma station de travail fonctionne sous Windows 10 pro (à partir de la version pro uniquement sinon, à défaut, il vous faudra installer le docker toolbox qui n’est autre qu’une VirtualBox avec un linux léger boot2locker pour faire fonctionner le moteur docker, ce qui n’est pas l’idéal, n’ayant qu’une console à disposition).

Il est donc préférable de se baser sur Docker CE qui va utiliser la virtualisation native de Windows (Hyper-V), vous aurez à loisir la possibilité d’ouvrir plusieurs console afin d’utiliser les commandes docker et/ou de docker-compose que nous verrons par la suite.

Dockerfile

Le Dockerfile (respecter la casse !) permet de définir une image docker avec des commandes à exécuter lors que le conteneur sera exécuté.

Par exemple, je souhaite une image Python dans laquelle je veux utiliser Django :

  • charger (FROM) l’image python v3 du repository officiel Docker (https://hub.docker.com/_/python/),
  • créer (RUN mkdir /code) un répertoire code dans l’image qui devient le répertoire de travail (WORKDIR),
  • ajouter (ADD) le fichier local requirements.txt (de mon répertoire PC) sur le répertoire code créé sur l’image puis
  • exécuter (RUN) la commande pip install avec le fichier requirements.txt précédemment ajouté et enfin lié mon répertoire local au répertoire code (ADD), mon répertoire local étant où se trouvent les sources de mon projet et enfin
  • lancer (CMD) le serveur Web Django sur le port 9090
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install — no-cache-dir -r requirements.txt
ADD . /code/
CMD python manage.py runserver 0.0.0.0:9090

Chaque commande est exécuté dans un conteneur intermédiaire, chaque conteneur intermédiaire s’empile pour donner au final l’image. Cela signifie que la reconstruction d’une image s’applique uniquement aux nouveautés / modifications.

Il reste à construire l’image à partir de ces informations du Dockerfile, l’image est nommée “pythonweb”.

$ docker build -t pythonweb .

$ docker build .
Sending build context to Docker daemon 2.878MB
Step 1/9 : FROM python:3
 — -> 41397f4f2887
Step 2/9 : ENV PYTHONUNBUFFERED 1
 — -> Using cache
 — -> db12441599cf
Step 3/9 : RUN mkdir /code
 — -> Using cache
 — -> eb97c8d39b33
Step 4/9 : WORKDIR /code
 — -> Using cache
 — -> 41c7224eb774
Step 5/9 : ADD requirements.txt /code/
 — -> Using cache
 — -> 32f304d1b37a
Step 6/9 : ADD pyldap-2.4.37-cp36-cp36m-win_amd64.whl /code/
 — -> Using cache
 — -> b7f5a926df59
Step 7/9 : RUN pip install — no-cache-dir -r requirements.txt
 — -> Using cache
 — -> cb5bcc0cdab3
Step 8/9 : ADD . /code/
 — -> Using cache
 — -> 43a0144da58e
Step 9/9 : CMD python manage.py runserver 0.0.0.0:9090
 — -> Running in ae773975f0b8
 — -> c07251074739
Removing intermediate container ae773975f0b8
Successfully built c07251074739
Successfully tagged pythonweb:latest

l’image se crée sous le nom de pythonweb

on peut retrouver maintenant cette image dans le docker

$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
pythonweb latest c07251074739 56 seconds ago 822MB

Exécutons maintenant une instance de cette image dans un conteneur de façon détaché du terminal (-d), le port interne 9090 est mappé sur notre host sur le port 9090:

$ docker run -d -p 9090:9090 pythonweb

$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10b28263b1e7 pythonweb “/bin/sh -c ‘pytho…” 6 seconds ago Up 3 seconds 0.0.0.0:9090->9090/tcp hardcore_babbage

on peut arrêter le conteneur qui tourne

$ docker container stop 10b28263b1e7

10b28263b1e7
The command ‘/bin/sh -c python manage.py runserver 9090’ returned a non-zero code: 137

Note : sous docker toolbox (VM Virtualbox avec boot2docker), il peut y avoir un problème d’IP (le localhost:9090 ne sera pas atteignable), il faut passer par l’IP de la VM boot2docker, pour la connaitre, une inscructions simple :

$ docker-machine ip default
192.168.99.100

Le site du conteneur sera alors accessible par http://192.168.99.100:9090/

Commandes utiles

$ docker image prune : enlève les images inutilisées

$ docker image ls : liste des images créées

$ docker container ls / $ docker ps: liste des conteneurs lancés

$ docker rmi <imageid> : supprime une image, — force pour forcer

$ docker exec -it <containerid> bash : exécuter une commande dans un conteneur, ici, lance un bash dans le conteneur pour avoir une ligne de commande dans ce dernier

$ docker inspect <containerid> : donne tout un tas d’informations sur le conteneur

$ docker logs <containerid> : les logs lors du lancement du conteneur

$ docker-machine ls : liste des machines dockers, pour docker toolbox

Like what you read? Give Olivier DUVAL a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.