Monter un environnement de développement portable
16 / 02 / 2017 - RMK - @OctoTechnology Rabat
Lui c'est Zlatan ...
©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
...
$ docker history nginx
Les layers sont mises en cache pour accélérer la construction d’image
$ 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
$ 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)
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, ...)
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
CMD VS ENTRYPOINT
https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/
C'est moi ...