Isoler un processus dans un conteneur (Docker)

Pour la création de notre premier conteneur nous allons imaginer ce type de contexte :

On souhaite rendre accessible un site statique écrit en HTML et nous voulons savoir si mettre en place un serveur Nginx répondrait favorablement à cette problématique sans pour la peine de devoir installer une machine virtuelle qui prendrai de la place inutilement.

L'usage de docker est une bonne idée et il y a deux manière d'y parvenir. Soit on procède avec des fichiers de configuration que l'on pourra partager ensuite ou alors on agit uniquement en ligne de commande.

Pour éviter de se perdre, je recommande de suivre l'une des deux méthodes puis de se rendre en bas de page pour supprimer l'environnement qui a été créer puis de suivre l'autre méthode.

Dans tous les cas, on a besoin de ces outils :

sudo curl -sSL get.docker.com |sh
sudo curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

On définit quel utilisateur aura le droit de les utiliser :

usermod -aG docker mon_utilisateur

Depuis les fichiers source

Admettons que nous travaillons dans le répertoire de notre utilisateur courant et que le code source est le suivant :

mkdir ~/code
nano ~/code/index.html
index.html
<h1>Nous sommes dans le conteneur Nginx!</h1>

Réalisons maintenant l'image qui va contenir le logiciel Nginx :

nano Dockerfile
Dockerfile
FROM debian:jessie-slim
RUN apt-get update && apt-get install -f nginx-light -y && unlink /var/www/html/index.nginx-debian.html
CMD ["nginx", "-g", "daemon off;"]

Ces directives également présenté dans la documentation officielle signifie :

  • FROM : On se base ici sur l'image minimale de debian.
  • RUN : On exécute les commandes cité précédemment.
  • CMD : Est le code binaire initial lancé au début d'un conteneur. Sinon par défaut c'est bash.
docker build -t nginx .

–squash (pour compresser l'image et qu'il ait plus qu'une seule couche)

L'option -t permet de donner un nom à l'image que l'on peut voir ci-dessous:

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              a9f0a1c8198d        54 minutes ago      95.11 MB
<none>              <none>              5d9cf49643fb        55 minutes ago      79.95 MB
debian              jessie-slim         a3a956e095f3        2 weeks ago         79.95 MB

Il nous reste plus qu'a déployer le conteneur en lui attribuant des options qui sont également présent dans la documentation officielle :

La configuration suivante est écrite en YAML qui se sert de l'indentation comme structure. Si l'on ne respecte pas ceci alors docker-compose ne compilera pas le conteneur car il y aura une erreur.
docker-compose.yml
version: '2'
services:
  web:
    image: nginx
    ports:
     - "80:80"
    volumes:
     - ./code:/var/www/html

On décrit ici :

  • services : Utilisé pour lister les conteneurs que l'on souhaite déployer. Ici nous en avons qu'un seul qui s'appelle web.
  • image : On se base sur l'image que l'on vient de créer précédemment.
  • ports : Utile pour rendre accessible le conteneur sur le port 80 de la machine locale.
  • volumes: On monte le dossier qui contient les codes source du site.
docker-compose up -d

Après avoir lancé cette commande avec l'option -d qui indique que l'on lance le conteneur en arrière plan ; on doit voir le conteneur tourner :

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
f5da801cfa9b        nginx               "nginx -g 'daemon off"   About an hour ago   Up 2 seconds        0.0.0.0:80->80/tcp   nginx_web_1

Il est bien sur accessible sur notre machine !

Depuis le terminal

Ces manipulations sont plus destiné à des personnes expérimenté ou qu'il y a besoin de lancer un nouveau conteneur rapidement. Dans notre cas, ça va nous prendre une seule commande mais avant on peut choisir l'image qui contiendra Nginx sur le Hub.

Ce site contient toutes les images que les internautes partages. Faites attention à bien la choisir car il s'y trouve des configurations presque similairesn basé sur des système de fichiers différents dont le poids de l'image est variable. De ce fait, on va rester simple en se basant sur l'image officiel de Nginx.

Ainsi, en reprenant l'organisation du dossier de notre projet :

ls
code
code/index.html

On a besoin de juste lancer cette commande :

docker run --name web -v $(pwd)/code:/usr/share/nginx/html -d -p 80:80 nginx

Ces options veulent dire :

  • –name : Le nom du conteneur
  • -v : le dossier contenant le code source
  • -d : On met ce conteneur en arrière plan
  • -p : On rend accessible le conteneur sur le port 80 de la machine locale.
  • nginx : L'image sur laquelle on se base

On obtient bien encore une fois la même interface :