Well, It's up to you to prefer including a webserver on your stack or outside (in it's own stack). Both will work.
Personaly, i prefer include all the stuff in one docker-compose file (although the database in it's own stack is a better practice).
There is my functionnal docker-compose file for a wordpress site (PHP-FPM) :
version: '3.7'
services:
database:
image: mariadb:${MARIADB_VERSION}
container_name: ${PROJECT_NAME}_database
restart: unless-stopped
volumes:
- ./conf/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_USER_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
networks:
- net
phpmyadmin:
image: phpmyadmin:latest
container_name: ${PROJECT_NAME}_phpmyadmin
restart: unless-stopped
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
depends_on:
- database
environment:
PMA_HOST: database
UPLOAD_LIMIT: 1G
PMA_PORT: 3306
PMA_ABSOLUTE_URI: "https://${HOST_NAME}/_phpmyadmin/"
labels:
- traefik.enable=true
- traefik.docker.network=proxy
- traefik.http.routers.${PROJECT_NAME}-phpmyadmin.rule=Host(`${HOST_NAME}`) && PathPrefix(`/_phpmyadmin/`)
- traefik.http.routers.${PROJECT_NAME}-phpmyadmin.tls=true
- traefik.http.routers.${PROJECT_NAME}-phpmyadmin.entrypoints=http,https
- traefik.http.routers.${PROJECT_NAME}-phpmyadmin.middlewares=stripprefix-phpmyadmin
- traefik.http.routers.${PROJECT_NAME}-phpmyadmin.service=${PROJECT_NAME}-phpmyadmin
- traefik.http.middlewares.stripprefix-phpmyadmin.stripprefix.prefixes=/_phpmyadmin
- traefik.http.services.${PROJECT_NAME}-phpmyadmin.loadbalancer.server.port=80
networks:
- net
- proxy
nginx:
image: nginx:${NGINX_VERSION}
container_name: ${PROJECT_NAME}_nginx
restart: unless-stopped
volumes:
- ./conf/nginx:/etc/nginx:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./logs/nginx:/var/log/nginx
- ./www:/var/www/html
depends_on:
- wordpress
labels:
- traefik.enable=true
- traefik.docker.network=proxy
- traefik.http.routers.${PROJECT_NAME}.rule=Host(`${HOST_NAME}`, `www.${HOST_NAME}`)
- traefik.http.routers.${PROJECT_NAME}.entrypoints=http,https
- traefik.http.routers.${PROJECT_NAME}.middlewares=compression@file,security@file
- traefik.http.routers.${PROJECT_NAME}.service=${PROJECT_NAME}
- traefik.http.services.${PROJECT_NAME}.loadbalancer.server.port=80
- traefik.http.routers.${PROJECT_NAME}-admin.rule=Host(`${HOST_NAME}`) && (Path(`/wp-admin`) || Path(`/wp-login.php`))
- traefik.http.routers.${PROJECT_NAME}-admin.entrypoints=http,https
- traefik.http.routers.${PROJECT_NAME}-admin.middlewares=whitelist@file
- traefik.http.routers.${PROJECT_NAME}-admin.service=${PROJECT_NAME}-admin
- traefik.http.services.${PROJECT_NAME}-admin.loadbalancer.server.port=80
networks:
- proxy
- net
wordpress:
image: wordpress:${PHP_VERSION}
container_name: ${PROJECT_NAME}_wordpress
restart: unless-stopped
volumes:
- ./conf/php/php-fpm.conf:/usr/local/etc/php-fpm.d/zzz-custom.conf:ro
- ./conf/php/php.ini:/usr/local/etc/php/conf.d/custom.ini:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./www:/var/www/html
depends_on:
- database
environment:
WORDPRESS_DB_HOST: database
WORDPRESS_DB_USER: ${MYSQL_USER}
WORDPRESS_DB_PASSWORD: ${MYSQL_USER_PASSWORD}
WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
WORDPRESS_TABLE_PREFIX: ${MYSQL_TABLE_PREFIX}
mem_limit: 1G
extra_hosts:
- ${HOST_NAME}:${DOCKER_GATEWAY_TRAEFIK_PROXY}
networks:
- net
volumes:
db:
networks:
net:
driver: bridge
proxy:
external: true
There is a lots of tweak in my docker-compose file (php .ini, database config, middleware, etc), you don't have to use all of them (you can ignore them)
Maybe your problem come from your traefik's config...
Hope this help !
Bye