sinsky
@sinsky

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

traefikのdocker compose環境にて、優先させるネットワークを指定したい

解決したいこと

traefikを使って、docker-compose環境でのリバースプロキシを実現したい。

できていること

一つのdefault networkに接続している場合、リバースプロキシを行うことができた

できていないこと

databaseはtraefikのネットワークとは別としたい時に、
traefikでサービスに接続されている複数のネットワークから、優先するネットワークの設定ができない

現在の設定では、giteaの接続URLは172.28.*.*172.100.*.*のどちらかランダムになってしまうようです。

関係するソースコード

下記compose.ymltraefik,gitea,postgresのサービスを定義しています
giteapostgresservice-gitのネットワークに、
traefikgiteaservice-gatawayのネットワークに所属させることで、
databaseは分離させようとしました。
(subnetを定義したのはtraefik内でどのネットワークに所属しているかがWeb画面で簡単に確認できるため)

関係ないとは思いますが、providers.docker.defaultRuleを設定することで*.raspberry.localの設定を簡単にできるようにしています。

compose.yml
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
traefik.yml
# 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.ymlproviders.docker.networkや、
compose.ymltraefik.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
0

1Answer

経過を見る必要がありますが、
networkをdocker composeコマンドで作成していたため、
<dirName>_<networkName>というネットワーク名になり、
優先する認識してくれなかったのかもしれません。

  1. 手動でネットワークを作成
    docker network create --subnet 172.100.0.0/16 --gateway 172.100.0.1 service-gateway
    
  2. compose.ymlファイルのネットワークをアップデート
    compose.yml
    networks:
        service-gateway:
            external: true
    
  3. docker compose up -d
0Like

Your answer might help someone💌