docker-presentation



docker-presentation

0 1


docker-presentation


On Github rody / docker-presentation

Build, Ship, Run

Any application Anywhere

...ou comment réconcilier les Devs et les Ops

C'est quoi ?

 

Docker est un outil permettant d'empaqueter une application et ses dépendances dans un conteneur (container en anglais) virtuel, qui pourra être exécuté sur n'importe quel serveur Linux.

Docker, le slogan

 

Build : Construction d'images d'applications

Ship : Distibution des images via les registries

Run : Execution d'application dans des containers

Any application : Tout ce qui tourne sous Linux

Anywhere : laptop, cloud, VM, bare metal, ...

The big picture

  • Basé sur LXC (LinuX Containers)
  • Moteur open-source pour simplifier LXC
  • 'Copy-on-Write' pour un provisionning rapide
  • Défini un format standard pour les containers
  • Permet de créé et de partager des images

LXC avant Docker

LXC avec Docker

Quelques cas d'utilisation

  • Déployer plusieurs versions d'une application sur un serveur
  • Faciliter la scalabilité horizontale
  • Déployer de la même manière en Dev que sur la Prod
  • ....

Un peu d'histoire...

...du transport de marchandises

Avant 1960

Après 1960

Et c'est quoi le rapport avec le DevOps ?

Avant docker

Et souvent cela se terminait en...

Dev vs Ops, FIGHT !

Avec Docker

Dev

Les développeurs s'occupent de l'intérieur du container. Ils installent les dépendances et les applications, ils construisent les images.

Les Ops s'occupent de configurer et de déployer les containers sur les différents environnements.

Ops

Container vs Virtual Machines

Avantages des containers

  • Les processus sont isolés mais tournent directement sur l'hôte
  • Perfs CPU = performaces natives
  • Perfs Mémoire = performances natives
  • Perfs réseau = légere surcharge (qui peut être réduite à 0)

Mon premier container

 

docker run -p 5984:5984 tutum/couchdb

 

Lance un container à partir de l'image 'tutum/couchdb' et mappe le port 5984 du container sur le port 5984 de l'hôte

 

  => Waiting for confirmation of CouchDB service startup
  Apache CouchDB 1.5.0 (LogLevel=info) is starting.
  Apache CouchDB has started. Time to relax.
  [info] [<0.32.0>] Apache CouchDB has started on http://0.0.0.0:5984/
  [info] [<0.107.0>] 127.0.0.1 - - GET / 200
  => Creating an admin user with a random password in CouchDB
  [info] [<0.108.0>] 127.0.0.1 - - PUT /_config/admins/admin 200
  ""
  => Done!
  

Revoyons la scène au ralenti...

Etapes de la création d'un container

 

docker run -p 5984:5984 tutum/couchdb

 

L'image tutum/couchdb est récupérée depuis le registry global un container est créé à partir de l'image le port 5984 est mappé sur l'hôte le container est démarré

(BUILD)

Images

Ce sont des 'templates' de containers

récuperer une image depuis un registry

docker pull NAME[:TAG]

pousser une image sur le registry

docker push NAME:[TAG]

construire une image à partir d'un fichier Dockerfile

docker build .

construire une image à partir d'un container

docker commit CONTAINER [REPOSITORY][:TAG]

Dockerfile

FROM ubuntu:14.04             # hérite d'une image de base

RUN apt-get update && \       # installation des dépendances
  apt-get install -y couchdb pwgen && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/*

RUN mkdir /var/run/couchdb
ADD run.sh /run.sh && chmod 755 /*.sh

EXPOSE 5984                   # info sur le port 'exposable'
VOLUME ["/var/lib/couchdb"]   # création d'un volume
CMD ["/run.sh"]   # la commande lancée lorsque que le container démarre
  

construire l'image

docker build -t my_couchdb .

(RUN)

Containers

Ce sont les unités d'éxécution

 

Ils permettent d'exécuter le processus définit dans l'image en isolation des autres containers et du l'OS hôte

 

Un container possède:

  • son propre filesystem
  • sa propre couche réseau (IP, /etc/hosts, ...)

Création d'un container

Un container est toujours créé à partir d'une image

 

docker run [OPTIONS] IMAGE

Crée et démarre un container à partir de l'image IMAGE

Contraintes d'éxécution

Docker permet de controller les ressources aloués aux containers

  • Memory : Quantité de RAM
  • Swap : Quantité de swap
  • CPU : % de temps CPU

Privilèges, capacités, ...

Par défaut, les containers son non-privilégiés.

 

Les privilèges suivants peuvent être activés

  • Accès aux 'devices' (carte son, usb, disque,...)
  • Accès étendu au kernel

 

En mode privilégié, on peut faire tourner docker dans docker !

Docker

dans

Docker

dans

...

(SHIP)

Registries

Ce sont les composants de diffusion

 

Ils permettent de stocker et diffuser les images

 

Chaque image est reférencé dans un registry par son NOM et un TAG

Interaction avec un registre

 

Récupérer une image depuis un registre

docker pull [IMAGE][:TAG]

 

publier une image sur un registre

docker push [IMAGE][:TAG]

Versionning des images

Le TAG peut s'apparenter à un numéro de version, et permet d'identifier l'image de manière unique

 

ex: les images officielles MongoDB

  • mongo:2.2
  • mongo:2.2.7
  • mongo:3.0.3
  • mongo:latest

Le registre global

Docker maintient un registre global

https://registry.hub.docker.com/

C'est de ce registre que les images sont téléchargée par défaut

Exemple: déploiement de Wordpress

Étape 1: Création du container MySQL

docker run -d --name some-mysql \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.6

 

Étape 2: Création du container Wordpress

docker run --name some-wordpress \
  --link some-mysql:mysql -p 8080:80 -d wordpress

 

Done !

Encore plus simple avec

docker-compose

Étape 1: Création du fichier docker-compose.yml

 wordpress:
  image: wordpress
  ports:
    - "8081:80"
  links:
    - db:mysql
db:
  image: "mysql:5.6"
  environment:
    - MYSQL_ROOT_PASSWORD=my-secret-pw
  

 

Étape 2: Démarrage des containers

docker-compose up

Done !

Le tools in action

  • Création d'une image avec une application web
  • Déploiement du load-balancer HAProxy avec Docker
  • Scaling horizontal de l'appli web