Traefikとは
Traefik: https://github.com/containous/traefik
Go言語製のリバースプロキシ兼ロードバランサ。
やりたいこと
jenkins.shikugawa.netでアクセスしてDockerコンテナ上で起動しているJenkinsサーバーに接続したい。また、WWW->Traefik間はSSLで通信したい。
手順
CloudFlare上のDNSの設定
Traefik上でLet's Encryptで取得した証明書の更新を行いたいが、サポートしているプロバイダ上で提供されているDNSサーバーを経由しないと対応出来ないため、レジストラが提供するDNSが使えないために移管する必要がある。これらの中だとCloudFlareが無料で使えて手軽。以下のような感じで設定すればよい。
参考: https://docs.traefik.io/configuration/acme/#dnschallenge
traefikを起動する
version: '2'
services:
traefik:
image: traefik:alpine
environment:
- CLOUDFLARE_EMAIL=${CLOUDFLARE_EMAIL}
- CLOUDFLARE_API_KEY=${CLOUDFLARE_API_KEY}
ports:
- 80:80
- 8080:8080 # WebUIを有効化させる際に必要
- 443:443
volumes:
- .:/etc/traefik/
defaultEntryPoints = ["http", "https"]
[traefikLog]
filePath = "/var/traefik/traefik.log"
format = "json"
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[acme]
email = "YOUR EMAIL"
storage = "/etc/traefik/acme.json"
entryPoint = "https"
[acme.dnsChallenge]
provider = "cloudflare"
delayBeforeCheck = 0
[[acme.domains]]
main = "*.shikugawa.net"
[file]
watch = true
[backends]
[backends.jenkins]
[backends.jenkins.servers]
[backends.jenkins.servers.server0]
url = "http://jenkins:8080"
weight = 1
[frontends]
[frontends.jenkins]
backend = "jenkins"
passHostHeader = true # これをつけないとヘッダ情報がサービス側に飛ばない
[frontends.jenkins.routes.host]
rule = "Host:jenkins.shikugawa.net"
[api]
entryPoint = "traefik"
dashboard = true # WebUIの有効化
これでdocker-compose up -d
すればいい。
ハマりポイントとしてはbackends.jenkins.servers.server0のurlの部分である。後に起動するjenkinsサービスをtraefik_defaultネットワーク内で起動した場合、ポートがホストマシン側から見た場合のポートではなく、コンテナ側から見たポートをセットしなければならない事に注意。何故なら、Docker Engineが提供する内部DNSによってホスト名からホスト名が指すアプリケーションが起動しているコンテナのIPがアドレスに変換される為である。
Jenkinsを起動する
公式イメージが配布されている。
https://hub.docker.com/r/jenkins/jenkins/
version: '3'
services:
jenkins:
image: jenkins:latest
networks:
- traefik_default
ports:
- "8090:8080"
- "50000:50000" # Slave用
volumes:
- './data:/var/jenkins_home'
networks:
traefik_default:
external: true
終わりに
Consulを使ったほうが良さそう。
https://docs.traefik.io/configuration/backends/consul/
https://qiita.com/woremacx/items/b6215cd6cf919fdb3824