Docker

Durée : ~30min

Vous pouvez poser des questions à tout moment !

Que-'est ce que c'est ?

Comment ça marche ?

VM / Container

Noyau linux

Système par couches

Pour

Force à découper en plusieurs containeurs

Plus simple d'augmenter en taille

Code et envionnement versionnés ensemble

Donc rollback facile

Environnement ISO car tout est écrit

Pas de surprise liée au cache

Contre

Recrée à chaque fois

L'architecture par couches peut rendre les changements longs

Utilisation Basique

Créer un Dockerfile


FROM ubuntu:14.04
MAINTAINER Nicolas Djambazian

# install node
RUN apt-get update && apt-get install -y nodejs npm

COPY back/package.json /src/package.json
RUN cd /src; npm install --production

# Bundle app source
COPY back/ /src

EXPOSE 80
ENV APP_PORT 80

CMD ["nodejs", "/src/index.js"]
            

Et c'est parti !


docker build -t username/my-app .
docker run -p 3000:80 -d username/my-app
            

Sur MacOS, docker tourne dans une machine virtuelle


$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.10.3
$ curl 192.168.99.100:3000
Hello World!
            

Docker garde un cache et reconstruit tout depuis le dernier changement.

D'où :


RUN apt-get update && apt-get install -y nodejs npm
            

Et


COPY back/package.json /src/package.json
RUN cd /src; npm install --production

# Bundle app source
COPY back/ /src
            

Tant qu'à faire, on réutilise l'existant


FROM node:4
MAINTAINER Nicolas Djambazian

# no node install
            

En docker, on ne fait pas de grosse machine On découpe

Ajout d'une BDD avec docker-compose


# docker-compose.yml
back:
    build: .
    volumes:
            - "./back/:/src"
    ports:
            - "3000:80"
    links:
            - db

db:
    image: mysql:5.7
    ports:
        - "3306:3306"
    environment:
            - "MYSQL_ROOT_PASSWORD=rootPassword"
            - "MYSQL_USER=user"
            - "MYSQL_PASSWORD=pass"
            - "MYSQL_DATABASE=database"
            

Utilisations :


"mysql://user:pass@db:3306/database"
            

Rappel :


# docker-compose.yml
back:
    build: .
    links:
            - db

db:
    image: mysql:5.7
    ports:
        - "3306:3306"
            

Astuces pratiques

Gestion des sources

Dans le même Dossier/repo (git submodule éventuellement)

On deversionne le docker-compose.yml (docker-compose.yml.dist) pour pouvoir le personnaliser

Sync des sources en continue


# docker-compose.yml
back:
    build: .
    volumes:
            - "./back/:/src"
            
Ou

# docker-compose.yml
back:
    build: .
    volumes:
            - "../moBackDanUnAutreRepo/:/src"
            

Gestion des logs/uploads/cache

Pour pas tout perdre à chaque build


VOLUME /var/log /src/cache
            

Pour les consulter sans se connecter au container


# docker-compose.yml
back:
    build: .
    volumes:
            - "logs/:/var/log"
            

Manipulation des Container

Image vs Container

Image : System buildé et configuré n'ayant jamais tourné

Container : Instance d'une image ayant tournée / en fonctionnement

Commandes basiques

Container actifsdocker ps
Tous les containerdocker ps -a
Imagesdocker images
Supprimer un containerdocker rm
Supprimer une imagesdocker rmi
Lancer une commande dans une imagedocker run --rm -it ImageName "command"
Lancer une commande dans un container actifdocker exec -it ContainerName "command"

Déploiement

Docker-compose special pour la prod :
  • Pas de Volume
  • Specifier les ports/env
  • Ajouter des services pour les logs, ...
  • Relancer le container au démarage : restart: always
Puis, pour relancer back :

$ git pull
$ docker-compose build back
$ docker-compose up --no-deps -d back
            

Merci!

Des questions ou des
retours d'expérience ?

Slides : https://github.com/tychota/conf-docker-bam

Repository : https://github.com/bamlab/docker-demo