Estructura de directorios para Docker Compose

Cuando se decide la estructura de directorios para un proyecto nuevo, es importante que sea funcional y escalable.

Para mi ha funcionado la siguiente:

# Raíz del proyecto
./
./docker-compose.yml 

# Aquí irá todo lo relacionado con Docker
./infrastructure/docker/
./infrastructure/docker/php/Dockerfile
./infrastructure/docker/nginx/Dockerfile
./infrastructure/docker/mysql/Dockerfile
./infrastructure/docker/python/Dockerfile

Es bastante simple. Docker compose hará referencia a los Dockerfile de dentro de ./infrastructure y así todo queda bastante bien atado.

El docker-compose.yml tendría ésta pinta (simplificado):

version: '3'

services:
  nginx:
    image: ./infrastructure/docker/nginx/
    # .... mas cosas
      
  php:
    image: ./infrastructure/docker/php
    # .... mas cosas

  mysql:
    image: ./infrastructure/docker/mysql
    # .... mas cosas

Como bien sabemos, hay algunos containers que cuando los construímos necesitan configuración extra. Pues muy fácil, lo metemos en el subdirectorio que corresponda, y después modificamos docker-compose.yml para que comparta mediante volúmenes los ficheros. La estructura de directorios con ficheros de configuración:

./infrastructure/docker/nginx/Dockerfile
./infrastructure/docker/nginx/nginx.conf
./infrastructure/docker/nginx/virtualhosts/example.com
./infrastructure/docker/nginx/virtualhosts/subdomain.example.com

Y el docker-compose.yml actualizado:

version: '3'

services:
  nginx:
    image: ./infrastructure/docker/nginx/
    volumes:
      - ./infrastructure/docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./infrastructure/docker/nginx/virtualhosts/:/etc/nginx/vhosts/:ro
    # .... mas cosas
      

Extensible

En mis proyectos trabajo con Jenkins, Packer, Terraform y muchas otras tecnologías. Todo tiene cabida dentro de ./infrastructure:

./infrastructure/docker/...
./infrastructure/jenkins/Jenkinsfile
./infrastructure/jenkins/Jenkinsfile.build
./infrastructure/jenkins/Jenkinsfile.unittest
./infrastructure/jenkins/Jenkinsfile.functionaltest
./infrastructure/ansible/playbooks/...
./infrastructure/ansible/roles/...
./infrastructure/ansible/packer/test-node-ami.json
./infrastructure/ansible/packer/db-ami.json
./infrastructure/ansible/terraform/testing-environment.tf
./infrastructure/ansible/terraform/database.tf
...

Cómodo

Tener todos estos ficheros de configuración en el mismo repositorio ofrece la gran ventaja de que los tienes que commitear en el repositorio, versionar, y si tienes un proceso de revisión de código, todo el mundo ve los cambios. Típico de devops.

Conclusión

Es una estructura muy simple, pero que acostumbra a quedar muy limpio todo; a nosotros nos ha dado estupendos resultados hasta la fecha. La recomiendo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *