概要
Traefik は Host ヘッダベースのリバースプロキシです
ルーティングのルールを細かく設定できたりパスベースのルーティングも実現できます
設定ファイルも YAML で記載できる他正規表現などのルールも作成できます
今回は docker 上で簡単に動かしてみました
環境
- macOS 11.7.10
- docker 24.0.2
- traefik 3.0
まずは traefik を起動する
リバースプロキシのみ起動します
このあとでアプリをぶら下げて Host ヘッダベースでバランシングできているか確認します
- vim docker-compose.yml
version: '3'
services:
reverse-proxy:
image: traefik:v3.0
command: --api.insecure=true --providers.docker
ports:
# The HTTP port
- "80:80"
# The Web UI (enabled by --api.insecure=true)
- "8080:8080"
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
- docker-compose up -d
で localhost:8080 にアクセスすると traefik のダッシュボードを確認できます
この段階で localhost にアクセスしてもアプリがないので 404 が返ってきます
アプリをぶら下げる
traefik の下にアプリをぶら下げる設定を追加します
- vim docker-compose.yml
version: '3'
services:
reverse-proxy:
image: traefik:v3.0
command: --api.insecure=true --providers.docker
ports:
# The HTTP port
- "80:80"
# The Web UI (enabled by --api.insecure=true)
- "8080:8080"
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
whoami:
# A container that exposes an API to show its IP address
image: traefik/whoami
labels:
- "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"
コンテナにラベルを振ることで Host ヘッダの値に応じてバランシングしてくれます
一度 down させて再度起動します
ちなみに traefik/whoami はただのデバッグ用のアプリになります
- docker-compose down
- docker-compose up -d
- docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
python-try-reverse-proxy-1 traefik:v3.0 "/entrypoint.sh --ap…" reverse-proxy 25 seconds ago Up 23 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:8080->8080/tcp
python-try-whoami-1 traefik/whoami "/whoami" whoami 25 seconds ago Up 23 seconds 80/tcp
これで今度は Host ヘッダを付与してアプリにアクセスしてみます
するとちゃんと whoami アプリにアクセスできていることが確認できます
-
curl -H "Host: whoami.docker.localhost" localhost
Hostname: 716c5a018b13
IP: 127.0.0.1
IP: 172.19.0.2
RemoteAddr: 172.19.0.3:57016
GET / HTTP/1.1
Host: whoami.docker.localhost
User-Agent: curl/8.4.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.19.0.1
X-Forwarded-Host: whoami.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: c8479f4b7c06
X-Real-Ip: 172.19.0.1
もう一台追加してバランシングされるか確認する
一台だと味気ないのでもう一台追加してちゃんと Host を変えたときに正しいアプリにバランシングされることを確認してみます
whoami アプリをもう一つ追加します
- vim docker-compose.yml
version: '3'
services:
reverse-proxy:
image: traefik:v3.0
command: --api.insecure=true --providers.docker
ports:
# The HTTP port
- "80:80"
# The Web UI (enabled by --api.insecure=true)
- "8080:8080"
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
whoami:
# A container that exposes an API to show its IP address
image: traefik/whoami
labels:
- "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"
whoami2:
# A container that exposes an API to show its IP address
image: traefik/whoami
labels:
- "traefik.http.routers.whoami2.rule=Host(`whoami2.docker.localhost`)"
ラベルも whoami2 にして追加します
これで再作成してみます
- docker-compose down
- docker-compose up -d
- docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
python-try-reverse-proxy-1 traefik:v3.0 "/entrypoint.sh --ap…" reverse-proxy 55 seconds ago Up 54 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:8080->8080/tcp
python-try-whoami-1 traefik/whoami "/whoami" whoami 55 seconds ago Up 54 seconds 80/tcp
python-try-whoami2-1 traefik/whoami "/whoami" whoami2 55 seconds ago Up 54 seconds 80/tcp
そして再度 Host ヘッダを変更してアクセスすると別の whoami アプリにバランシングされていることが確認できます
-
curl -H "Host: whoami.docker.localhost" localhost
Hostname: 77c5ff6e72f4
IP: 127.0.0.1
IP: 172.21.0.4
RemoteAddr: 172.21.0.3:36418
GET / HTTP/1.1
Host: whoami.docker.localhost
User-Agent: curl/8.4.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.21.0.1
X-Forwarded-Host: whoami.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 60057b9154e0
X-Real-Ip: 172.21.0.1
-
curl -H "Host: whoami2.docker.localhost" localhost
Hostname: e6cef80986c8
IP: 127.0.0.1
IP: 172.21.0.2
RemoteAddr: 172.21.0.3:47060
GET / HTTP/1.1
Host: whoami2.docker.localhost
User-Agent: curl/8.4.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.21.0.1
X-Forwarded-Host: whoami2.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 60057b9154e0
X-Real-Ip: 172.21.0.1
最後に
Traefik を使って Host ベースのアプリバランシングをしてみました
nginx などのリバースプロキシでも Host ベースのバランシングはできますがラベルにルール付やデフォルトで管理用のダッシュボードなどは用意されていません
また定義を YAML で書けるのも便利です
違いについてはこのあたりが非常にまとまっているので興味があれば見てみてください
また今回は紹介しませんが k8s との連携も簡単にできるのも特徴です