building and running the docker setup
we’ll have a data
folder where we’ll keep the files/data we need to mount inside docker containers as volumes
wordpress
and database
will be our directories for the WordPress site and the MySQL database files. These will be in the user’s home directory (and not in the data
folder)
we’ll have a .env
file for the secrets. .env
in the project’s root is picked up by Docker automatically. You can reference environment variables inside docker-compose.yml
like you reference bash variables: ${MYSQL_PASSWORD}
You can use environment variables in configuration values with a Bash-like ${VARIABLE} syntax - see variable substitution for full details.
.
├── data
│ ├── certbot
│ │ ├── conf
│ │ └── www
│ └── nginx
│ └── nginx.conf
└── docker-compose.yml
# .env
# MySQL Credentials
MYSQL_DATABASE=blah
MYSQL_USER=blah
MYSQL_PASSWORD=blah
MYSQL_ROOT_PASSWORD=blah
# WordPress Credentials
WORDPRESS_DB_HOST=mysql # this is the name of our MySQL service container
WORDPRESS_DB_NAME=blah
WORDPRESS_DB_USER=blah
WORDPRESS_DB_PASSWORD=blah
1# WordPress
2wordpress:
3 container_name: wordpress
4 image: wordpress:php7.4-apache
5 restart: always
6 stdin_open: true
7 tty: true
8 environment:
9 WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
10 WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
11 WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
12 WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
13 volumes:
14 - /home/${USER}/wordpress:/var/www/html
1# MySQL
2mysql:
3 container_name: mysql # this will be the name used in logs when starting/stopping instead of ` wp-devops_mysql_1`
4 image: mysql:5.7
5 restart: unless-stopped
6 # if you use mysql version 8 you need PHP to handle passwords correctly
7 # command: '--default-authentication-plugin=mysql_native_password'
8 environment:
9 # getting these values from `.env`
10 MYSQL_DATABASE: ${MYSQL_DATABASE}
11 MYSQL_USER: ${MYSQL_USER}
12 MYSQL_PASSWORD: ${MYSQL_PASSWORD}
13 MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
14 ports:
15 - 3306:3306
16 volumes:
17 - /home/${USER}/database:/var/lib/mysql
1# Nginx Proxy
2nginx:
3 container_name: nginx
4 image: nginx:latest
5 restart: unless-stopped
6 ports:
7 - 80:80
8 - 443:443
9 volumes:
10 - ./nginx/conf:/etc/nginx/conf.d
11 - ./certbot/conf:/etc/nginx/ssl
12 - ./certbot/data:/var/www/html
1# SSL - Certbot or ZeroSSL
2certbot:
3 container_name: certbot
4 image: certbot/certbot:latest
5 command: certonly --webroot --webroot-path=/var/www/html --email youremail@domain.com --agree-tos --no-eff-email -d domain.com -d www.domain.com
6 volumes:
7 - ./certbot/conf:/etc/letsencrypt
8 - ./certbot/logs:/var/log/letsencrypt
9 - ./certbot/data:/var/www/html
The following three lines specify which SSL cert file to use.
ssl on;
ssl_certificate /etc/ssl/certificate.crt;
ssl_certificate_key /etc/ssl/private.key;
1docker-compose up
2
3docker ps -a