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
...

docker pull httpd:2.2
L’image est décomposée en plusieurs “layers”. C’est un concept important Layers
docker images
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/
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
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
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.
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
git clone https://github.com/ReachInfinity/tech-lunch-docker
Front‐end (dossier web)
cd web/
docker build . ‐t myfrontend:1.0
cd java/
docker build . ‐t mybackend:1.0
docker-compose up -d
Naviguer vers http://localhost:1936/stats User: stats Pwd: stats
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/
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