Docker Compose

De Wiki personal d'en Guillem Serrat

Creació d'arxius i directoris

Per començar a treballar amb Docker Compose crearem la següent estructura de directoris

6.3/
└── lemp
    ├── docker-compose.yml
    ├── nginx-conf
    │   └── nginx.conf
    ├── php-dockerfile
    └── php-files
        ├── 00_connect.php
        └── index.php


index.php

Configuració d'Nginx

Generació de Dockerfiles

Docker Compose

Quan treballem amb Dockers, sobretot quan necessitem una xarxa de Dockers conectada entre sí, fem servir el que s’anomena Docker Compose

Docker compose treballa amb fitxers docker-compose.yml, els quals descriuen:

  • Serveis (o contenidors)
  • Imatges d’aquests serveis
  • Ports, xarxes, volums i variables d’entorn
  • Dependències entre serveis

En aquest cas, generarem un docker-compose.yml on definirem

  1. Un contenidor anomenat PHP
    1. La imatge del contenidor serà a partir del Dockerfile (el propi compose fa el build)
    2. Un volum compartit entre la carpeta host ./php-files i /var/www/html
      1. Un volum compartit té la funció de mantenir els mateixos arxius en els directoris especificats entre el host i el docker
    3. Dependència del contenidor “mariadb”
      1. Aquest contenidor no es posarà en marxa fins que el contenidor mariadb no ho estigui
  2. Un contenidor anomenat Nginx
    1. La imatge del contenidor serà la imatge oficial de Nginx, de dockerhub
    2. Els ports exposats seran
      1. El port 8090 de la màquina host dirigirà el port 80 del Docker
    3. Links (tot i que avui en dia no cal especificar-ho, ja que el propi compose crea una xarxa interna
      1. Un link al contenidor “php”, per permetre que tots dos contenidors es puguin comunicar
    4. Volums
      1. El contingut de ./php-files del host es compartirà amb el directori /var/www/html del Docker
      2. El contingut de ./nginx-conf del host es compartirà amb el directori /etc/nginx/conf.d del Docker
    5. Dependència del contenidor amb nom “php”
      1. Aquest contenidor no es posarà en marxa fins que el contenidor php no ho estigui
  3. Un contenidor anomenat mariadb (contenidor que únicament serà accesible des de la xarxa del docker compose i no des de l’exterior, i per això no cal exposar cap port)
    1. La imatge del contenidor serà la imatge oficial de MariaDB, de dockerhub
    2. Variables d’entorn
      1. La contrasenya de ROOT de MariaDB serà fjeclot
    3. Volums
      1. El contingut de /var/lib/mysql es desarà a un volum intern de Docker anomenat mysqldata (no es un directori del projecte, és un volum intern de docker, els quals s'acustuma a desar-se a /var/lib/docker/volumes)
  4. Un contenidor anomenat phpmyadmin
    1. La imatge del contenidor serà la imatge oficial de phpmyadmin, de dockerhub
    2. Variables d’entorn
      1. El hostname de la BD serà el nom del contenidor mariadb (Docker compose pot resoldre hostnames amb el nom del propi contenidor)
    3. Dependència del contenidor “mariadb”
      1. Aquest contenidor no es posarà en marxa fins que el contenidor mariadb no ho estigui
# version: '3.8' # L'atribut version ja no és necessari en l'última versió de docker

services:

   php:
       build:
           dockerfile: php-dockerfile #Construim el Docker a partir de la imatge pròpia
       volumes:
           - './php-files:/var/www/html' # Definim un volum. Els documents del directori ./php-files del host es compartiran amb el directori /var/www/html del Docker
       depends_on:
           - mariadb # Requerim que el servei mariadb estigui operatiu

   nginx:
       image: nginx:latest # Utilitzem la imatge oficial de nginx, la última versió
       ports:
           - 8090:80 # El port 8090 del host dirigirà al port 80 del Docker
       links: # Avui en dia no cal especificar-ho, ja que docker compose ja crea una xarxa interna
           - 'php' # Permet que el Docker Nginx es pugui comunicar amb el Docker "php"
       volumes:
           - './php-files:/var/www/html' # El contingut de ./php-files del host es compartirà amb el directori /var/www/html del Docker
           - './nginx-conf:/etc/nginx/conf.d' # El contingut de ./nginx-conf del host es compartirà amb el directori /etc/nginx/conf.d del Docker
       depends_on:
           - php # Requerim que el servei php estigui operatiu

   mariadb: # No exportem cap port ja que la BD no cal que sigui accesible des de l'exterior, sinó que únicament des dels altres Dockers
       image: mariadb:10.9 # Fem servir la imatge oficial de mariadb
       environment:
           MYSQL_ROOT_PASSWORD: fjeclot # Definim la contrasenya de root de MariaDB
       volumes:
           - mysqldata:/var/lib/mysql # El contingut de /var/lib/mysql es desarà a un volum intern de Docker anomenat mysqldata (NO ÉS UN DIRECTORI DEL PROJECTE, ÉS UN VOLUM INTERN DE DOCKER)

   phpmyadmin:
       image: phpmyadmin/phpmyadmin:latest # Fem servir la imatge de PHPMyAdmin
       ports:
           - 8091:80 # El port 8091 del host dirigirà al port 80 del Docker
       environment:
           PMA_HOST: mariadb # Indiquem el hostname de la BD, en aquest cas el nom del docker
       depends_on:
           - mariadb # Requerim que el servei mariadb estigui operatiu

# Definim els volums INTERNS de Docker
volumes:
 mysqldata: # Els arxius dels volumns interns de Docker s'acustuma a desar-se a /var/lib/docker/volumes

Un cop hem realitzat totes les configuracions necessàries, posarem en marxa tots els contenidors del docker compose

docker compose up -d # Al mateix directori on es troba el docker compose

Amb l’ordre docker compose ps -a comprovarem que s’han creat els 4 dockers a partir del compose.

guseba@phpDebianAzure:/var/www/html/php/exercicis/practica6/6.3/lemp$ docker compose ps -a NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS lemp-mariadb-1 mariadb:10.9 "docker-entrypoint.s…" mariadb 42 hours ago Up 38 minutes 3306/tcp lemp-nginx-1 nginx:latest "/docker-entrypoint.…" nginx 42 hours ago Up 38 minutes 0.0.0.0:8090->80/tcp, [::]:8090->80/tcp lemp-php-1 lemp-php "docker-php-entrypoi…" php 42 hours ago Up 38 minutes 9000/tcp lemp-phpmyadmin-1 phpmyadmin/phpmyadmin:latest "/docker-entrypoint.…" phpmyadmin 42 hours ago Up 38 minutes 0.0.0.0:8091->80/tcp, [::]:8091->80/tcp

Amb l’ordre sudo netstat -putan | grep 80 podem comprovar que els ports definits anteriorment estan escoltant en el nostre localhost, i tenen de nom de servei docker-proxy

guseba@phpDebianAzure:/var/www/html/php/exercicis/practica6/6.3/lemp$ sudo netstat -putan | grep 80 | grep LISTEN tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 2067/docker-proxy tcp 0 0 0.0.0.0:8090 0.0.0.0:* LISTEN 1564/docker-proxy tcp 0 0 0.0.0.0:8091 0.0.0.0:* LISTEN 1715/docker-proxy tcp6 0 0 :::80  :::* LISTEN 756/apache2 tcp6 0 0 :::8080  :::* LISTEN 2072/docker-proxy tcp6 0 0 :::8090  :::* LISTEN 1570/docker-proxy tcp6 0 0 :::8091  :::* LISTEN 1720/docker-proxy