🌟
traefikを少し調べてみた
はじめに
1つのパソコンに複数のdockerを建てた場合に、幾つかの問題点が出てきた
- ポートの重複
- どのアプリがどのポートで動いているかを覚えていない
- 重複して立っているコンテナ(DB関係など)
それらを解消するために色々調べた所、traefik(トラフィック)というものを見つけたので、調査結果の備忘録です
traefikについての説明はこちらのサイトが詳しく乗ってました
また、調べる上でこちらのサイトを参考にさせていただきました(ありがとうございます)
環境
- 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