ピックアップ

TraefikでDockerコンテナをリバースプロキシで試した件

Traefik

「トレーフィック」

を使ってみることで、

リバースプロキシ

などの基礎理解にも役立つかなと思って、

試してみることにした。

あくまで、

個人的な備忘録なので、

ChatGPT等に聞きながら、

自分なりに見返したいところだけ、

この記事にメモしてる。

前提環境 / 準備

環境としては、

Mac

を使って試した。

docker --version
docker compose version

を準備。

それ以外の初期のTraefixの起動までは、

こちらで試した。

設定

version: '3.8'

services:
  sample_admin:
    build:
      context: ./admin
    container_name: sample_admin
    ports:
      - "9021:80"
    volumes:
      - ./admin/application:/var/www/html
    networks:
      - app-network
      - traefik-network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.sample-admin.rule=Host(`sample-admin.localhost`)"
      - "traefik.http.routers.sample-admin.entrypoints=web"

  sample_ui:
    build:
      context: ./ui
    container_name: sample_ui
    ports:
      - "9022:9022"
    volumes:
      - ./ui/application:/var/www/html
    networks:
      - app-network
      - traefik-network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.sample-ui.rule=Host(`sample-ui.localhost`)"
      - "traefik.http.routers.sample-ui.entrypoints=web"

  sample_mysql:
    image: mysql:8.0
    container_name: sample_mysql
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: sample_database
      MYSQL_USER: sample_user
      MYSQL_PASSWORD: sample_password
    volumes:
      - sample-mysql-data:/var/lib/mysql
    networks:
      - app-network

networks:
  app-network:
    driver: bridge
  traefik-network:
    driver: bridge

volumes:
  sample-mysql-data:

起動、確認

sudo docker-compose up -d

コンテナを立ち上げたら、

http://sample-admin.localhost/

これでアクセスできるはず。

しかし、

Gateway Timeout

となってしまう。

Traefixに関して

version: "3.9"

services:
  traefik:
    image: traefik:v2.11
    container_name: traefik
    restart: always
    command:
      - --api.insecure=true
      - --providers.docker=true
      - --entrypoints.web.address=:80
      - --log.level=DEBUG
    ports:
      - "80:80"
      - "8080:8080"   # dashboard 用
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - traefik-network

  whoami:
    image: traefik/whoami
    platform: linux/amd64   # ← M1/M2/M3 Mac なら必須
    container_name: whoami
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
      - "traefik.http.routers.whoami.entrypoints=web"
    networks:
      - traefik-network

networks:
  traefik-network:
    external: true

      - --log.level=DEBUG

を追加すると、

docker logs -f traefik

でログが確認できる。

これで確認したところ、

time="2025-11-08T07:28:19Z" level=debug 
msg="'504 Gateway Timeout' caused by: 
dial tcp 172.28.0.3:9022: i/o timeout"

となっている。

ネットワークの問題?

ネットワークを確認する

docker network inspect traefik-network

これ確認したら、

traefik-network に入っているのは traefik と whoami のみ で、

入れたかったコンテナが入っていない。

こちらは、

networks:
  app-network:
    driver: bridge
  traefik-network:
    external: true

ですでにあるネットワークに入るようにして、

これで対応。

解決しない

[ブラウザ / ホスト]
       |
       |  http://sample.localhost
       v
[Traefik コンテナ]
       |  ← docker network 経由で sample にアクセス
       v
[開発用 コンテナ: server 0.0.0.0:8080]

この中で、

docker exec -it traefik sh

で入って、

curl http://sample:9022

ではうまくいくので、

Traefik -> 開発用コンテナ

これは問題ないはず。

ブラウザ → Traefik

が問題あり、

Traefik が受け取ったリクエストを正しく oms_ui に送れていないか、

もしくは

Traefik がホスト側でリクエストを受けられていない可能性があるみたい。

ネットワークを1つに設定

コンテナを作る際に、

docker composeのためのymlファイルで、

    networks:
      - app-network
      - traefik-network

元のネットワークを残していたが、

    networks:
      - traefik-network

このように、

Traefikのネットワークを残すようにすることで解決。

個人用ポイントメモ

Traefik がサービスを見つけるために必要なものは?
同じ Docker ネットワーク に所属していて、Traefik 用の labels が付いていること。

ドメインによってバックエンドを切り替える仕組みの名前は?
リバースプロキシ(Traefik では Router が担当)。

Traefik がコンテナ内部のポート番号を知る必要がある理由は?
受け取ったリクエストをどのサービスのどのポートへ転送するか決めるため

ピックアップ

おすすめ書籍

コメント一覧

コメントはまだありません。

コメント送信

コメントを残す

広告

おすすめ記事