Build, Ship, Run
Juin 2017
Architecte Plateforme (Dev & Ops + DevOps)
XP: 15+
Docker : 2013 - ...
Conteneur : la solution universelle
Appartement vs Maison
Containers, VMs... Comment ces technologies fonctionnent et comment les différencier? (Quentin Adam)
# Télécharger une image docker image pull debian:jessie # Exécuter un container et lui passer une commande : docker container run --rm docker/whalesay cowsay boo-boo # Interagir avec un container docker container run -t -i debian /bin/bash # Lancer un container en mode daemon docker container run -d debian /bin/sh -c "while true; do echo hello world; sleep 1; done"
# Récupérer une image docker docker image pull [image] # Créer un container à partir d'une image docker container run [image] # Voir les logs du container : docker container logs [container] # Voir les container actifs : docker container ps # Voir tous les containers (actifs ou pas) : docker container ps -a # Voir les images de l'hôte : docker image ls
# Arrêter / Démarrer un container docker container stop/start [container] # Supprimer un container / une image docker container rm [container] docker image rm [image] # Copier un fichier dans/depuis un container docker container cp file [container]:/path/to/file docker container cp [container]:/path/to/file file # Inspecter un container docker container inspect [container]
docker container run -d -p 80:5000 training/webapp python app.py
# Tailer les logs docker container logs -f [container] # Entrer dans un container docker container exec -ti [container] bash # Exécuter une commande docker container exec -ti [container] /path/to/command args # Avoir le top du container docker container top [container] # Avoir des stats CPU/RAM/... du container docker container stats [container]
Données persistantes & partageables
# Crée un volume docker (! jamais purgé !) docker container run -d -P --name web -v /webapp training/webapp python app.py # Crée un volume mappé sur un répertoire de la machine hôte docker container run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py # Idem mais en lecture seule (secrets, certificats, conf) docker container run -d -P --name web -v /src/project/webapp:/opt/webapp:ro training/webapp python app.py # On peut aussi monter un fichier (et pas uniquement un dossier) docker container run -d -P --name web -v /src/project/ssl/mycert.pem:/etc/ssl/mycert.pem:ro training/webapp python app.py
# Lister les réseaux docker network ls # Créer un réseau docker network create -d bridge my-bridge-network # Démarrer un container et l'attacher à un réseau docker container run -d --network=my-bridge-network --name db training/postgres # (Dé)connecter un container à un réseau docker network (dis)connect [network] [container]
FROM nginx:stable-alpine MAITAINER Nicolas SteinmetzVOLUME ["/usr/share/nginx/html"] EXPOSE 8080 ...
FROM node:5 EXPOSE 1111 RUN groupadd -r mynodeapp &&\ useradd -r -g mynodeapp -d /usr/src/app -M mynodeapp RUN npm install -g bower forever ADD app.tar.gz /usr/src/ RUN mkdir /var/log/mynodeapp && \ chown mynodeapp:mynodeapp -R /usr/src/app /var/log/mynodeapp USER mynodeapp VOLUME ["/var/log/mynodeapp"] COPY jsonenv /usr/src/app/.jsonenv RUN chown mynodeapp:mynodeapp /usr/src/app/.jsonenv WORKDIR /usr/src/app RUN npm install WORKDIR /usr/src/app/public RUN bower install WORKDIR /usr/src/app ENTRYPOINT ["forever","--fifo","app.js"]
# Build image docker image build -t bigcorp/myapp:<version> . # Check image is present docker image ls # Push to registry (docker hub or private registry) docker image push ...
Composer vos applications
docker-compose.yml
docker-compose
version: '3' services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: db_data:
deploy
: replicas, placement, mise à jour, etcdocker-compose
# Construire les images de container docker-compose build [service] # Créer et démarrer les containers docker-compose up # Idem en mode daemon : docker-compose up -d # Tout arréter et détruire docker-compose down # Killer les containers docker-compose kill # Scaler le nombre de container docker-compose scale [service]=XXX # Et globalement, les mêmes commandes que docker docker-compose ps, log, exec, stop, start, etc
Organisation projet :
. ├── build │ ├── app.tar.gz │ ├── Dockerfile │ └── jsonenv ├── docker-compose.yml
Avec docker-compose.yml
mynodeapp: build: ./build/ ports: - "1111:1111" volumes: - "/srv/app/mynodeapp/log:/var/log/mynodeapp"
Docker Swarm provides native clustering capabilities to turn a group of Docker engines into a single, virtual Docker Engine
Vers un vrai cluster...
TL;DR : C'est pas sec
Annonces Microsoft @DockerCon
TL;DR : En route vers un support officiel
Le Reverse Proxy "container aware"
Question(s) ?
Merci ! :-)
Nicolas STEINMETZ / CérénIT contact@cerenit.fr / www.cerenit.fr 09.72.58.44.69 / 06.28.20.31.58