Introduction à Docker et Docker Compose
Voici une très rapide introduction à Docker et Docker Compose.
Dans cet exemple nous allons monter une stack classique LEMP automatisée avec Docker Compose qui sera composé de 3 services (nginx, php et sql).
L'application PHP se trouvera dans un volume et sera montée dans /var/www/app
dans les containers nginx et php. Nginx écoutera sur les ports 80
et 443
.
Nous utiliserons une configuration la plus simple possible, pas de SSL, pas de customisations des réseaux, etc...
Installer Docker
https://docs.docker.com/engine/installation/linux/
Installer Docker Compose
https://docs.docker.com/compose/install/
Initialisation
Créer le dossier contenant la stack compose :
$ mkdir ~/docker-app && cd ~/docker-app
Création du fichier de configuration Nginx
$ vi app.conf
server {
listen 80;
server_name your_ip;
client_max_body_size 4M;
client_body_buffer_size 128k;
root /var/www/app;
index index.php;
location ~ \.php$ {
try_files $uri =404;
fastcgi_index index.php;
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
Création du fichier Docker Compose
$ vi docker-compose.yml
version: '3.6'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./app.conf:/etc/nginx/conf.d/
- php-app:/var/www/app
restart: unless-stopped
php:
image: php:7-fpm
volumes:
- php-app:/var/www/app
restart: unless-stopped
db:
image: mysql:latest
volumes:
- mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: $ROOT_PASSWORD
MYSQL_DATABASE: database_name
MYSQL_USER: sql_user
MYSQL_PASSWORD: $USER_PASSWORD
restart: unless-stopped
volumes:
mysql:
Création de la stack
Maintenant que tout est prêt il ne reste plus qu'à lancer la stack compose :
$ docker-compose up -d
Vous allez voir qu'un réseau par défaut est créé, que les images sont pull et que les containers sont démarrés :
$ docker-compose up -d
Creating network "docker-app_default" with the default driver
Creating volume "docker-app_app" with default driver
Creating volume "docker-app_mysql" with default driver
Pulling nginx (nginx:latest)...
latest: Pulling from library/nginx
f7e2b70d04ae: Pull complete
08dd01e3f3ac: Pull complete
d9ef3a1eb792: Pull complete
Pulling php (php:7-fpm)...
7-fpm: Pulling from library/php
f7e2b70d04ae: Already exists
744aedb7995c: Pull complete
[...]
Pulling db (mysql:latest)...
latest: Pulling from library/mysql
f7e2b70d04ae: Already exists
df7f6307ff0a: Pull complete
[...]
Creating docker-app_php_1_1a8316f4f1ba ... done
Creating docker-app_nginx_1_1a7cddafd8a3 ... done
Creating docker-app_db_1_2950b928499f ... done
Vous pouvez voir que les containers sont maintenant lancés et up :
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee9d70df0544 nginx:latest "nginx -g 'daemon of…" About a minute ago Up 2 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp docker-app_nginx_1_1a7cddafd8a3
1c36549bb9b6 mysql:latest "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp docker-app_db_1_aa7226555772
f48fa83e5893 php:7-fpm "docker-php-entrypoi…" 2 minutes ago Up 2 minutes 9000/tcp docker-app_php_1_653974e53893
Test
Nginx étant lancé, nous pouvons accéder au serveur. Pour tester la connexion avec PHP, nous allons créer un fichier index.php
dans le volume qui est sensé contenir l'app :
$ vi /var/lib/docker/volumes/docker-app_app/_data
<?php
// Show all information, defaults to INFO_ALL
phpinfo();
?>
Et si on va sur l'IP, nous avons bien le fichier index.php
qui est interprété :
Pull les dernières images
Pour être toujours à jour sur les images, nous pouvons pull les latest
disponibles :
$ docker-compose pull
Qui nous répondra :
docker-compose pull
Pulling nginx ... done
Pulling php ... done
Pulling db ... done
Si il y a une mise à jour il suffit ensuite de refaire un docker-compose up -d
et votre stack redémarrera avec les dernières images disponibles.
mySQL
Et mySQL dans tout ça ? Et bien vous pourrez l'utiliser dans votre projet, en utilisant les informations rentrées dans le docker-compose.yml
:
[...]
MYSQL_ROOT_PASSWORD: $ROOT_PASSWORD
MYSQL_DATABASE: database_name
MYSQL_USER: sql_user
MYSQL_PASSWORD: $USER_PASSWORD
[...]
en appelant directement l'host mysql:3306
.
Autre commandes
Voici quelques commandes utiles :
- Lister les containers démarrés :
docker ps
- Lister tous les containers :
docker ps -a
- Démarrer ou redémarrer Docker :
service docker start
/systemctl start docker
etservice docker restart
/systemctl restart docker
- Chercher une image :
docker search $name
- Télécharger une image :
docker pull $container/name
- Démarrer un container (id ou nom) :
docker start $id
- Stopper un container (id ou nom) :
docker stop $id
Liens vers la documentation officielle
Tag, push, et pull
https://docs.docker.com/engine/getstarted/step_six/
Dockerfile
https://docs.docker.com/engine/getstarted/step_four/
Docker Compose
https://docs.docker.com/compose/overview/
Docker CLI
https://docs.docker.com/engine/reference/commandline/
https://docs.docker.com/engine/reference/commandline/cli/
Docker ps
https://docs.docker.com/engine/reference/commandline/ps/
Docker image
https://docs.docker.com/engine/reference/commandline/images/
Feel free to correct me if you see any typo or if something seems wrong to you.
You can send me an email or comment below.
Picture : chuttersnap