DevOps #2 - Docker

TODO : A VALIDER

Déployer votre application dans un conteneur ?

Objectifs

  • Installer docker, découvrir les commandes de base
  • Télécharger des images, démarrer des conteneurs
  • Créer vos propres images ‐ Déployer votre application dans un conteneur
  • Créer vos propres stack avec docker‐compose
  • Quelques bonnes pratiques
  • Scalling ‐ Haute dispo
  • Déploiements en mode “blue‐green”
  • Ajouter un frontal HTTPS
  • Orchestration docker

Installer Docker

Docker Installation

Commandes docker

docker
build Build an image from a Dockerfile
cp Copy files/folders between a container and the local
exec Run a command in a running container
images List images
info Display system‐wide information
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registre
restart Restart one or more containers
rm Remove one or more containers
start Start one or more stopped containers
stop Stop one or more running containers
...

Hub Docker

  • Trouver des images publiques
  • Choissiez les images officielles

httpd

Télécharger les images

docker pull httpd:2.2

L’image est décomposée en plusieurs “layers”. C’est un concept important Layers

docker images

Démarrer un conteneur

Maintenant que les images sont téléchargées, il faut démarrer des conteneurs à partir de ces images. Un conteneur est l’instance d’une image.

Démarrer un conteneur Apache

docker run httpd:2.2
# Constater si Apache est accessible à http://localhost:80/
# CTRL C pour sortir

Ouvrir le port 80

docker run ‐p 80:80 httpd:2.2
# Constater si Apache est accessible à http://localhost:80/
# CTRL C pour sortir

Changer de port

docker run ‐p 81:80 httpd:2.2
# Constater si Apache est accessible à http://localhost:81/

Commandes de base

Démarrer le conteneur en background, avec un nom

docker run ‐p 81:80 ‐‐name "apache" ‐d httpd:2.2
# Constater si Apache est accessible à http://localhost:81/

Lister et arrêter les conteneurs démarrés

docker ps
docker stop apache
docker ps
# Constater que docker ps est vide
docker ps ‐a
# Constater que docker ps ‐a liste tout les conteneurs qui ont été arrêtés

Exécuter des commandes sur le conteneur

docker start apache
docker exec apache ls /usr/local/apache2/htdocs/
docker exec apache vi /usr/local/apache2/htdocs/index.html
# Peut‐on faire un vi dans un conteneur ?

Copier un fichier dans le conteneur

echo "Hello ATOS" > index.html
docker cp index.html apache:/usr/local/apache2/htdocs/index.html
docker exec apache cat /usr/local/apache2/htdocs/index.html
# Vérifier que le fichier a bien été mis à jour dans le conteneur

Cycle de vie des conteneurs

docker ps
docker stop apache
docker ps
docker ps ‐a
docker start apache
docker stop apache
docker rm apache
docker start apache
docker run ‐p 81:80 ‐d ‐‐name "apache" httpd:2.2
docker stop apache
docker rm apache

Persistance des données

Utilisation des volumes

echo "Hello ATOS" > /volumes/apache/index.html
docker run ‐p 81:80 ‐d ‐v /volumes/apache:/usr/local/apache2/htdocs ‐‐name "apache" httpd:2.2
docker stop apache
docker rm apache
docker run ‐p 81:80 ‐d ‐v /volumes/apache:/usr/local/apache2/htdocs ‐‐name "apache" httpd:2.2

Docker-compose

La commande docker est puissante mais va devenir relativement lourde à utiliser.

Avant d’utiliser une interface graphique, on peut déjà utiliser docker‐compose en invite de commande pour simplifier la création des conteneurs.

  • Notion de stack : création d’une pile l’applications (donc de conteneurs) reliées les unes aux autres

docker-compose installation

touch docker‐compose.yml

version: '3'
services:
  apache:
    restart: always
    image: httpd:2.2
    container_name: "front‐end"
    ports:
      ‐ 81:80
    volumes:
      ‐ /volumes/apache:/usr/local/apache2/htdocs
docker‐compose up ‐d
# Démarre tout les services de notre stack (ici juste un apache)
docker‐compose ps
# Equivalent du docker ps
docker‐compose down
# Coupe tout les services de notre stack
version: '3'
services:
  apache:
    restart: always
    image: httpd:2.2
    container_name: "front‐end"
    ports:
      ‐ 81:80
    volumes:
      ‐ /volumes/apache:/usr/local/apache2/htdocs
  apache‐light:
    restart: always
    image: httpd:2.2‐alpine
    container_name: "front‐end‐ligth"
    ports:
      ‐ 80:80
    volumes:
      ‐ /data/apache:/usr/local/apache2/htdocs

docker-compose up -d

Créer et déployer une stack complète

  • Front‐end Angular JS
  • Back‐end Spring Data
  • Base de données Postgresql

git clone https://github.com/ReachInfinity/tech-lunch-docker

Présentation de l’application

Front‐end (dossier web)

  • index.html
  • js/…
  • css/… Back‐end (dossier java)
  • demo‐1.0.jar
  • application.properties

Construction des images docker

cd web/
docker build . ‐t myfrontend:1.0
cd java/
docker build . ‐t mybackend:1.0

Manipulation de la stack

docker-compose up -d

Valider le fonctionnement du load-balancer

Naviguer vers http://localhost:1936/stats User: stats Pwd: stats

Scalling du back-end !

docker‐compose up ‐d ‐‐scale back‐end=5

Notre load‐balancer se met à jour à constater sur http://localhost:1936/stats

Notre petite application tourne maintenant à merveille ! http://localhost:81/

Pas d’IPs sur la stack ?

Comment est-ce que cela fonctionne ?
Docker configure automatiquement son réseau en mappant les adresses IPs de chaque conteneur avec un alias égal au nom du service déclaré dans docker‐compose.

Notre application java est configurée de la sorte:

spring.datasource.url=jdbc:postgresql://database:5432/demo

Cela ne peut fonctionner que parce que notre docker‐compose.yml déclare un service nommé database