Docker Tours Meetup #1
9 Septembre 2015 @ Cantine numérique
@DockerTours
Programme
Introduction à Docker & cas pratique
par Antoine Boudot et Thibaut Marmin (~3x20mn)
Du dev à la prod en passant par Jenkins
par Benjamin Cousin et Cédric Gatay (~30mn)
Pizzas / Bières
offertes par le groupe Cyrès
À propos...
Thibaut Marmin
@thibmarmin
Ing. Développeur chez Ingensi
Elasticsearch / Docker / AngularJS
Organisateur Docker Tours Meetup
Antoine Boudot
@AntoineBoudot
Ing. Développeur chez Ingensi
Ansible / Docker / Hadoop
Co-organisateur Docker Tours Meetup
Introduction à Docker
Rapide, promis
Qui devrait s’y intéresser ?
Devs
tous les langages
tous les OS
projet cible linux
Ops
la plupart des distributions
Linux1
et cloud providers
toutes les machines
(physiques / VMs)
1
https://docs.docker.com/installation/
plus rapide
plus agile
= bénéfices !
Pourquoi Docker est-il si populaire ?
Pourquoi Docker est-il si populaire ?
La solution : les containers !
VM
Container
Docker
▸ build
▸ ship
▸ run
Né le 13 mars 20131
nov. 2013 : 7300 stars, 900 forks, 200
contributeurs
jan. 2014 : levée de $15.000.000
mai 2014 : 11700 stars, 1900 forks, 400
contributeurs
sept. 2014 : levée de $40.000.000
avr. 2015 : levée de $95.000.000
avr. 2015 : 20700 stars, 4700 forks, 900
contributeurs
1
depuis un projet dotCloud
L’architecture Docker
Les images
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
training/webapp latest fc77f57ad303 3 weeks ago 280.5 MB
ubuntu 13.10 5e019ab7bf6d 4 weeks ago 180 MB
ubuntu saucy 5e019ab7bf6d 4 weeks ago 180 MB
ubuntu 12.04 74fe38d11401 4 weeks ago 209.6 MB
ubuntu precise 74fe38d11401 4 weeks ago 209.6 MB
ubuntu 12.10 a7cf8ae4e998 4 weeks ago 171.3 MB
ubuntu quantal a7cf8ae4e998 4 weeks ago 171.3 MB
ubuntu 14.04 99ec81b80c55 4 weeks ago 266 MB
ubuntu latest 99ec81b80c55 4 weeks ago 266 MB
ubuntu trusty 99ec81b80c55 4 weeks ago 266 MB
ubuntu 13.04 316b678ddf48 4 weeks ago 169.4 MB
ubuntu raring 316b678ddf48 4 weeks ago 169.4 MB
ubuntu 10.04 3db9c44f4520 4 weeks ago 183 MB
ubuntu lucid 3db9c44f4520 4 weeks ago 183 MB
$
Trouver une image
Trouver une image
$docker search centos
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/centos The offic... 1232 [OK]
docker.io docker.io/ansible/centos7... Ansible o... 51 [OK]
docker.io docker.io/jdeathe/centos-... CentOS-6 ... 11 [OK]
docker.io docker.io/blalor/centos Bare-bone... 9 [OK]
docker.io docker.io/jdeathe/centos-ssh CentOS-6 ... 6 [OK]
docker.io docker.io/openshift/wildf... DEPRECATE... 6 [OK]
docker.io docker.io/torusware/speed... Always up... 6 [OK]
docker.io docker.io/million12/cento... Base Cent... 5 [OK]
docker.io docker.io/nimmis/java-cen... This is d... 4 [OK]
docker.io docker.io/jdeathe/centos-... CentOS-6 ... 2 [OK]
. . .
$
Récupérer une image
$ docker pull centos
Pulling repository centos
b7de3133ff98: Pulling dependent layers
5cc9e91966f7: Pulling fs layer
511136ea3c5a: Download complete
ef52fb1fe610: Download complete
. . .
Status: Downloaded newer image for centos
$
Les containers
1 processus=1 container
Mode interactif
$ docker run -it centos /bin/bash
[root@af40a9d95e82 /]#
-t Allocate a pseudo-tty
-i Interactive mode (STDIN)
. . .
Mode background
$ docker run -d --name hello centos /bin/bash -c 
"while true; do echo Hello world; sleep 1; done"
ce7383fd92b9e15c9c96fa58bb99fe62fba4dee50c566abd5807804ef4f3110d
$
-d Daemon mode (background)
--name Specify container name
. . .
Mode background
$ docker logs -f hello
hello
hello
hello
hello
hello
hello
hello
hello
Lister les containers
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9148ffb024e centos:latest "/bin/bash -c 'while 9 seconds ago Up 8 seconds hello
e2ccef3bcc5a elasticsearch:latest "/docker-entrypoint. 5 weeks ago Up 2 seconds 9200... elastic
$
Contrôller les containers
$ JOB=$(docker run -d [...]) # Start a new container
$ docker stop $JOB # Stop the container
$ docker start $JOB # Start the container
$ docker restart $JOB # Restart the container
$ docker kill $JOB # SIGKILL a container
$ docker rm $JOB # Remove a container
Créer une image
$ docker commit -m "Say Hello" -a "Kate Smith" 0b2616b0e5a8 user/centos:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
$ docker build -t user/centos:v2 .
pull -> commit
build
Depuis une image existante, après avoir exécuté des commandes
Depuis un Dockerfile, basé sur une image existante
$ cat helloFromScratch.tgz | docker import - hello:new
import
From scratch
Mais encore...
Binding de ports
(expose / publish)
Points de montage
(volume)
Connecter les containers
(link)
Variables d’environnement
. . .
Docker en Développement
Cas pratique
Notre contexte
REST
API
DB
→→
Structure technique
Dropwizard
:9300
:8080
:8081
:9200
$ java -jar [JAR] server [CONF]
{ “_id”: ...
{ “_id”: ...
{ “_id”: ...
{ “_id”: ...
{ “_id”: ...
{ “_id”: ...
Structure fonctionnelle
Dropwizard
:8080
:8081
GET /api # infos serveur
GET /api/contact # liste des contacts
GET /api/contact/:id # get d'un contact
GET /healthcheck
Sans docker
Dropwizard
{ “_id”: ...
{ “_id”: ...
{ “_id”: ...
{ “_id”: ...
{ “_id”: ...
{ “_id”: ...
Télécharger elasticsearch
Installer et configurer
(Gérer les dépendances)
(Installer les dépendances)
Configurer l’app en localhost
localhost:9300
Avec docker
Application Elasticsearch
Comment faire ?
LINK
Application Elasticsearch
VOLUME
/home/.../workdir
application.jar
config.yml
PORT
elasticsearch
/workdir
8080
8081
8080
8081
REGISTRY
Docker en production
Cas pratique
Différences entre dev et prod
Application Configurations
LogsPersistance des données
IMAGE
Le Dockerfile
Automatiser la création d’une image
Rapide
Reproductible
Maintenable
Dockerfile
FROM BaseImage:version
MAINTAINER DockerMeetup DockerMeetup.com "Docker@Meetup.com"
ENV myvar=”value”
RUN yum install pkgs1 , pkgs2 -y
RUN mkdir -p /workdir/log
COPY ./conf/application.conf /workdir/app.conf
ADD www.archive.com/myarchive.tar.gz /workdir/
EXPOSE 9000
VOLUME [“/workdir/log”]
WORKDIR [“/workdir”]
USER myuser
ENTRY-POINT [“/bin/bash”]
CMD [“echo” , “hello world”]
Bonnes pratiques
Evitez d’installer des paquets inutiles
Exécutez un seul processus par conteneur
Limitez le nombre de couches
Cas pratique
Application Elasticsearch
Elasticsearch (Dockerfile)
FROM elasticsearch:1.7.1
MAINTAINER DockerMeetup DockerMeetup.com "Docker@Meetup.com"
VOLUME ["/usr/share/elasticsearch/data"]
COPY ./conf/elasticsearch.yml /usr/share/elasticsearch/config/elasticsearch.yml
COPY ./conf/logging.yml /usr/share/elasticsearch/config/logging.yml
Image officielle :
https://hub.docker.com/_/elasticsearch/
$docker build -t docker-meetup/elasticsearch:1.0
L’application (Dockerfile)
FROM java:8-jre
MAINTAINER DockerMeetup DockerMeetup.com "Docker@Meetup.com"
RUN mkdir -p /app/logs
COPY conf/prod-docker.yml /app/prod.yml
COPY target/awesome-app-1.0-SNAPSHOT.jar /app/awesome-prod.jar
EXPOSE 8080
EXPOSE 8081
WORKDIR /app
ENTRYPOINT [ “java”, “-jar”, “awesome-prod.jar”, “server”, “prod.yml” ]
Chargement initial (Dockerfile)
FROM tutum/curl:trusty
MAINTAINER DockerMeetup DockerMeetup.com "Docker@Meetup.com"
COPY ./script/load.sh /elasticsearch/load.sh
WORKDIR /elasticsearch/
ENTRYPOINT ["./load.sh"]
Automatiser le lancement
docker-compose up -d
docker-compose.yml
docker-compose.yml
LINK
Application Elasticsearch
VOLUME
/var/log/app
PORT
elasticsearch
/app/log
8080
8081
8080
8081
/var/log/elastic
VOLUME
/data
Elasticsearch-load
Merci pour votre attention !

Docker Tours Meetup #1 - Introduction à Docker

  • 1.
    Docker Tours Meetup#1 9 Septembre 2015 @ Cantine numérique @DockerTours
  • 2.
    Programme Introduction à Docker& cas pratique par Antoine Boudot et Thibaut Marmin (~3x20mn) Du dev à la prod en passant par Jenkins par Benjamin Cousin et Cédric Gatay (~30mn) Pizzas / Bières offertes par le groupe Cyrès
  • 3.
    À propos... Thibaut Marmin @thibmarmin Ing.Développeur chez Ingensi Elasticsearch / Docker / AngularJS Organisateur Docker Tours Meetup Antoine Boudot @AntoineBoudot Ing. Développeur chez Ingensi Ansible / Docker / Hadoop Co-organisateur Docker Tours Meetup
  • 4.
  • 5.
    Qui devrait s’yintéresser ? Devs tous les langages tous les OS projet cible linux Ops la plupart des distributions Linux1 et cloud providers toutes les machines (physiques / VMs) 1 https://docs.docker.com/installation/ plus rapide plus agile = bénéfices !
  • 6.
    Pourquoi Docker est-ilsi populaire ?
  • 7.
    Pourquoi Docker est-ilsi populaire ?
  • 8.
    La solution :les containers ! VM Container
  • 9.
    Docker ▸ build ▸ ship ▸run Né le 13 mars 20131 nov. 2013 : 7300 stars, 900 forks, 200 contributeurs jan. 2014 : levée de $15.000.000 mai 2014 : 11700 stars, 1900 forks, 400 contributeurs sept. 2014 : levée de $40.000.000 avr. 2015 : levée de $95.000.000 avr. 2015 : 20700 stars, 4700 forks, 900 contributeurs 1 depuis un projet dotCloud
  • 10.
  • 11.
    Les images $ dockerimages REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE training/webapp latest fc77f57ad303 3 weeks ago 280.5 MB ubuntu 13.10 5e019ab7bf6d 4 weeks ago 180 MB ubuntu saucy 5e019ab7bf6d 4 weeks ago 180 MB ubuntu 12.04 74fe38d11401 4 weeks ago 209.6 MB ubuntu precise 74fe38d11401 4 weeks ago 209.6 MB ubuntu 12.10 a7cf8ae4e998 4 weeks ago 171.3 MB ubuntu quantal a7cf8ae4e998 4 weeks ago 171.3 MB ubuntu 14.04 99ec81b80c55 4 weeks ago 266 MB ubuntu latest 99ec81b80c55 4 weeks ago 266 MB ubuntu trusty 99ec81b80c55 4 weeks ago 266 MB ubuntu 13.04 316b678ddf48 4 weeks ago 169.4 MB ubuntu raring 316b678ddf48 4 weeks ago 169.4 MB ubuntu 10.04 3db9c44f4520 4 weeks ago 183 MB ubuntu lucid 3db9c44f4520 4 weeks ago 183 MB $
  • 12.
  • 13.
    Trouver une image $dockersearch centos INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/centos The offic... 1232 [OK] docker.io docker.io/ansible/centos7... Ansible o... 51 [OK] docker.io docker.io/jdeathe/centos-... CentOS-6 ... 11 [OK] docker.io docker.io/blalor/centos Bare-bone... 9 [OK] docker.io docker.io/jdeathe/centos-ssh CentOS-6 ... 6 [OK] docker.io docker.io/openshift/wildf... DEPRECATE... 6 [OK] docker.io docker.io/torusware/speed... Always up... 6 [OK] docker.io docker.io/million12/cento... Base Cent... 5 [OK] docker.io docker.io/nimmis/java-cen... This is d... 4 [OK] docker.io docker.io/jdeathe/centos-... CentOS-6 ... 2 [OK] . . . $
  • 14.
    Récupérer une image $docker pull centos Pulling repository centos b7de3133ff98: Pulling dependent layers 5cc9e91966f7: Pulling fs layer 511136ea3c5a: Download complete ef52fb1fe610: Download complete . . . Status: Downloaded newer image for centos $
  • 15.
  • 16.
    Mode interactif $ dockerrun -it centos /bin/bash [root@af40a9d95e82 /]# -t Allocate a pseudo-tty -i Interactive mode (STDIN) . . .
  • 17.
    Mode background $ dockerrun -d --name hello centos /bin/bash -c "while true; do echo Hello world; sleep 1; done" ce7383fd92b9e15c9c96fa58bb99fe62fba4dee50c566abd5807804ef4f3110d $ -d Daemon mode (background) --name Specify container name . . .
  • 18.
    Mode background $ dockerlogs -f hello hello hello hello hello hello hello hello hello
  • 19.
    Lister les containers $docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f9148ffb024e centos:latest "/bin/bash -c 'while 9 seconds ago Up 8 seconds hello e2ccef3bcc5a elasticsearch:latest "/docker-entrypoint. 5 weeks ago Up 2 seconds 9200... elastic $
  • 20.
    Contrôller les containers $JOB=$(docker run -d [...]) # Start a new container $ docker stop $JOB # Stop the container $ docker start $JOB # Start the container $ docker restart $JOB # Restart the container $ docker kill $JOB # SIGKILL a container $ docker rm $JOB # Remove a container
  • 21.
    Créer une image $docker commit -m "Say Hello" -a "Kate Smith" 0b2616b0e5a8 user/centos:v2 4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c $ docker build -t user/centos:v2 . pull -> commit build Depuis une image existante, après avoir exécuté des commandes Depuis un Dockerfile, basé sur une image existante $ cat helloFromScratch.tgz | docker import - hello:new import From scratch
  • 22.
    Mais encore... Binding deports (expose / publish) Points de montage (volume) Connecter les containers (link) Variables d’environnement . . .
  • 23.
  • 24.
  • 25.
    Structure technique Dropwizard :9300 :8080 :8081 :9200 $ java-jar [JAR] server [CONF] { “_id”: ... { “_id”: ... { “_id”: ... { “_id”: ... { “_id”: ... { “_id”: ...
  • 26.
    Structure fonctionnelle Dropwizard :8080 :8081 GET /api# infos serveur GET /api/contact # liste des contacts GET /api/contact/:id # get d'un contact GET /healthcheck
  • 27.
    Sans docker Dropwizard { “_id”:... { “_id”: ... { “_id”: ... { “_id”: ... { “_id”: ... { “_id”: ... Télécharger elasticsearch Installer et configurer (Gérer les dépendances) (Installer les dépendances) Configurer l’app en localhost localhost:9300
  • 28.
  • 29.
    Comment faire ? LINK ApplicationElasticsearch VOLUME /home/.../workdir application.jar config.yml PORT elasticsearch /workdir 8080 8081 8080 8081 REGISTRY
  • 30.
  • 31.
    Différences entre devet prod Application Configurations LogsPersistance des données IMAGE
  • 32.
    Le Dockerfile Automatiser lacréation d’une image Rapide Reproductible Maintenable
  • 33.
    Dockerfile FROM BaseImage:version MAINTAINER DockerMeetupDockerMeetup.com "Docker@Meetup.com" ENV myvar=”value” RUN yum install pkgs1 , pkgs2 -y RUN mkdir -p /workdir/log COPY ./conf/application.conf /workdir/app.conf ADD www.archive.com/myarchive.tar.gz /workdir/ EXPOSE 9000 VOLUME [“/workdir/log”] WORKDIR [“/workdir”] USER myuser ENTRY-POINT [“/bin/bash”] CMD [“echo” , “hello world”]
  • 34.
    Bonnes pratiques Evitez d’installerdes paquets inutiles Exécutez un seul processus par conteneur Limitez le nombre de couches
  • 35.
  • 36.
    Elasticsearch (Dockerfile) FROM elasticsearch:1.7.1 MAINTAINERDockerMeetup DockerMeetup.com "Docker@Meetup.com" VOLUME ["/usr/share/elasticsearch/data"] COPY ./conf/elasticsearch.yml /usr/share/elasticsearch/config/elasticsearch.yml COPY ./conf/logging.yml /usr/share/elasticsearch/config/logging.yml Image officielle : https://hub.docker.com/_/elasticsearch/ $docker build -t docker-meetup/elasticsearch:1.0
  • 37.
    L’application (Dockerfile) FROM java:8-jre MAINTAINERDockerMeetup DockerMeetup.com "Docker@Meetup.com" RUN mkdir -p /app/logs COPY conf/prod-docker.yml /app/prod.yml COPY target/awesome-app-1.0-SNAPSHOT.jar /app/awesome-prod.jar EXPOSE 8080 EXPOSE 8081 WORKDIR /app ENTRYPOINT [ “java”, “-jar”, “awesome-prod.jar”, “server”, “prod.yml” ]
  • 38.
    Chargement initial (Dockerfile) FROMtutum/curl:trusty MAINTAINER DockerMeetup DockerMeetup.com "Docker@Meetup.com" COPY ./script/load.sh /elasticsearch/load.sh WORKDIR /elasticsearch/ ENTRYPOINT ["./load.sh"]
  • 39.
  • 40.
  • 41.
    Merci pour votreattention !