Docker Compose starts wordpress using traefik, nginx, mariadb

Posted on 2023-12-06  181 Views


WordPress Docker Stack

  • Traefik for accepting incoming http/https requests and automating ssl certificates and then send http to nginx.
  • Nginx with caching for reverse proxying to the WordPress php-fpm service
  • WordPress php-fpm image for the WordPress installation. Themes and plugins can be stored in code under the ./wordpress directory.
  • MariaDB service for the database.
  • Prometheus(to be continue...)
  • Grafana(to be continue...)

Directory Tree Structure

Create such Project for wordpress subproject containing db, wordpress, and nginx.

.env
docker-compose.yml
├── db
│   └── data
├── wordpress
│   └── wp-content
│   └── wp-XXX
│   └── wp-XXX
│   └── ...

Create such Project for traefik subproject

docker-compose.yml
├── config
├── logs

Configuration

  1. Edit the content below to fetch your case.
# Copyright VMware, Inc.
# SPDX-License-Identifier: APACHE-2.0

version: '2'
services:
  mariadb:
    image: docker.io/bitnami/mariadb:11.1
    env_file: .env
    volumes:
      - './db:/bitnami/mariadb'
    environment:
      # ALLOW_EMPTY_PASSWORD is recommended only for development.
      - MARIADB_USER=MARIADB_USER
      - MARIADB_DATABASE=wordpress
      - MARIADB_ROOT_PASSWORD=MARIADB_ROOT_PASSWORD
    networks:
      - wordpress_network
  wordpress:
    container_name: wordpress
    image: docker.io/bitnami/wordpress-nginx:6
    env_file: .env
    expose:
      - 8443
      - 8080
    volumes:
      - './wp:/bitnami/wordpress'
    depends_on:
      - mariadb
    environment:
      # ALLOW_EMPTY_PASSWORD is recommended only for development.
      - WORDPRESS_DATABASE_HOST=mariadb
      - WORDPRESS_DATABASE_PORT_NUMBER=3306
      - WORDPRESS_DATABASE_USER=MARIADB_USER
      - WORDPRESS_DATABASE_PASSWORD=MARIADB_PASSWORD
      - WORDPRESS_DATABASE_NAME=<your database name for wordpress>
      - WORDPRESS_USERNAME=<your wp username>
      - WORDPRESS_PASSWORD=<your wp password>
      - WORDPRESS_EMAIL=<your email>
      - WORDPRESS_BLOG_NAME=<your blog name>
    labels:
      - traefik.enable=true
      - traefik.http.routers.wordpress.rule=Host(`www.your_domain_name`) || Host(`your_domain_name`)
      - traefik.http.services.wordpress.loadbalancer.server.port=8443
      - traefik.http.services.wordpress.loadbalancer.server.scheme=https
      - traefik.http.services.wordpress.loadbalancer.passhostheader=true
      - traefik.http.routers.wordpress.middlewares=redirect
      - traefik.http.middlewares.redirect.redirectscheme.scheme=https
      - traefik.http.middlewares.redirect.redirectscheme.permanent=true
    networks:
      - wordpress_network

networks:
  wordpress_network:
    driver: bridge
  1. Edit the macro in .env file.
  2. Edit the following content of docker-compose.yml in traefik.
version: "3.3"

services:
  traefik:
    image: traefik:v2.10.5
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
    volumes: 
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./config/traefik.yaml:/etc/traefik/traefik.yaml:ro
      - ./config/dynamic.yaml:/etc/traefik/dynamic.yaml:ro
      - ./config/acme.json:/letsencrypt/acme.json
      - ./logs/:/logs/
    env_file:
      - ./config/cloudflare.env
    networks:
      - blog_wordpress_network

networks:
  blog_wordpress_network:
    external: true
  1. Run
docker-compose up -d