Créé par Baptiste Donaux
La technologie repose sur trois composants.
LXC signifie Linux Containers.
C'est un système de virtualisation, utilisant l'isolation comme méthode de cloisonnement au niveau du système d'exploitation.
(source : fr.wikipedia.org)
cgroups (control groups) est une fonctionnalité du noyau Linux pour limiter, compter et isoler l'utilisation des ressources (processeur, mémoire, utilisation disque, etc.).
(source : fr.wikipedia.org)
Docker utilise Linux et ses fonctionnalités. Docker est donc uniquement compatible avec Linux. D'ailleurs il lui est destiné.
Il requiert un Kernel 3.8+. Un fallback a été mis en place pour Debian 7.
Pour utiliser Docker sur un Mac ou Windows, vous pouvez utiliser une des VMs mise à disposition comme boot2docker. Celle-ci est soutenu par Docker Inc., repose sur VirtualBox. Elle est très légère (~ 24 Mo) et démarre rapidement (~ 5/10 secondes). Elle embarque un Linux dans lequel vous pourrez ensuite exécuter un nombre illimité de containers.
ATTENTION ! Des problèmes non liés à Docker peuvent être levé par l'utilisation de ces VMs.
Une API haut niveau permettant de manager des instructions bas niveau
Docker vous donne la possibilité de gérer :
Mais dans Docker, tout est container ! :-/
Voyez donc plutôt :
Dans une image, vous allez installer des services, qui seront exécutés dans un autre container de manière à le garder intact.
Il existe le Docker Hub Registry pour :
$ docker search --stars=10 debian NAME DESCRIPTION STARS OFFICIAL AUTOMATED debian (Semi) Official Debian base image. 248 [OK] google/debian 25 [OK] tianon/debian use "debian" instead - https://index.docke... 13
$ docker pull debian
$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE debian 7 f6fab3b798be 4 weeks ago 85.1 MB debian latest f6fab3b798be 4 weeks ago 85.1 MB debian wheezy f6fab3b798be 4 weeks ago 85.1 MB debian 6 1910f8f05f99 4 weeks ago 78.5 MB debian stable 2cf366ad6d47 8 weeks ago 85.19 MB debian 7.5 06af7ad6cff1 5 months ago 85.18 MB
Deux méthodes
Fichier contenant des instructions et des méta-datas.
Et maintenant, on build !
$ docker build .
$ docker imagesPas mal, mais pas de nom à mon image…
$ docker build -t monImage[:monTag] .
Lorsqu'on rebuild une image, Docker utilise du cache.
Il réutilise les étapes déjà faites qui n'ont pas changées.
Chaque étape (instruction Dockerfile), est mise dans un container.
Lorsque vous rebuildez l'image, Dockerfile repars du dernier container intermédiaire qui n'a pas changée.
Un container va vivre et contenir les différences avec l'image de base.
$ docker run debian:wheezy bash
Va s'arrêter immédiatement car la console n'a pas été attachée
$ docker run --tty --interactive debian:wheezy bash
$ docker create --tty --interactive debian:wheezy bash
$ docker start name_of_container
docker-create va créer un container à partir d'une image et lui donné un nom. Celui-ci sera toujours disponible.
$ docker ps -a # pour voir tous les containers (lancé ou non)
Best Practices
$ docker build -t monImage /path/
$ docker create --tty --interactive -p 80:80 --name="containerName" monImage bash
$ docker start containerName
$ docker stop containerName
Pas de perte de données, pas de réinitialisation des données.
Docker, pas 1, mais 2 parties !
Une API RESTFul qui répond à notre docker-cli. Par conséquent, un daemon appelable par n'importe quelle application.
Le serveur contactable via une IP (et un port) ou via une Socket.
tcp://ip:port
unix:///run/docker.sock
Cela donne la possibilité de gérer un cluster de baleines !
Lancer le core de chaque serveur de manière à écouter sur une plage d'IP et un port.
Possibilité de gérer plusieurs machines depuis un unique point.
L'API reprend les commandes détaillés dans les parties précédentes. Elle est disponible sur le site officiel.
Exemple de déclaration d'environnement
$ fig build engine uses an image, skipping Building front... ---> 1822529acbbf Step 1 : COPY myVhost.conf /etc/nginx/conf.d/default.conf ---> 07e91ba25c16 Removing intermediate container 19eb539844a8 Successfully built 07e91ba25c16
$ fig up --no-recreate Recreating test_engine_1... Recreating test_front_1... Attaching to test_engine_1, test_front_1 engine_1 | [14-Jan-2015 10:19:21] NOTICE: fpm is running, pid 1 engine_1 | [14-Jan-2015 10:19:21] NOTICE: ready to handle connections
$ docker compose [build|up|kill|rm|…]
Remerciement à David Gageot pour son meetup pour LyonJUG, Jérôme Petazzoni et Docker Inc. pour le passage du Docker Tour à Lyon.
Retrouver les 4 articles qui ont composés cette présentation sur le blog de Wanadev.