ローカル開発環境で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