현재 서버에서 12000, 12001, 12002, 12003포트로 서비스 하고 있는 것을 HTTP는 80, HTTPS는 443 단일 포인트로 서비스하도록 변경. 각 docker는 하위 주소로 접속하면 traefik에서 라우팅하게 만든다.
목표
1.
game docker에서 docker compose로 같이 올리던 traefik을 별도의 docker compose로 분리한다.
2.
분리해서 올린 docker에서 traefik을 export해서 다른 docker에서 사용
3.
game, admin, service, companion에서 별도의 traefik 설정을 추가해서 traefik 한 곳에서 관리하게 한다.
현재 상황
접속 포트는 80으로 동일하게 설정
•
game은 12000포트를 api/game 으로 변경
•
admin은 12001포트를 api/admin 으로 변경
•
service는 12002포트 adi/serice 로 변경
•
companion은 12003포트 / 로 변경
Traefik을 올리기 위한 docker compose 설정
•
중요한 것은 networks에서 driver: bridge. 이게 없으면 다른 docker에서 이 네트워크에 들어올 수 없다.
# traefik-docker-compose.yml
version: '3.5'
services:
proxy:
image: traefik:v2.5
container_name: proxy
ports:
- "80:80"
- "443:443"
- "8000:8000" # 대시보드용 포트
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./acme.json:/acme.json
- ./traefik-users.htpasswd:/traefik-users.htpasswd
command:
- "--api.dashboard=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.dashboard.address=:8000" # 대시보드 전용 엔트리포인트
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
- "--certificatesresolvers.myresolver.acme.email=${EMAIL}"
- "--certificatesresolvers.myresolver.acme.storage=/acme.json"
- "--log.level=INFO"
labels:
- "traefik.enable=true"
# 대시보드 라우터 설정
- "traefik.http.routers.dashboard.rule=Host(`${SERVER_IP}`)"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.entrypoints=dashboard"
- "traefik.http.routers.dashboard.tls=true"
- "traefik.http.routers.dashboard.tls.certresolver=myresolver"
# 기본 인증 미들웨어 설정
- "traefik.http.routers.dashboard.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.usersfile=/traefik-users.htpasswd"
# 대시보드 서비스 포트 설정
- "traefik.http.services.dashboard.loadbalancer.server.port=8000"
networks:
- traefik-public
restart: always
environment:
- SERVER_IP=${SERVER_IP}
networks:
traefik-public:
name: traefik-public
driver: bridge
Docker
복사
개별 서비스에서의 docker compose 설정
•
networks 설정은 traefik을 실행시켰던 docker-compose에서 설정해 주었던 traefik-public을 함께 사용하도록 설정해야 한다.
•
PathPrefix에 외부에서 접속할 때 사용할 주소를 설정
•
traefik.http.middlewares.game-strip-prefix.stripprefix.prefixes에서 실제 docker로 넘어갈 때 제거되어야 하는 주소를 지정해줘야 한다.
•
game-http의 middlewares에 strip-prefix 미들웨어를 사용한다고 지정.
예제
아래 설정을 복사해서 사용한다. 단, 같은 traafik을 공유한다면
•
game-http
•
game-strip-prefix
위의 두개 설정이 겹치면 traefik에 제대로 로드 되지 않는다.
•
port번호
•
contrainer_name
이 두개 설정이 겹치면 docker에서 올라가지 않는다.
version: '3.5'
services:
game:
build:
context: ./
dockerfile: ./docker/Dockerfile.${NODE_ENV}
image: game:1.0
container_name: game
env_file:
- .env.${NODE_ENV}
ports:
- "12000:12000"
labels:
- "traefik.enable=true"
# HTTP 라우터 설정
- "traefik.http.routers.game-http.rule=Host(`${HOST_IP}`) && PathPrefix(`/api/game`)"
- "traefik.http.routers.game-http.entrypoints=web"
# HTTPS 라우터 설정
- "traefik.http.routers.game-https.rule=Host(`${HOST_IP}`) && PathPrefix(`/api/game`)"
- "traefik.http.routers.game-https.entrypoints=websecure"
- "traefik.http.routers.game-https.tls=true"
- "traefik.http.routers.game-https.tls.certresolver=myresolver"
# API 경로 설정
- "traefik.http.middlewares.game-strip-prefix.stripprefix.prefixes=/api/game"
- "traefik.http.routers.game-http.middlewares=game-strip-prefix"
- "traefik.http.routers.game-https.middlewares=game-strip-prefix"
# 서비스 포트 설정
- "traefik.http.services.game.loadbalancer.server.port=12000"
volumes:
- ./logs:/usr/app/logs
networks:
- traefik-public
restart: always
networks:
traefik-public:
external: true
Docker
복사