Par Karel Faille / @shaffe
“Docker est un logiciel libre qui automatise le déploiement d'applications dans des conteneurs logiciels.”Wikipedia
Dans un OS, la mémoire est séparée en deux espaces :
Image redhat.com
Conteneurisation : multiplication de user spaces.
Image redhat.com
Le noyau Linux permet également d'isoler certaines ressources du kernel space pour le conteneur.
Image redhat.com
Image redhat.com
Gestion de la consommation des ressources physiques des conteneurs : RAM, CPU, I/O disque...
Fusion de plusieurs systèmes de fichiers (couches, branches) en un seul point de montage.
Image docs.docker.com
$ docker pull # Récupère une image distante
$ docker build # Créer une image à partir d'un Dockerfile
$ docker images # Listes les images de l'hôte
$ docker run # Lance une image
$ docker ps # Liste les containers (lancés et éteints)
$ docker stop # Arrête un container
$ docker start # Relance un container
$ docker rm # Supprime un container
$ docker rmi # Supprime une image
$ docker pull ubuntu:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 7b9b13f7b9c0 11 days ago 118.3 MB
# Crée un conteneur à partir de ubuntu:latest,
# y lance le programme bash et
# y attache votre shell grâce aux options -it
$ docker run -it ubuntu bash
root@d882ad3827c4:/#
root@d882ad3827c4:/# exit # ou Ctrl+d
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d882ad3827c4 ubuntu "bash" 2 minutes ago Exited (0) 1 seconds ago elegant_pike
1. Récupérer l'image de base (optionnel)
$ docker pull node:latest
2. Créer un fichier server.js
$ echo """
const http = require('http')
const server = http.createServer(function(req, res) {
res.end('Hello from the other side!')
});
server.listen(3000)
""" > server.js
3. Lancer l'image
$ docker run -d --name hello-node -p 8080:3000 -v $(pwd):/app node:latest node /app/server.js
Les fichiers Dockerfiles permettent de construire une image, étape par étape, calque par calque.
1. Créer un fichier Dockerfile avec le contenu suivant :
FROM node:latest
# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# Install dependencies
ADD package.json /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
2. Créer un fichier .dockerignore pour indiquer les fichiers à ne pas inclure dans l'image (node_modules, .git...)
$ echo -e "node_modules\nnpm-debug.log" > .dockerignore
3. Créer un fichier package.json
$ echo '{ "name": "hello-node", "version": "1.0.0" }' > package.json
4. Builder l'image
$ docker build . -t hello-node
5. Lancer le conteneur hello-node
$ docker run -d --name hello-node -p 8080:3000 hello-node
Les fichiers docker-compose.yml permettent de définir et lancer des applications utilisant plusieurs containers.
On lance les conteneurs avec la commande
docker-compose up -d.
version: '1'
services:
mysql:
image: mysql
volumes:
- /var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=notsecret
php:
image: php:7.0-fpm
volumes:
- "~/www:/var/www/html"
links:
- mysql:db
nginx:
image: nginx
ports:
- 80:80
volumes:
- "~/docker/nginx:/etc/nginx/conf.d"
- "~/www:/var/www/html"
links:
- php:php
docker-compose.yml pour une architecture web
http://rhelblog.redhat.com/2015/07/29/architecting-containers-part-1-user-space-vs-kernel-space/
https://blog.yadutaf.fr/2013/12/22/introduction-to-linux-namespaces-part-1-uts/
https://www.geeek.org/check-list-projet-docker-153.html
Wikipedia <3
https://www.github.com/shaffe-fr