LoginSignup
3
3

More than 3 years have passed since last update.

Traefikを使ってDockerのローカル80番ポートをいい感じに整理する

Last updated at Posted at 2020-11-18

ローカル開発環境でTraefikに名前解決させることで開発環境毎のポート管理等の手間を省く。
以下のような記述をdocker-compose.ymlに追加して名前解決させたいコンテナをそのネットワークに記述する。

networks:
  docker_default:
    external:
      name: docker_default

Traefikとは

Traefik はDockerにも対応している マイクロサービス向けモダンHTTPリバースプロキシ・ロードバランサ
公式ページ

Træfɪk is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease. It supports several backends (Docker, Swarm, Mesos/Marathon, Consul, Etcd, Zookeeper, BoltDB, Rest API, file...) to manage its configuration automatically and dynamically.

Traefikとportainerの導入

まずdockerなど適当な名前のディレクトを作り以下のようにdocker-compose.ymlを書く。
今回はDockerコンテナをGUIで操作し、管理・監視するためのportainerと言うツールも一緒に構築する

version: '3.8'
services:
  p-portainer:
    image: portainer/portainer
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer:/data
  traefik:
    image: traefik
    ports:
      - "80:80"
    restart: always
    labels:
      - "traefik.http.routers.api.rule=Host(`t.localhost`)"
      - "traefik.http.routers.api.service=api@internal"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik/traefik.toml:/etc/traefik/traefik.toml
networks:
  docker_default:
    external:
      name: docker_default

Traefikの設定ファイルは、toml形式の設定ファイルを作成します。
今回は名前解決のルールをコンテナ名のハイフンより前を正規表現で切り取りネーミングさせます。
(コンテナ名が hoge-fuga だった場合 hoge.localhost とネーミングされます。

※windowsマシンの場合

Docker for windows で /var/run/docker.sock をマウントする必要があるので
上記のdocker-compose.ymlと同じ階層に.env作成し以下を記述する

COMPOSE_CONVERT_WINDOWS_PATHS=1

上記のdocker-compose.ymlを書いたディレクトリの直下にtraefik/.traefik.tomlを作成

[api]

[ping]
  entryPoint = "http"

[providers.docker]
  defaultRule = "Host(`{{ trimSuffix \"-\" (regexFind \"(.+?)-\" .Name) }}.localhost`)"
  network = "docker_default"

これを立ち上げれば、p.localhost でportainerの画面、 t.localhost でtraefikの管理画面にアクセスできるようになります。

まとめ

同時に複数のDocker環境を立ち上げるとポート管理や名前解決が手間になりますが、
traefikのようなプロキシツールを使うと手間が省けて便利です。

サンプル

このサンプルでは test.localhost で名前解決されます。

version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
    tty: true
    volumes:
      - .:/code
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
  test-web:
    image: nginx:latest
    depends_on:
      - app
    networks:
      - default
      - docker_default
    volumes:
      - ./public:/code/public
      - ./docker/nginx/conf.d/local.d/default.conf:/etc/nginx/conf.d/default.conf
    environment:
      - TZ=${TZ}

networks:
  docker_default:
    external:
      name: docker_default
3
3
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
3
3