I'm running stuff on our staging server just now doing this (we've not been quite brave enough to push the setup to production though). We've got :
- a docker-compose.yml file for each app that sets up the app, scheduler, queues and adds some keys for -
- traefik which takes care of routing incoming requests to the correct containers.
Our dockerfile setup is based on the idea from this laravel news article.
Our docker-compose.yml file ends up like this :
version: "3"
services:
app:
image: localhost:5000/someapp-web
container_name: someapp-web
build:
context: .
dockerfile: docker/Dockerfile
depends_on:
- redis
- mysql
networks:
- proxy
- private
expose:
- "80"
environment:
APP_ENV: local
CONTAINER_ROLE: app
DB_CONNECTION: mysql
DB_HOST: mysql
DB_DATABASE: someapp2
DB_USERNAME: homestead
DB_PASSWORD: secret
CACHE_DRIVER: redis
SESSION_DRIVER: redis
QUEUE_DRIVER: redis
REDIS_HOST: redis
DEFAULT_DISK: images
deploy:
replicas: 3
labels:
- "traefik.backend=someapp-web"
- "traefik.docker.network=proxy"
- "traefik.frontend.rule=Host:someapp.staging.our.domain.com"
- "traefik.enable=true"
- "traefik.port=80"
- "traefik.default.protocol=http"
scheduler:
image: localhost:5000/someapp-web
container_name: someapp-scheduler
depends_on:
- app
deploy:
labels:
- "traefik.enable=false"
networks:
- private
environment:
APP_ENV: local
CONTAINER_ROLE: scheduler
DB_CONNECTION: mysql
DB_HOST: mysql
DB_DATABASE: someapp2
DB_USERNAME: homestead
DB_PASSWORD: secret
CACHE_DRIVER: redis
SESSION_DRIVER: redis
QUEUE_DRIVER: redis
REDIS_HOST: redis
DEFAULT_DISK: images
queue:
image: localhost:5000/someapp-web
container_name: someapp-queue
depends_on:
- app
deploy:
replicas: 2
labels:
- "traefik.enable=false"
networks:
- private
environment:
APP_ENV: local
CONTAINER_ROLE: queue
DB_CONNECTION: mysql
DB_HOST: mysql
DB_DATABASE: someapp2
DB_USERNAME: homestead
DB_PASSWORD: secret
CACHE_DRIVER: redis
SESSION_DRIVER: redis
QUEUE_DRIVER: redis
REDIS_HOST: redis
DEFAULT_DISK: images
redis:
container_name: someapp-redis
image: redis:4
deploy:
labels:
- "traefik.enable=false"
networks:
- private
volumes:
- redis:/data
mysql:
container_name: someapp-mysql
image: mysql:5.7
deploy:
labels:
- "traefik.enable=false"
networks:
- private
volumes:
- mysql:/var/lib/mysql
environment:
MYSQL_DATABASE: someapp2
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
volumes:
redis:
driver: "local"
mysql:
driver: "local"
networks:
private:
proxy:
external: true