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 ...

THE END ...

C'est moi ...

Introduction à Docker

By Médédé Raymond KPATCHAA

Introduction à Docker

Monter un environnement de développement portable

  • 1,169