traefikのdocker compose環境にて、優先させるネットワークを指定したい
Q&A
Closed
解決したいこと
traefikを使って、docker-compose環境でのリバースプロキシを実現したい。
できていること
一つのdefault networkに接続している場合、リバースプロキシを行うことができた
できていないこと
databaseはtraefikのネットワークとは別としたい時に、
traefikでサービスに接続されている複数のネットワークから、優先するネットワークの設定ができない
現在の設定では、giteaの接続URLは172.28.*.*
か172.100.*.*
のどちらかランダムになってしまうようです。
関係するソースコード
下記compose.yml
でtraefik
,gitea
,postgres
のサービスを定義しています
gitea
とpostgres
はservice-git
のネットワークに、
traefik
とgitea
はservice-gataway
のネットワークに所属させることで、
databaseは分離させようとしました。
(subnetを定義したのはtraefik内でどのネットワークに所属しているかがWeb画面で簡単に確認できるため)
関係ないとは思いますが、providers.docker.defaultRule
を設定することで*.raspberry.local
の設定を簡単にできるようにしています。
services:
gitea:
image: gitea/gitea
restart: always
volumes:
- /gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- 3000:3000
- 2222:22
environment:
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=db:5432
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
- USER_UID=1000
- USER_GID=1000
- GITEA__webhook__ALLOWED_HOST_LIST=*
depends_on:
- db
labels:
traefik.enable: true
traefik.host: gitea
traefik.http.services.gitea.loadbalancer.server.port: 3000
traefik.docker.network: service-gateway
networks:
- service-gateway
- service-git
db:
image: postgres:14
restart: always
environment:
- POSTGRES_USER=gitea
- POSTGRES_PASSWORD=gitea
- POSTGRES_DB=gitea
volumes:
- /postgres:/var/lib/postgresql/data
networks:
- service-git
traefik:
image: traefik:v2.9
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- 5003:8080
- 5000:80
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/traefik.yml:/etc/traefik/traefik.yml
networks:
- service-gateway
networks:
service-git:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
gateway: 172.28.0.1
service-gateway:
driver: bridge
ipam:
config:
- subnet: 172.100.0.0/16
gateway: 172.100.0.1
# Providers config
providers:
docker:
network: service-gateway
exposedByDefault: false
defaultRule: "Host(`{{ index .Labels \"traefik.host\"}}.raspberry.local`)"
# API/Dashboard config
api:
dashboard: true
insecure: true
entryPoints:
http:
address: ":80"
自分で試したこと
traefik.yml
でproviders.docker.network
や、
compose.yml
でtraefik.docker.network
の設定を行うことで、
優先されるネットワークが選ばれるのかとも思いましたが、そういうわけではなさそうです。。。
使用しているバージョン
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
$ docker version
Client: Docker Engine - Community
Version: 20.10.23
API version: 1.41
Go version: go1.18.10
Git commit: 7155243
Built: Thu Jan 19 17:33:09 2023
OS/Arch: linux/arm64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 23.0.3
API version: 1.42 (minimum version 1.12)
Go version: go1.19.7
Git commit: 59118bf
Built: Tue Apr 4 22:02:03 2023
OS/Arch: linux/arm64
Experimental: false
containerd:
Version: 1.6.20
GitCommit: 2806fc1057397dbaeefbea0e4e17bddfbd388f38
runc:
Version: 1.1.5
GitCommit: v1.1.5-0-gf19387a
docker-init:
Version: 0.19.0
GitCommit: de40ad0
$ docker compose version
Docker Compose version v2.17.2