Docker Platform 101

Build, Ship, Run

Nicolas Steinmetz / CérénIT

Juin 2017

whoami ?

Architecte Plateforme (Dev & Ops + DevOps)

XP: 15+

Docker : 2013 - ...

Origines

Dotscale 2013 : Vidéo - Slides

Conteneur : la solution universelle

  • Licence Apache 2
  • Mars 2013 - 0.9 / Open Source
  • Mai 2017 - v17.05
  • Go
  • Basé sur : cgroups, namespaces, union file systems (layers), libcontainer (format)
  • Platforme : Linux 64 bits, Windows (TP), ARM (Exp)

Architecture

Containers vs VM

Appartement vs Maison

Containers are not VMs

Containers, VMs... Comment ces technologies fonctionnent et comment les différencier? (Quentin Adam)

Layers & Image

Layers & containers

Layers mutualisés

Principes du container

  • Immutable
  • Ephémère
  • 1 container = 1 process / service

Mes premiers containers

# Télécharger une image
docker image pull debian:jessie
# Exécuter un container et lui passer une commande :
docker container run --rm docker/whalesay cowsay boo-boo
# Interagir avec un container
docker container run -t -i debian /bin/bash
# Lancer un container en mode daemon
docker container run -d debian /bin/sh -c "while true; do echo hello world; sleep 1; done"
						

Premières commandes 1/2

# Récupérer une image docker
docker image pull [image]
# Créer un container à partir d'une image
docker container run [image]
# Voir les logs du container :					
docker container logs [container]
# Voir les container actifs :
docker container ps
# Voir tous les containers (actifs ou pas) :
docker container ps -a
# Voir les images de l'hôte :
docker image ls
						

Premières commandes 2/2

# Arrêter / Démarrer un container
docker container stop/start [container]
# Supprimer un container / une image
docker container rm [container]
docker image rm [image]
# Copier un fichier dans/depuis un container
docker container cp file [container]:/path/to/file
docker container cp [container]:/path/to/file file
# Inspecter un container
docker container inspect [container]
						

Première application Web

docker container run -d -p 80:5000 training/webapp python app.py
						

Commandes supplémentaires

# Tailer les logs
docker container logs -f [container]
# Entrer dans un container
docker container exec -ti [container] bash
# Exécuter une commande
docker container exec -ti [container] /path/to/command args
# Avoir le top du container 
docker container top [container]
# Avoir des stats CPU/RAM/... du container
docker container stats [container]
					

Volumes

Données persistantes & partageables

# Crée un volume docker (! jamais purgé !)
docker container run -d -P --name web -v /webapp training/webapp python app.py
# Crée un volume mappé sur un répertoire de la machine hôte
docker container run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
# Idem mais en lecture seule (secrets, certificats, conf)
docker container run -d -P --name web -v /src/project/webapp:/opt/webapp:ro training/webapp python app.py
# On peut aussi monter un fichier (et pas uniquement un dossier)
docker container run -d -P --name web -v /src/project/ssl/mycert.pem:/etc/ssl/mycert.pem:ro training/webapp python app.py
						

Réseau

# Lister les réseaux
docker network ls
# Créer un réseau
docker network create -d bridge my-bridge-network
# Démarrer un container et l'attacher à un réseau
docker container run -d --network=my-bridge-network --name db training/postgres
# (Dé)connecter un container à un réseau
docker network (dis)connect [network] [container]
						

Composons nos premiers containers

Dockerfile

FROM nginx:stable-alpine
MAITAINER Nicolas Steinmetz 
VOLUME ["/usr/share/nginx/html"]
EXPOSE 8080
...

Dockerfile reference

FROM node:5
EXPOSE 1111
RUN groupadd -r mynodeapp &&\
    useradd -r -g mynodeapp -d /usr/src/app -M mynodeapp
RUN npm install -g bower forever
ADD app.tar.gz /usr/src/
RUN mkdir /var/log/mynodeapp && \
    chown mynodeapp:mynodeapp -R /usr/src/app /var/log/mynodeapp
USER mynodeapp
VOLUME ["/var/log/mynodeapp"]
COPY jsonenv /usr/src/app/.jsonenv
RUN chown mynodeapp:mynodeapp /usr/src/app/.jsonenv
WORKDIR /usr/src/app
RUN npm install
WORKDIR /usr/src/app/public
RUN bower install
WORKDIR	/usr/src/app
ENTRYPOINT ["forever","--fifo","app.js"]	

Construisons l'image

# Build image
docker image build -t bigcorp/myapp:<version> .
# Check image is present
docker image ls
# Push to registry (docker hub or private registry)
docker image push ...
						

Docker-Compose

Composer vos applications

  • Un fichier docker-compose.yml
  • Un binaire docker-compose
  • Et voilà !

docker-compose.yml - Wordpress

version: '3'
services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:
						

docker-compose.yml

  • Votre application
  • Contexte d'exécution (volume, réseau, healthcheck, etc)
  • V3 : deploy : replicas, placement, mise à jour, etc
  • Dernière version: 3.2

Compose file v3 reference

Commandes docker-compose

# Construire les images de container
docker-compose build [service]
# Créer et démarrer les containers
docker-compose up
# Idem en mode daemon :
docker-compose up -d
# Tout arréter et détruire
docker-compose down
# Killer les containers
docker-compose kill
# Scaler le nombre de container
docker-compose scale [service]=XXX
# Et globalement, les mêmes commandes que docker
docker-compose ps, log, exec, stop, start, etc		
						

Avec un container à builder

Organisation projet :

.
├── build
│   ├── app.tar.gz
│   ├── Dockerfile
│   └── jsonenv
├── docker-compose.yml

Avec docker-compose.yml

mynodeapp:
    build: ./build/
    ports:
        - "1111:1111"
    volumes:
        - "/srv/app/mynodeapp/log:/var/log/mynodeapp"

Docker Swarm

Docker Swarm provides native clustering capabilities to turn a group of Docker engines into a single, virtual Docker Engine

Topologie (Docker v 1.12+)

Vers un vrai cluster...

Swarm

  • Manager node(s)
  • Worker node(s)
  • Overlay Network & Routing Mesh
  • Services
  • Secrets

Encore plus loin dans l'orchestration

  • Rancher
  • Kubernetes (Google)
  • Openshift (Redhat)

Alternative(s)

  • Rkt (CoreOS)
  • Apache Mesos

Docker & Windows

TL;DR : C'est pas sec

Annonces Microsoft @DockerCon

Docker, dans un contexte hybride Windows et Linux

Docker & ARM

TL;DR : En route vers un support officiel

Architectures other than amd64?

Traefik

Le Reverse Proxy "container aware"

Bonnes pratiques

  • Sécurité
  • Gestion des logs
  • Monitoring
  • ...

Question(s) ?

Merci ! :-)

Nicolas STEINMETZ / CérénIT contact@cerenit.fr / www.cerenit.fr 09.72.58.44.69 / 06.28.20.31.58