Articles tagués Docker

Juste un tutoriel Docker

Containeur au port de Lyon

Chargement d’un conteneur sur les quais du port fluvial de Lyon : http://www.yanngeoffray.com/photo-container/

Solomon Hykes, travaille pour DotCLoud à New-York lorsqu’il publie Docker en open-source le 13 mars 2013. Quatre ans plus tard, le succès est au rendez-vous et les contributeurs aux projets et sous-projets se comptent en milliers. Docker est une solution de virtualisation qui tourne de manière standard sous Linux dont il utilise certaines composantes. Initialement, Docker étendait le format de conteneur LXC (Linux Containers) avec une API RESTFul.  Docker se base maintenant sur une librairie propre nommée libcontainer.

Un écosystème se développe autours de l’outil incluant des services web comme DockerHub, des logiciels comme Compose, des gestionnaires comme Kubernetes, Mesos ou Docker swarm. Le mouvement informatique Devops se base sur Docker et sur les méthodes agiles pour le développement et la maintenance de nombreuses applications. Le dialogue entre développeurs et responsables des infrastructures informatiques s’en trouve grandement facilité. Mais qu’est-ce qu’un conteneur dans un environnement Linux ? Qu’est-ce qu’une image Docker et à quoi peut bien servir Docker Compose ?

Un conteneur est un système de virtualisation qui permet de faire tourner sur une machine Linux une application et ses dépendances dans un environnement indépendant du système d’exploitation. Docker comprend un client et un démon. Le client gère les commandes Docker et transmet les informations au démon qui fait le travail et retourne le résultat au client. Deux catégories principales d’objets sont ainsi manipulées : des images inactives susceptibles d’être échangées ou construites localement, et des conteneurs actifs ou ayant déjà tourné qui sont des instances des images. Les conteneurs font juste tourner des applications fonctionnelles dans un environnement Linux spécifié.

Des exemples de distribution Linux accessibles via Docker sont Debian, Linux Alpine ou Ubuntu. Un serveur comme Apache ou Nginx, un langage informatique tel que PHP, Python ou javascript/Node.js, une base de donnée comme MySQL, MariaDb, Redis ou Neo4j, un moteur de recherche comme Sphinx, ElasticSearch ou SolR, un gestionnaire de contenu tel que Drupal, WordPress ou Omeka constituent des exemples d’applications susceptibles d’être conteneurisées. Un conteneur se distingue d’une machine virtuelle par sa légèreté, par le fait que les ressources à mettre en oeuvre sont considérablement réduites, par le fait que les téléchargements sont réduits au minimum nécessaire.

La notion d’image peut être précisée. Une image est un fichier compressé qui contient une ou plusieurs couches d’autres images et une suite d’instructions. Un conteneur est créé lorsqu’une image est lancée. Plusieurs conteneurs peuvent être lancés à partir de la même image. Docker Hub https://hub.docker.com est un lieu d’échange d’images officielles et personnalisées. Tout le monde peut mettre à disposition (push) ou exploiter (pull) des images de multiples applications via cette plaque tournante en accès libre inspirée de GitHub.

Un autre outil – Docker Compose – s’avère rapidement indispensable pour orchestrer le fonctionnement de plusieurs conteneurs. Ceux-ci peuvent s’avérer nombreux car dans la pratique, il est préférable de fabriquer un conteneur par composante d’application ce qui facilite la gestion des versions, des variables et des volumes. Nous verrons dans ce tutoriel une méthode simple pour installer Docker et Docker Compose. Nous nous servirons de Docker Hub pour installer et le paramétrer un serveur Nginx tournant dans un environnement Linux alpine.

A moins de disposer de configurations récentes de Windows et Mac, Docker ne tourne nativement que sous Linux. Une machine virtuelle nommée Docker Toolbox permet néanmoins de faire fonctionner Docker et Docker Toolbox sur la plupart des systèmes d’exploitation récents Mac et Microsoft.

