Traefikでdocker-composeのポート重複を解決する

昨日のDockerCon LiveのセッションでTraefikの存在を知ってしまったので、ちょっと試してみました😄

github.com

同一プロジェクト、または複数のプロジェクト間でportがかぶってちょっとずつ変えているなどなど

例) App1では3000ポートをApp2でも3000ポートを使っている

僕もいままでは、App2を4000ポートに変更して対応していました

"Simplify All the Things with Docker Compose" @mikesir87 さんのセッションを見て面白かったので試してみます

Thanks a lot, mikesir87👍

docker.events.cube365.net

github.com

僕のサンプルアプリ

github.com

ちょっと調子のってDenoで書いてみましたw

1つのプロジェクトにApp1とApp2のサーバが3000ポートでサーバが立ってます

これをTraefikを使ってProxyしてみます

サンプルコードをみてもらったら、一目瞭然なので詳しい説明はしませんが(しないのかよ!)

ハマったこと

僕がちょっとハマったことを書いておきます

僕の開発環境はLinux + Rootless dockerです

Rootless dockerがちょっとハマりました。。。

公式ドキュメントのサンプルとかでは、80番ポートでProxyしてるのですが、Rootless dockerはrootユーザで起動してないので、 localhostの80番ポートが使えなかったです😭

なので、僕のサンプルコードでは3000番ポートをリッスンするようにしてます

あとは、socketファイルのパスが違うことですね、DOCKER_HOSTを確認してくださいね

$ echo $DOCKER_HOST
unix:///run/user/1000/docker.sock

動作確認

コンテナを起動します

$ docker-compose up -d

app1.localhost:3000にアクセスしてみます

f:id:murajun1978:20200529154714p:plain

app2.localhost:3000にもアクセスしてみます

f:id:murajun1978:20200529154805p:plain

まとめ

どうでしょうか、めちゃ簡単にProxyできましたね👏

同一プロジェクトでは旨味はありませんが、プロジェクトをまたがる場合は重宝しそうです

プロジェクトをまたぐ場合は、Traefikをdeamonで動作させて、Traefikのnetworkをexportしておけばいいと思います

各プロジェクトでは、このネットワークに接続することで、Proxyできるようになります

もうポートを気にする必要はない!

Enjoy Traefik ヘ(^o^)ノ