Docker

Introduction

par

Marek Goldmann

10 Déc 2013

Docker

Docker ?

Un projet pour créer et gérer des conteneurs.

Conteneurs ?

Oui, une virtualisation de système d'exploitation légère.

Quelle comparaison par rapport à une machine virtuelle?

C'est complètement différent.

Comparaison

Machine virtuelle (KVM, VMware)Conteneur (LXC, OpenVZ)
MatérielSimuléL'utilise (presque) en direct
OS supportésPresque tousSeulement Linux
EspaceEspace utilisateurEspace noyau
SéparationComplèteControl Groups (cgroups)
Temps démarrageSecondes à minutesMilisecondes
Passage échelleQuelques uneInfini (milliers)
Noyau spécifiqueOuiNon
Fonctions avancées (migration live, etc)OuiNon
Facilité de créationMoyenneFacile
Durée requise à créationLongueCourte
TailleENORMEPetite

Qui est derrière Docker?

dotCloud* et une communauté puissante.

* dotCloud, Inc. a été renommée en Docker, Inc. récemment

En parlant de la communauté...

  • GitHub
    • 501 watches
    • 6948 étoiles
    • 847 forks
    • 406 tickets ouverts
    • 69 pull requests
  • Plus de 200 contributeurs
    • en moy. 13 commits / jour
    • 92% sont externes
  • De nombreuses rencontres partout dans le monde

Atteint seulement après 10 mois depuis le premier commit sur GitHub

Glossaire

  • Image : un package avec un filesystem et des données
  • Conteneur : une image en fonctionnement
  • Registry : endroit où les images sont stockées/partagées

Concepts principaux

  • Une image peut être liée à une image parente
  • Les images sans parent sont appelées image de base
  • Un conteneur a un état, alors que les images n'en ont pas
  • Vous pouvez lancer de multiples conteneurs à partir d'une image

Composants de Docker

Manager

Fait fonctionner, démarre, arrête, etc... sur les conteneurs

Builder

Crée les images

Registry des images

Stockage pour les images

Créer des images Docker

C'est facile ! On utilise des Dockerfiles.

Dockerfile

Un fichier texte avec des instructions qui automatisent la fabrication de l'image.

Exemple de Dockerfile


# Se base sur une image de Fedora 20
FROM mattdm/fedora

# Met à jour l'image
RUN yum -y update

# Installe java
RUN yum -y install java-1.7.0-openjdk-devel wget

# Récupère WildFly
RUN wget http://download.jboss.org/wildfly/8.0.0.Beta1/wildfly-8.0.0.Beta1.tar.gz -O /opt/wildfly.tar.gz
RUN tar -xf /opt/wildfly.tar.gz -C /opt

# Lance WildFly au démarrage du conteneur
ENTRYPOINT /opt/wildfly-8.0.0.Beta1/bin/standalone.sh -c standalone-ha.xml -b 0.0.0.0
					

Ceci devrait être sauve dans le fichier appelé Dockerfile

Instructions de base

  • FROM : l'image sur laquelle on se base / qu'on étend
  • RUN : La commande à exécuter à la fabrication
  • ENTRYPOINT : La commande à exécuter après le démarrage du conteneur

Mais il y en a beaucoup d'autres !

Fabrication de l'image

docker build .

Fabrication de l'image


$ docker build .
Uploading context 10240 bytes
Step 1 : FROM mattdm/fedora

[SNIP]

Step 4 : RUN wget -q http://download.jboss.org/wildfly/8.0.0.Beta1/wildfly-8.0.0.Beta1.tar.gz -O /opt/wildfly.tar.gz
 ---> Running in 41467b97b423
 ---> 112766c23202
Step 5 : RUN tar -xf /opt/wildfly.tar.gz -C /opt
 ---> Running in d07d0c5c3dab
 ---> c53f9f4ceb1e
Step 6 : ENTRYPOINT /opt/wildfly-8.0.0.Beta1/bin/standalone.sh -c standalone-ha.xml -b 0.0.0.0
 ---> Running in a9b2cecf4db5
 ---> 5894688e4f2e