Docker (logiciel), LXC, Devops

  • Installer Docker sous Windows, 2016, Article
  • Docker for windows (64bit Windows 10 Pro et plus) : Article
  • Comment installer docker sur Mac OSX, 2016, Article
  • Docker for mac (macOS 10.10.3 Yosemite et plus) : Article
  • Docker usage statistics : Article
  • Docker outil indispensable du Devops, Programmez, 2017, Article

A. Installation de Docker

Sous Linux Debian, passage en mode administrateur

sudo su

Installation de Docker

apt-get install -y docker.io

Démarrage du démon Docker

/etc/init.d/docker start

Liste des commandes Docker

docker

Aide en ligne de commande sur les instructions avec –help

docker run --help

Une documentation officielle se trouve sur docs.docker.

B. Commandes Docker

Plusieurs actions sur différentes sortes d’objets sont alors possibles :

  1. Actions sur les conteneurs : attach, cp, create, diff, exec, export, kill, logs, pause, port, ps, rename, restart, rm, run, start, stats, stop, top, unpause, update, volume, wait
  2. Actions sur les images : build, commit, history, images, import, load, rmi, save, tag
  3. Echanges avec Docker Hub ou avec un entrepôt local : login, logout, pull, push, search
  4. Actions générales liées à Docker : events, info, inspect, network, node, service, swarm, version

C. Le conteneur “hello-world”

Un premier conteneur est démarré :

docker run hello-world

Plusieurs opérations se déroulent successivement avec l’instruction “run”. Si l’image du nom de “hello-world” est absente localement, celle-ci est recherchée sur Docker hub et téléchargée. Elle devient alors référencée comme image disponible dans l’entrepôt local et ne sera téléchargée ainsi qu’une seule fois. Puis le conteneur “hello-world” est lancé. Il affiche un message qui récapitule les actions du client et du démon Docker déclenchées par l’instruction “run” :

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world

78445dd45222: Pull complete 
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

D. Le conteneur alpine

Alpine est une distribution Linux légère dont il est possible de télécharger l’image avec Docker. Créée en 2010, cette distribution se déclare indépendante, non commerciale, et généraliste, adaptée pour les personnes qui apprécient la sécurité, la simplicité et l’efficacité de leur système d’exploitation. Faisons tourner un conteneur alpine et entrons à l’intérieur de celui-ci pour voir ce qui s’y passe.

Alpine Linux, Linux alpine : https://alpinelinux.org/

1/ Téléchargement d’alpine

Chercher les images Alpine sur Docker Hub

docker search alpine

Téléchargement de l’image officielle

docker pull alpine

Historique de l’image alpine

docker history alpine

Affiche des images présentes localement

docker images

2/ Lancement du conteneur alpine

L’instruction “run” vérifie que l’image “alpine” est présente dans le répertoire Docker local. En cas d’absence, le téléchargement est fait. Le conteneur correspondant à l’image est ensuite lancé. La commande “ls -l” passée en argument affiche la liste des répertoires et fichiers dans l’environnement alpine.

docker run alpine ls -l

Une autre commande peut être testée.

docker run alpine echo "Salut la compagnie, ohé, ohé, ohé"

Celle-ci affiche le message : le client après avoir lancé un conteneur “alpine” fait tourner la commande “echo”. Il transmet les instructions au démon qui fournit le résultat. Entrons maintenant à l’intérieur d’un conteneur.

docker run -it alpine /bin/sh

Nous sommes à l’intérieur du conteneur alpine et pouvons entrer des commandes telles que “ls -s” ou “uname -a”. Pour la sortie : “exit”.

3/ Quelques commandes Docker

D’autres commandes que « run » s’avèrent intéressantes.  Elles sont assorties d’options parmi lesquels -i (interactif), -t (allocation d’un pseudo TTY), -d (conteneur en arrière plan, détaché), -a (all) sont souvent utilisées. Liste des conteneurs actifs, liste des conteneurs actifs et inactifs :

docker ps
docker ps -a

Arrêt d’un conteneur actif en spécifiant l’id ou le nom

docker stop 16566238781a

Suppression dans l’entrepôt d’un conteneur préalablement stoppé

docker rm 16566238781a

Liste des images

docker images

Liste des métadonnées associées à une image

