I have a Docker setup serving two WordPress blogs with a proxy, and using the following structure and docker-compose file:
.
├── nginx-proxy
│ └── docker-compose.yml
└── blogs
└── docker-compose.yml
docker-compose.yml
version: "3"
services:
db:
container_name: ${CONTAINER_DB_NAME}
image: mariadb:latest
restart: unless-stopped
volumes:
- ${DB_PATH}:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
wordpress1:
depends_on:
- db
container_name: ${CONTAINER_WP_NAME1}
image: wordpress:latest
restart: unless-stopped
volumes:
- ${WP_CORE}:/var/www/html
- ${WP_CONTENT}:/var/www/html/wp-content
- ./conf.d/php.ini:/usr/local/etc/php/conf.d/php.ini
environment:
WORDPRESS_DB_HOST: ${CONTAINER_DB_NAME1}:3306
WORDPRESS_DB_NAME: ${MYSQL_DATABASE1}
WORDPRESS_DB_USER: ${MYSQL_USER1}
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD1}
WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX1}
VIRTUAL_HOST: ${DOMAINS1}
LETSENCRYPT_HOST: ${DOMAINS1}
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL1}
logging:
options:
max-size: ${LOGGING_OPTIONS_MAX_SIZE1:-200k}
wordpress2:
depends_on:
- db
container_name: ${CONTAINER_WP_NAME2}
image: wordpress:latest
restart: unless-stopped
volumes:
- ${WP_CORE}:/var/www/html
- ${WP_CONTENT}:/var/www/html/wp-content
- ./conf.d/php.ini:/usr/local/etc/php/conf.d/php.ini
environment:
WORDPRESS_DB_HOST: ${CONTAINER_DB_NAME2}:3306
WORDPRESS_DB_NAME: ${MYSQL_DATABASE2}
WORDPRESS_DB_USER: ${MYSQL_USER2}
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD2}
WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX2}
VIRTUAL_HOST: ${DOMAINS2}
LETSENCRYPT_HOST: ${DOMAINS2}
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL2}
logging:
options:
max-size: ${LOGGING_OPTIONS_MAX_SIZE2:-200k}
networks:
default:
external:
name: ${NETWORK}
But I'd like to make it more maintainable. I want to refactor this in order to make a separate container to the mysql db, refactor each blog config to it's own docker-compose file and reference the db on each blog configuration, like so:
.
├── db
│ └── docker-compose.yml
├── blog1
│ └── docker-compose.yml
├── blog2
│ └── docker-compose.yml
└── blog3
└── docker-compose.yml
db container
version: "3"
services:
db:
container_name: ${CONTAINER_DB_NAME}
image: mariadb:latest
restart: unless-stopped
volumes:
- ${DB_PATH}:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
networks:
default:
external:
name: ${NETWORK}
blog1 container
version: "3"
services:
wordpress1:
depends_on:
- db // Does Docker knows this is db service I created outside it?
container_name: ${CONTAINER_WP_NAME1}
image: wordpress:latest
restart: unless-stopped
volumes:
- ${WP_CORE}:/var/www/html
- ${WP_CONTENT}:/var/www/html/wp-content
- ./conf.d/php.ini:/usr/local/etc/php/conf.d/php.ini
environment:
WORDPRESS_DB_HOST: ${CONTAINER_DB_NAME1}:3306
WORDPRESS_DB_NAME: ${MYSQL_DATABASE1}
WORDPRESS_DB_USER: ${MYSQL_USER1}
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD1}
WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX1}
VIRTUAL_HOST: ${DOMAINS1}
LETSENCRYPT_HOST: ${DOMAINS1}
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL1}
logging:
options:
max-size: ${LOGGING_OPTIONS_MAX_SIZE1:-200k}
networks:
default:
external:
name: ${NETWORK}
... and so on.
I have no idea on how to handle the db connection. Today, I put a reference to it at the "depends_on" section, as the db service configuration lies on the same file as the blog. But how do I invoke the db instance when the sites are declared into separate files? Does Docker knows that the "db" is the db service declared externally to that file?
Any ideas would be great!