Introduction à Docker
Monter un environnement de développement portable
16 / 02 / 2017 - RMK - @OctoTechnology Rabat



Lui c'est Zlatan ...
Docker ... kesako
«Build. Ship. Run. Any app. Anywhere.»
Conteneurisation
-
Isoler un processus et ses dépendances dans une unité auto-contenue (conteneur)
- Isolation réseau (IP, routage, firewall unique par conteneur)
- Isolation filesystem
- Isolation des utilisateurs/groupes
- Isolation des processus: diminution de la surface d’attaque (sécurité accrue)
-
Imposer des limites de ressources (CPU, RAM, I/O, etc) à ce processus
- Meilleure gestion de consommation
Containers
Virtualization


©Toptal
-
Réutilisation des librairies et données entre les conteneurs
-
Moins lourd
-
Isolation via le kernel => Ressources presque natives
-
Le provisionnement se fait en millisecondes
-
... Mais
-
Plus difficile à superviser
-
Qui se charge des maj de sécurité ?
-
Quelle stratégie de sauvegarde pour mes conteneurs
-
Combien de ressources vont consommer les containers en production ?
-
Chaque machine est un OS à part entière
-
Plus lourd
-
Consommation de ressources non négligeable
-
Il faut attendre le temps que l'OS de la machine démarre
-
...
«Saying a container is a light VM is like saying a folder is a light partition»
Thomas Maurice <3
Architecture Docker
Architecture Docker : Image
- Une image Docker est un empilement de couches non modifiables (read-only layers) dans un système de fichier d'union
- Chacune de ces couches contient un ensemble de modifications apportées par rapport à la couche précédente
- Une image est non modifiable
- Une image est utilisée pour lancer un conteneur
- Une image peut être utilisée comme image de base d’une autre image
- Chaque instruction du Dockerfile correspond à une layer dans l’image

$ docker history nginx
Les layers sont mises en cache pour accélérer la construction d’image
Architecture Docker : Container
- Empilement d'une image et d'une couche modifiable (writable layer) non
persistée (!) - La couche modifiable contient les modifications apportées par l'utilisateur et l'application
- Lancé via docker run


Premiers pas avec Docker
$ docker pull ubuntu:trusty
$ docker images
# Cette commande crée un conteneur à partir de l'image ubuntu:trusty,
# y lance le programme bash et y attache votre shell grâce aux options -it
$ docker run -it ubuntu:trusty bash
root@2cdceb5ff771:/#
root@9faa92029990:/#
$ apt-get moo
# Sortez avec Ctrl + D
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9faa92029990 ubuntu:trusty "bash" 12 minutes ago Exited (0) 2 minutes ago crazy_watermelon
Essayons avec node ...
$ docker pull node:latest
$ docker images
$ docker run -d --name node-app -p 3000:3000 -v $(pwd):/app node:latest node /app/server.js
9faa920299901147dbbbe614c68cb6044df4e99bb480f14eb5b10ee083c1fc06
// Créer un fichier server.js avec le contenu suivant ...
var http = require('http')
var server = http.createServer(function(req, res) {
res.end('Coucou depuis Docker')
});
server.listen(3000)
DockerFile
Les Dockerfiles sont des fichiers qui permettent de construire une image Docker adaptée à nos besoins, étape par étape
FROM node:latest
# Install useful stuff
RUN apt-get update \
&& apt-get install -y curl vim \
&& rm -rf /var/lib/apt/lists/*
# Prepare app directory
RUN mkdir -p /usr/src/app
# Install dependencies
ADD package.json /usr/src/app/
WORKDIR /usr/src/app
RUN npm install
# Copy project files
ADD . /usr/src/app
# Build the app
RUN npm build
# Expose the app port and the volume to share
EXPOSE 3000
VOLUME /usr/src/app/log
# Start the app
CMD node server.js
Rajouter un fichier .dockerignore permet de spécifier à Docker les fichiers à ne pas inclure dans l'image.
(node_modules, vendor, .git, ...)

Aller plus loin avec Docker Compose
version: "2"
services:
web:
build: web
command: python app.py
ports:
- "5000:5000"
volumes:
- ./web:/code
links:
- redis
environment:
- DATADOG_HOST=datadog
redis:
image: redis
# agent section
datadog:
build: datadog
links:
- redis
- web
environment:
- API_KEY=__your_datadog_api_key_here__
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /proc/mounts:/host/proc/mounts:ro
- /sys/fs/cgroup:/host/sys/fs/cgroup:ro
$ docker-compose up -d

App container
:80
DB container
:3306
Cache container
:6379
:80
db:3306
cache:6379
HELLO LARAVEL
Pour aller plus loin ...
CMD VS ENTRYPOINT
https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/


THE END ...

C'est moi ...
Introduction à Docker
By Médédé Raymond KPATCHAA
Introduction à Docker
Monter un environnement de développement portable
- 1,117