상현에 하루하루
개발자의 하루

Traefik docker-compose example & 다른컨테이너 연결

( 업데이트: )
version: "3.8"

services:

  traefik:
    image: "traefik:v2.4"
    container_name: "traefik"
    command:
      #- "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  whoami:
    image: "traefik/whoami"
    container_name: "simple-service"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
      - "traefik.http.routers.whoami.entrypoints=web"Code language: YAML (yaml)

공식 홈페이지의 Getting started 섹션에 docker-compose.yaml 파일이다.

처음에 의문이 들었는데 8080이 Traefik의 대쉬보드 포트이다.

위 설정만으로도 Traefik이 잘 서비스되고있는 것도 확인했고 이제 내가 운영하고 있는 wordpress 컨테이너 또는 다른 컨테이너를 연결할 차례다.

wordpress docker-compose 컨테이너 연결 & 도메인 설정

역방향 프록시로 Traefik에서 wordpress container로 어떻게 연결하는 것인가?

이것은 Traefik이 머신의 /var/run/docker.sock을 사용할 수있게 해줬기 때문에 docker container들의 정보를 가져올 수 있다.

version: "3.8"

services:
  wordpress:
    env_file:
      - ./.env
    container_name: WP__${PROJECT_NAME}
    # development image
    image: ghcr.io/hansanghyeon/wordpress-php8.0-docker-xdebug3.0:1.0.0
    restart: always
    expose:
      - 80
    ports:
      - 10000:80
    environment:
      WORDPRESS_DB_HOST: mariadb:3306
      WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
      WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
      WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
    volumes:
      - ./.wordpress:/var/www/html
      - ./Theme:/var/www/html/wp-content/themes/sage
      - ./backup:/var/www/html/wp-content/ai1wm-backups
    external_links:
      - DB__wordpress:mariadb
    labels:
      - traefik.enable=true
      - traefik.http.routers.hyeon.rule=Host(`hyeon.local`)

networks:
  default:
    external:
      name: db_net
Code language: YAML (yaml)

이전과 다르게 labels가 추가되었다.

이렇게 설정하면 Traefik에 htttp에 router로 등록이 완료되어있을 것이다.

이슈발생 🤯 “Gateway Timeout”

다른 레퍼런스를 따라하면서 틀린 곳 없이 설정했는데 왜 그럴까?

이 문제에 대한 이슈가 있었다.

https://github.com/traefik/traefik/issues/1254#issuecomment-299114960

두 컨테이너가 모두 속한 네트워크가 하나있어야 한다는 것이다.

...
    labels:
		...
		- traefik.docker.network=proxy_netCode language: YAML (yaml)

위처럼 어떤 네트워크에서 실행되는지 등록해 주면 된다고 한다.

나는 그냥 두개의 서비스가 동일한 네트워크를 가지면 될 것같다 생각했다.

version: "3.8"

services:
  traefik:
    image: "traefik:v2.4"
    container_name: "traefik"
    command:
      #- "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    networks:
      - db_net

  whoami:
    image: "traefik/whoami"
    container_name: "simple-service"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
      - "traefik.http.routers.whoami.entrypoints=web"

networks:
  default:
    driver: bridge
    name: proxy_net
  # db_net이라는 db 네트워크를 등록 여기에 모든 워드프레스 컨테이너가 있다
  db_net:
    external:
      name: db_net
Code language: YAML (yaml)