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 et service 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/