Search

traefik을 사용해보자

현재 서버에서 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
복사