docker inspect hello-world

Suppression d’une image

docker rmi hello-world

Nettoyage de tous les conteneurs inactifs et de toutes les images inutilisées

docker rm $(docker ps -a -q)
docker rmi $(docker images -q)

E. Construire son image avec Dockerfile

Des images personnalisées peuvent aussi être construites sur la base du contenu d’un fichier Dockerfile. Des commandes répondant à une syntaxe particulière spécifient des couches d’instructions qui différencient l’image produite d’une image standard. La première des commandes est FROM qui précise l’image de départ (la toile du peintre). D’autres  sont ADD, CMD, COPY, ENTRYPOINT, ENV, EXPOSE, MAINTAINER, RUN, USER, VOLUME, WORKDIR… Des volumes peuvent ainsi être montés ou copiés (ADD, COPY), des commandes Linux tournent (CMD, RUN), etc. Pourquoi ne pas se lancer avec un exemple basique ? Dans un répertoire images, édition d’un fichier Dockerfile :

mkdir images
cd images
gedit Dockerfile

Contenu de Dockerfile. L’affichage de la liste des répertoires courants d’un conteneur Linux alpine est demandé.

FROM alpine
CMD ["ls","-al"]

Construction de l’image “mon-alpine” marquée du tag latest.

docker build -t mon-alpine:latest .

Liste des images présentes dans l’entrepôt local

docker images

Lancement du conteneur “mon-alpine”.

docker run -it mon-alpine

F. Orchestrez vos applications avec Docker Compose

Les applications tournent généralement dans plusieurs conteneurs qui partagent des volumes, sont liés, démarrés ou arrêtés simultanément. Docker Compose est un outil officiel de Docker qui facilite grandement ce genre d’opérations. Docker Compose ne fait pas partie de docker.io. Son installation s’avère plus aisée en passant par les bibliothèques python accessibles via pip. Les instructions successives fournies à Docker Compose sont listées dans docker-compose.yml, un fichier au format Yaml. L’image hello-world est ici lancée avec Compose.

1/ Installation de docker-compose

apt-get -y install python-pip
pip install docker-compose

2/ Quelques instructions et aides
Vous pouvez tester quelques unes des commandes et arguments suivants :

docker-compose
docker-compose -v
docker-compose -h
docker-compose up --help
docker-compose ps
docker-compose stop
docker-compose rm

3/ Edition d’un fichier docker-compose.yml

mkdir hello-world
cd hello-world
gedit docker-compose.yml

Le fichier docker-compose.yml est créé dans le répertoire “hello-world”. Avec YAML, format respecté par ce fichier, l’indentation est significative . Le # indique un commentaire. La version 2 de docker-compose est spécifiée. Lancement d’un conteneur nommé “mon-test” à partir de l’image “hello-world”. Plutôt basique comme symphonie !

# hello-world avec docker-compose
version: "2"
services:
  mon-test:
    image: hello-world

4/ Lancement de Docker Compose

docker-compose up

Affichage :

Starting helloworld_mon-test_1
Attaching to helloworld_mon-test_1
mon-test_1  | 
mon-test_1  | Hello from Docker!
mon-test_1  | This message shows that your installation appears to be working correctly.
mon-test_1  | 
mon-test_1  | To generate this message, Docker took the following steps:
mon-test_1  |  1. The Docker client contacted the Docker daemon.
mon-test_1  |  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
mon-test_1  |  3. The Docker daemon created a new container from that image which runs the
mon-test_1  |     executable that produces the output you are currently reading.
mon-test_1  |  4. The Docker daemon streamed that output to the Docker client, which sent it
mon-test_1  |     to your terminal.
mon-test_1  | 
mon-test_1  | To try something more ambitious, you can run an Ubuntu container with:
mon-test_1  |  $ docker run -it ubuntu bash
mon-test_1  | 
mon-test_1  | Share images, automate workflows, and more with a free Docker ID:
mon-test_1  |  https://cloud.docker.com/
mon-test_1  | 
mon-test_1  | For more examples and ideas, visit:
mon-test_1  |  https://docs.docker.com/engine/userguide/
mon-test_1  | 
helloworld_mon-test_1 exited with code 0