Successfully built 5894688e4f2e
          

Nous avons fabriqué l'image 5894688e4f2e

Modification de l'image

  1. Changer le Dockerfile
  2. Exécuter la commande build à nouveau

Parlons de rapidité


$ time docker build .
Uploading context 10240 bytes
Step 1 : FROM mattdm/fedora
 ---> 0f3e92b4e94d

[SNIP]

Step 4 : RUN wget -q http://download.jboss.org/wildfly/8.0.0.Beta1/wildfly-8.0.0.Beta1.tar.gz -O /opt/wildfly.tar.gz
 ---> Using cache
 ---> 2ad6655478dd
Step 5 : RUN tar -xf /opt/wildfly.tar.gz -C /opt
 ---> Using cache
 ---> c0f63f06e9ec
Step 6 : RUN touch /etc/something
 ---> Running in 8426dd5570af
 ---> 7ef016a00cde
Step 7 : ENTRYPOINT /opt/wildfly-8.0.0.Beta1/bin/standalone.sh -c standalone-ha.xml -b 0.0.0.0
 ---> Running in 60bfa9d3a746
 ---> e757e0ea05d7
Successfully built e757e0ea05d7

real  0m0.307s
user  0m0.000s
sys 0m0.018s
          

Nous avons construit une nouvelle image e757e0ea05d7

Oui, 300ms!

Comment ça marche

  1. Préparation de l'exécution d'une instruction
    • Est-ce que l'instruction a déjà été exécutée auparavant ?
      • oui - utiliser le résultat précédent, aller au #3
      • non - exécuter l'instruction, aller au #2
  2. Est-ce que l'instruction s'est exécutée sans erreur ?
    • oui - commit, aller au #3
    • non - interromptre le build
  3. Est-ce que c'est la fin des instructions ?
    • oui - commit, fini !
    • non - aller au #1

Parlons de taille


$ docker images

REPOSITORY          TAG                 ID                  CREATED             SIZE
<none>              <none>              e757e0ea05d7        37 minutes ago      12.29 kB (virtual 1.056 GB)
<none>              <none>              5894688e4f2e        46 minutes ago      12.29 kB (virtual 1.056 GB)
					

Oui, 12.29kB!

Référentiels d'images

  1. Privé : par exemple hébergé à l'intérieur d'une entreprise
  2. Public : index.docker.io

Commandes Docker CLI

docker pull

Récupérer une image ou un repository dans le registry

docker push

Transmettre une image depuis le registry vers un repository

docker run

Lance une commande dans un nouveau conteneur basé sur l'image spécifiée

docker stop

Arrête un conteneur

docker start

Démarre un conteneur arrêté

docker rm

Supprime un conteneur arrêté

docker rmi

Supprime une image du registry

OK, super, mais...

Cas d'utilisation ?

  • Voulez-vous votre propre PaaS?
  • Tests automatisés et CI
  • Deployer des applis qui passent à l'échelle
  • plateforme de déploiement d'applications

PaaS

Il est (relativement) facile de créer une PaaS avec Docker

Il y a même un tutoriel pour en créer une en 5 minutes...

OpenShift

https://github.com/openshift/openshift-pep/blob/master/openshift-pep-010-docker-cartridges.md

Intégration Continue (CI)

  1. Vous committez
  2. la CI construit l'appli
  3. la CI crée une image avec votre nouvelle appli
  4. la CI démarre un conteneur à partir de cette nouvelle image
  5. les tests d'intégration sont exécutés sur une application réelle
  6. Bénéfice !

Applis passant à l'échelle

  • Prérequis : préparer son appli pour qu'elle passe facilement à l'échelle
  • Démarrer un conteneur est rapide et pas cher
  • Étendre un cluster (par exemple WildFly) devient facile
  • Bénéfice !

Plateforme de déploiement

Fabriquer une fois - exécuter n'importe où !

  • Télécharger facilement et rapidement
  • Mettre à jour les images est également facile

Bénéfice !

Par où commencer ?

yum install docker-io

http://docs.docker.io/en/latest/use/basics/

Merci !

Remerciements :

  • https://www.docker.io/