🌟

traefikを少し調べてみた

2023/06/07に公開

はじめに

1つのパソコンに複数のdockerを建てた場合に、幾つかの問題点が出てきた

  • ポートの重複
  • どのアプリがどのポートで動いているかを覚えていない
  • 重複して立っているコンテナ(DB関係など)

それらを解消するために色々調べた所、traefik(トラフィック)というものを見つけたので、調査結果の備忘録です

traefikについての説明はこちらのサイトが詳しく乗ってました
https://coders-shelf.com/traefik-intro/

また、調べる上でこちらのサイトを参考にさせていただきました(ありがとうございます)
https://www.gwtcenter.com/traefik-http-redirection

環境

  • wsl:ubuntu
  • docker:23.0.5

traefikダッシュボード

docker-compose.yml
version: "3.3"

services:
  traefik:
    image: "traefik:v2.10"
    container_name: "traefik"
    command:
      - "--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"

http://localhost:8080 にアクセスすることで、以下のようなページにアクセスできた

リバースプロキシを利用してみる

サブドメインによる振り分け

docker-compose.yml
version: "3.3"

services:
  traefik:
    image: "traefik:v2.10"
    container_name: "traefik"
    command:
      - "--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"

http://whoami.localhost/ にアクセスすることで、以下の(正常)ページにアクセスできる


パスによる振り分け

docker-compose.yml
version: "3.3"

services:
  traefik:
    image: "traefik:v2.10"
    container_name: "traefik"
    command:
      - "--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.rule=PathPrefix(`/whoami`)" 
      - "traefik.http.routers.whoami.entrypoints=web"

http://localhost/whoami にアクセスすることで、上記と同じページにアクセスできた

https化

docker-compose.yml
version: "3.3"

services:
  traefik:
    image: "traefik:v2.10"
    container_name: "traefik"
    command:
      - "--api.dashboard=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      # ダッシュボードの利用
      # 公開のエントリポイント
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      # http -> https にリダイレクト
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
      # ACME (Let's Encrypt) を有効
      - "--certificatesresolvers.letsencrypt.acme.email=your.name@localhost"
      - "--certificatesresolvers.letsencrypt.acme.storage=/etc/traefik/acme/acme.json"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt/acme.json:/etc/traefik/acme/acme.json
    labels:
      - "traefik.enable=true"
      # https エントリポイントを有効
      - "traefik.http.routers.dashboard.entrypoints=websecure"
      # ドメイン設定
      - "traefik.http.routers.dashboard.rule=Host(`dashboard.localhost`)"
      # Let's Encrypt で証明書を取得
      - "traefik.http.routers.dashboard.tls=true"
      - "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
      # ダッシュボードが API にアクセスできるようにするために必要
      - "traefik.http.routers.dashboard.service=api@internal"

鍵の保存先を作成

コマンド実行
sudo mkdir letsencrypt
sudo touch letsencrypt/acme.json
sudo chmod 600 letsencrypt/acme.json

https://dashboard.localhost にアクセスすると、アクセスしていいかの問い合わせが着たのち、許可することでhttpsでダッシュボードにアクセスすることができました。

最後に

wslの場合、localhostでつながるので、サブドメインの利用ができました。
ただ、マルチキャストDNSの場合、サブドメインの利用をサクッとできなかったため、調査はここまでにしました。(もともと、マルチキャストDNSで利用したくて調査を始めました)
また、何かの機会に調べることが出たら、続きの記事を書きたいと思います

Discussion