Le conteneur “hello-world” a tourné et les commentaires s’affichent.

L’aide officielle (anglais) :

G. Un serveur nginx avec Docker

Nginx (prononcer « engine-x ») est un serveur Web open source développé originellement par Igor Sysoev pour les besoins d’un site moscovite à fort trafic. Ses objectifs en 2002 étaient de mettre au point un serveur haute performance dont la consommation en mémoire est faible comparativement à Apache. Écrit en C, le logiciel se caractérise par son architecture modulaire. Nginx devient très employé à partir de 2006, date de la traduction en anglais de la doc.

Nous allons pour conclure ce billet faire tourner un serveur Nginx avec Docker en employant trois méthodes différentes. Le système de fichier à construire est le suivant :

├── app
│   └── index.html
├── nginx
│   └── default.conf
├── Dockerfile
└── docker-compose.yml

1/ Page d’accueil de l’application

mkdir app
gedit ./app/index.html

Contenu d’index.html :

Hello world !

2/ Fichier de configuration du serveur

mkdir nginx
gedit ./nginx/default.conf

Contenu de default.conf

server {
    index index.html;
    server_name test;
    root /app;
}

3/ Fichier Dockerfile

gedit Dockerfile
FROM nginx:alpine
COPY /app /usr/share/nginx/html
COPY /nginx/default.conf /etc/nginx/conf.d/site.conf

4/ Fichier docker-compose.yml

gedit docker-compose.yml

Contenu :

# Nginx sur le port 8080
version: "2"
services:
  mon-nginx:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./app:/usr/share/nginx/html
      - ./nginx/default.conf:/etc/nginx/conf.d/site.conf

4/ Démarrage du conteneur

Il est souhaité que le conteneur mon-nginx contenant la dernière image stable de Nginx tourne sur le port 8080 et serve les pages web localisées sous /app. Trois méthodes différentes sont successivement employées pour cette opération.

a/ En ligne de commande
Le conteneur mon-nginx est démarré sur le port 8080 en mode détaché -d. L’option -p indique le port. L’option -v précise le montage des volumes. Attention aux chemins ! Vous devez indiquer le chemin absolu ce que se fait ici avec $(pwd).

docker run --name mon-nginx -p 8080:80 -v $(pwd)/app:/usr/share/nginx/html -v $(pwd)/nginx/default.conf:/etc/nginx/conf.d/site.conf -d nginx:stable

Le navigateur affiche « Hello World ».
http://localhost:8080/

Arrêt et suppression de ce premier conteneur « mon-nginx » :

docker stop mon-nginx
docker rm mon-nginx

b/ Avec Dockerfile

Construction d’une image nommée df-nginx avec Dockerfile

docker build . -t df-nginx

Lancé à partir de l’image df-nginx, le conteneur mon-nginx tourne en mode détaché sur le port 8080 :

docker run --name mon-nginx -d -p 8080:80 df-nginx

Le conteneur tourne-t-il correctement ?
http://localhost:8080/

Arrêt et suppression du deuxième conteneur mon-nginx, suppression de l’image df-nginx :

docker stop mon-nginx
docker rm mon-nginx
docker rmi df-nginx

c/ Avec Docker compose

Lancement d’un conteneur avec Compose. Le fichier docker-compose.yml est pris en compte. Les logs s’affichent.

docker-compose -up

Nous ne sommes pas en mode détaché: Arrêt du conteneur avec « Ctrl C ». Suppression du troisième conteneur.

docker rm mon-nginx

Quelques liens : Nginx, https://hub.docker.com/_/nginx/

Documentation Docker nginx (en) : Site

Images Omeka S avec Docker :

Conclusion

Vous disposez maintenant d’un Docker et d’un Docker Compose fonctionnels. Vous savez construire vos images et lancer de différentes manières un conteneur Linux alpine et un serveur nginx, applications optimisées pour leur faible consommation en ressources. Les choses sérieuses peuvent commencer.

A suivre avec quelque chose sur l’art…

Publicités

,

1 commentaire