docker tours meetup #1 - introduction à docker
TRANSCRIPT
Docker Tours Meetup #1
9 Septembre 2015 @ Cantine numérique
@DockerTours
Programme
Introduction à Docker & cas pratiquepar Antoine Boudot et Thibaut Marmin (~3x20mn)
Du dev à la prod en passant par Jenkinspar Benjamin Cousin et Cédric Gatay (~30mn)
Pizzas / Bièresoffertes 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 à DockerRapide, 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 imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEtraining/webapp latest fc77f57ad303 3 weeks ago 280.5 MBubuntu 13.10 5e019ab7bf6d 4 weeks ago 180 MBubuntu saucy 5e019ab7bf6d 4 weeks ago 180 MBubuntu 12.04 74fe38d11401 4 weeks ago 209.6 MBubuntu precise 74fe38d11401 4 weeks ago 209.6 MBubuntu 12.10 a7cf8ae4e998 4 weeks ago 171.3 MBubuntu quantal a7cf8ae4e998 4 weeks ago 171.3 MBubuntu 14.04 99ec81b80c55 4 weeks ago 266 MBubuntu latest 99ec81b80c55 4 weeks ago 266 MBubuntu trusty 99ec81b80c55 4 weeks ago 266 MBubuntu 13.04 316b678ddf48 4 weeks ago 169.4 MBubuntu raring 316b678ddf48 4 weeks ago 169.4 MBubuntu 10.04 3db9c44f4520 4 weeks ago 183 MBubuntu 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 centosPulling repository centosb7de3133ff98: Pulling dependent layers5cc9e91966f7: Pulling fs layer511136ea3c5a: Download completeef52fb1fe610: 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 psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf9148ffb024e centos:latest "/bin/bash -c 'while 9 seconds ago Up 8 seconds helloe2ccef3bcc5a 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éveloppementCas 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
80808081
80808081
REGISTRY
Docker en productionCas 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 "[email protected]"
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 "[email protected]"
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 "[email protected]"
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 "[email protected]"
COPY ./script/load.sh /elasticsearch/load.sh
WORKDIR /elasticsearch/
ENTRYPOINT ["./load.sh"]
Automatiser le lancement
docker-compose up -ddocker-compose.yml
docker-compose.yml
LINK
Application Elasticsearch
VOLUME
/var/log/app
PORT
elasticsearch
/app/log
80808081
80808081
/var/log/elastic
VOLUME
/data
Elasticsearch-load
Merci pour votre attention !