7
6

More than 3 years have passed since last update.

Traefikをリバースプロキシとして利用してDockerで起動したサービスに接続する

Last updated at Posted at 2018-08-30

Traefikとは

Traefik: https://github.com/containous/traefik

Go言語製のリバースプロキシ兼ロードバランサ。

やりたいこと

jenkins.shikugawa.netでアクセスしてDockerコンテナ上で起動しているJenkinsサーバーに接続したい。また、WWW->Traefik間はSSLで通信したい。

Untitled Diagram (2).png

手順

CloudFlare上のDNSの設定

Traefik上でLet's Encryptで取得した証明書の更新を行いたいが、サポートしているプロバイダ上で提供されているDNSサーバーを経由しないと対応出来ないため、レジストラが提供するDNSが使えないために移管する必要がある。これらの中だとCloudFlareが無料で使えて手軽。以下のような感じで設定すればよい。

スクリーンショット 2018-08-31 1.12.59_censored.jpg

参考: https://docs.traefik.io/configuration/acme/#dnschallenge

traefikを起動する

docker-compose.yml
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/
traefik.toml
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/

docker-compose.yml
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

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6