1개의 머신으로 treafik을 구성해서 사용하다가 홈 네으트워크 인프라가 2개의 머신으로 변경되면서 swarm으로 docker를 관리하게 되었습니다. 기존의 설정으로 traefik 컨테이너는 정상적으로 작동하지 않았는데 swarm에서 traefik을 구성을 해보면서 얻은 경험을 정리해보았습니다.
traefik 정적 설정 파일 업데이트
공식 홈페이지에서는 위와 같이 설정파일을 변경하라했는데 위 처럼 작성하고 배포해도 404에러만 띄웠다.
swarm모드에서만 그렇고 취소하고 다시 로컬에서 docker-compose up -d
하면 잘된다ㅎ 여러가지 살펴보면서 정상 작동되는 설정을 구성했다.
providers:
docker:
watch: true
endpoint: unix:///var/run/docker.sock
exposedbydefault: false
swarmMode: true
network: proxy-main
swarmModeRefreshSeconds: 5
Code language: JavaScript (javascript)
network가 traefik 컨테이너가 설정되는 네트워크로 맞춰야한다.
docker-compose.swarm.yaml
...
services:
app:
networks:
- proxy-main
...
########################### NETWORKS
networks:
proxy-main:
driver: overlay
name: proxy-main
Code language: PHP (php)
네트워크는 위처럼 설정한다 swarm 모드에서는 driver가 overlay로 설정되어야 한다고 나와있다.
좀더 자세한 내용은 docker swarm 공식 문서에가면 잘 설명되어있다.
docker-compose.swarm.yaml
version: "3.8"
########################### SERVICES
services:
# Traefik 2 - Reverse Proxy
app:
env_file:
- ./.env
image: traefik:v2.4
restart: unless-stopped
ports:
- target: 80
published: 80
protocol: tcp
mode: host
- target: 443
published: 443
protocol: tcp
mode: host
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/rules:/rules
- ./traefik/acme:/acme
- ./traefik/traefik.yaml:/etc/traefik/traefik.yaml
networks:
- DB_net
- DB_work
- proxy-main
deploy:
placement:
constraints:
- node.hostname == ${HOSTNAME}
labels:
- traefik.enable=true
## HTTP Routers
- traefik.http.routers.202106__traefik.rule=Host(`traefik.${DOMAINNAME}`)
- traefik.http.routers.202106__traefik.entrypoints=websecure
- traefik.http.routers.202106__traefik.tls.certresolver=leresolver
## Service
- traefik.http.services.202106__traefik.loadbalancer.server.port=8080
fauth:
image: thomseddon/traefik-forward-auth:latest
restart: unless-stopped
security_opt:
- no-new-privileges:true
environment:
- PROVIDERS_GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID} # REDACTED
- PROVIDERS_GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_ID} # REDACTED
- SECRET=$O{AUTH_SECRET}
- INSECURE_COOKIE=false
deploy:
placement:
constraints:
- node.hostname == ${HOSTNAME}
labels:
- traefik.enable=true
- traefik.http.middlewares.fauth.forwardauth.address=http://fauth:4181
- traefik.http.middlewares.fauth.forwardauth.authResponseHeaders=X-Forwarded-User
- traefik.http.services.fauth.loadbalancer.server.port=4181\
########################### NETWORKS
networks:
proxy-main:
driver: overlay
name: proxy-main
DB_net:
external: true
DB_work:
external: true
Code language: PHP (php)
전체 docker-compose 파일 내용이다. 전체 소스 코드가 보고싶다면 GitHub – Hansanghyeon/synology-traefik at 2685f0a38913c991983f02c5321026083c945fc8
docker swarm에서 labels는 deploy안에 작성하면된다.
docker-compose를 swarm에 배포하는 방법은 swarm 스타트 포스팅을 참고하면 된다.