Docker: Un gestionnaire de conteneurs très léger

Docker virtualise uniquement les applications et plus l’intégralité d’un système d’exploitation invité, il révolutionne donc la virtualisation classique en se définissant comme un gestionnaire de conteneurs, ces conteneurs sont ensuite cloisonnés comme de simples processus et communiquent avec le système d’exploitation hôte avec sa propre API. Docker permet également de faire communiquer plusieurs conteneurs entre eux et donc de séparer les couches comme par exemple le serveur applicatif et une base de données.

Les services de Docker

Le moteur de docker n’est pas qu’un environnement d’exécution léger et portable, docker propose également un service de partage sur le Cloud pour distribuer les applications et automatiser les flux, le PAAS (platform as service). Docker permet aux administrateurs systèmes de construire, transporter, et lancer des applications distribuées ; le principe est d’assembler les applications à partir de composants et de garantir le même fonctionnement sur n’importe quelle plate-forme qu’elle soit sur le Cloud, sur une machine virtuelle dans un data center ou simplement sur un pc portable.

Dockerisation

Toutes les applications peuvent être « dockerisée » dans le sens où il est possible de créer un script qui va simplement décrire les étapes d’installation. Tous ces scripts peuvent être stocké sur le « Docker hub » à la manière de Git avec une syntaxe proche, un compte sur Docker peut rapidement être crée si on possède déjà des accès à Github.

Des milliers d’applications sont déjà « dockérisées » et disponibles (45000 images sont stockées sur Docker hub), docker se charge de gérer les changements et les dépendances. Les développeurs peuvent s’échanger ces dépendances et les administrateurs comprennent plus facilement comment les développeurs travaillent. Dockeriser une application signifie que l’on s’affranchit des différences entre les systèmes d’exploitation et les nombreuses distributions, de plus il est possible de moduler les performances lors de montée ou baisse de charge. L’entièreté du système d’exploitation invité en plus de toutes les librairies et exécutables de l’application sont contenus dans la machine virtuelle, cela peut peser une dizaine de gigas. Le moteur de docker contient uniquement l’application et ses dépendances et tourne comme un processus isolé du système d’exploitation hôte. Le poids est grandement réduit.

Sous le capot

Docker est écrit en langage GO  et utilise différents noyaux spéciaux de Linux, il étend le système LXC avec sa propre API. Il fonctionne en 2 parties, le client et le deamon, chacune de ces parties peuvent être installées séparément, on peut héberger le deamon sur Docker hub par exemple ou sur Microsoft Azure depuis le 8 janvier.

IMAGE

Le lien avec ce blog

A partir de maintenant, et comme je l’ai fait précédemment pour VirtualBox, je m’efforcerai de fournir dans mes articles, tous mes environnements de tests avec Docker qu’ils soient existants et futurs, ce sera donc ma nouvelle norme de virtualisation que j’adopterai pour reproduire les exemples montrés sur ce blog.

Installation

L’installation de Docker dépend de votre OS, étant donné qu’il tourne sur un noyau spécial de Linux, vous devrez installer boot2docker pour les versions OSX et Windows et émuler le moteur de docker avec VirtualBox qui est contenue dans le package.

article21_img2_docker_virtualisation_alegee

boot2docker init

Utilisation

Pour info, un tutoriel complet pour se faire la main est disponible. Une fois Docker  installé, lancez ces premières commandes:

# Affiche la version de Docker
$ docker version

# Affiche les différentes commandes et options
$ docker help

# Affiche les infos courantes du client Docker
$ docker info 

Lancement d’un premier conteneur

$ docker run -i -t ubuntu /bin/bash 

Les différentes opérations qui en découlent sont:

  • Téléchargement d’une image ubuntu sur Docker hub dans sa dernière version (sauf si vous l’avez en local)
  • Création et ouverture d’un conteneur ubuntu (système de fichiers et réseau)
  • Lancement d’une invite de commande bash

Tapez ensuite la commande « ls« , le shell affiche les différents répertoires de la distribution ubuntu. Testez d’autres commandes comme « pwd » ou « uname -a« 

article21_img4_docker_virtualisation_alegee

DockerFile

La partie la plus intéressante de cet outil est la création de fichier « Dockerfile », en effet il s’agit de créer un fichier texte qui va contenir l’ensemble des opérations de créations d’un environnement, un autre tutoriel est disponible ici, il s’agira ensuite de compiler ce fichier pour que Docker construise le conteneur correspondant.

Un exemple avec le Dockerfile de PostgreSQL

# example Dockerfile for http://docs.docker.com/examples/postgresql_service/

FROM ubuntu
MAINTAINER SvenDowideit@docker.com

# Add the PostgreSQL PGP key to verify their Debian packages.
# It should be the same key as https://www.postgresql.org/media/keys/ACCC4CF8.asc
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8

# Add PostgreSQL's repository. It contains the most recent stable release
#     of PostgreSQL, ``9.3``.
RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list

# Install ``python-software-properties``, ``software-properties-common`` and PostgreSQL 9.3
#  There are some warnings (in red) that show up during the build. You can hide
#  them by prefixing each apt-get statement with DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y python-software-properties software-properties-common postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3

# Note: The official Debian and Ubuntu images automatically ``apt-get clean``
# after each ``apt-get``

# Run the rest of the commands as the ``postgres`` user created by the ``postgres-9.3`` package when it was ``apt-get installed``
USER postgres

# Create a PostgreSQL role named ``docker`` with ``docker`` as the password and
# then create a database `docker` owned by the ``docker`` role.
# Note: here we use ``&&\`` to run commands one after the other - the ``\``
#       allows the RUN command to span multiple lines.
RUN    /etc/init.d/postgresql start &&\
    psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" &&\
    createdb -O docker docker

# Adjust PostgreSQL configuration so that remote connections to the
# database are possible.
RUN echo "host all  all    0.0.0.0/0  md5" >> /etc/postgresql/9.3/main/pg_hba.conf

# And add ``listen_addresses`` to ``/etc/postgresql/9.3/main/postgresql.conf``
RUN echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf

# Expose the PostgreSQL port
EXPOSE 5432

# Add VOLUMEs to allow backup of config, logs and databases
VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]

# Set the default command to run when starting the container
CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]

Différentes commandes sont exécutées comme un scénario

  • FROM: récupère l’image de base qui est la couche sur laquelle reposera le conteneur, elle est obligatoire (ex: ubuntu, debian,etc…) on peut spécifier la version, la dernière étant prise en compte si non spécifiée.
  • RUN: exécute une commande sur la nouvelle couche puis fait un commit
  • CMD: ne s’exécute pas à la construction mais uniquement lorsque le conteneur est monté
  • EXPOSE: informe docker des ports d’écoute

Une fois ce fichier Dockerfile créé à la racine et sauvegardé (vi Dockerfile puis :wq pour sauvegarder), il faut ensuite le construire

docker build . 

 … plus simple, vous pouvez faire un pull depuis le docker hub

# Rapatrie l'image officielle de postgres
$ docker pull postgres

# Affiche les images disponibles en local
$ docker images

# Lancer la DB postgres
$ docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres

Ne reste plus qu’à télécharger pgadmin et à vous y connecter sur le port 5432, plus d’infos sur cette page 😉

Conclusion

Même si le principe de l’encapsulation de conteneurs introduit par Solaris il y a plus de 10 ans n’est pas nouveau, le projet Docker a pu s’imposer dans le monde de l’open source et de la silicon valey comme une référence, comme dirait son concepteur en étant au bon endroit au bon moment, beaucoup de partenaires veulent faire de docker un standard, Microsoft l’ayant fait depuis ce 8 janvier avec Azure, espérons que d’autres suivront cette voie.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Petit calcul pour valider votre commentaire! merci * Time limit is exhausted. Please reload CAPTCHA.