85

カスタム ドメイン (*.foo) へのすべての Web 要求が Docker ホストの IP アドレスにマップされるように、ワイルドカード DNS をセットアップしました。Apache (または Nginx) インスタンスを実行している複数のコンテナーがある場合、各コンテナーは Apache ポート (80) を何らかの外部インバウンド ポートにマップします。

私がやりたいことは、カスタム DNS サーバーを介して (Docker ホストの) 正しい IP アドレスに既にマップされている container-1.foo に要求を行うことですが、デフォルトのポート 80 要求を正しい Docker 外部にプロキシします。指定されたコンテナーからの正しい Apache インスタンスがカスタム ドメインに基づいて応答できるようにポートを変更します。同様に、container-2.foo は 2 番目のコンテナーの Apache にプロキシします。

これに対して事前に構築されたソリューションはありますか、Docker ホストで Nginx プロキシを実行するのが私の最善の策ですか、それとも Docker コンテナを管理する可能性がある node.js プロキシを作成する必要がありますか (Web 経由で開始/停止/再構築) )、 また...?Docker コンテナーの使用を、外部ポートやコンテナーのジャグリングではなく、より自然なイベントのようにするために、どのようなオプションがありますか?

4

3 に答える 3

82

この答えは少し遅いかもしれませんが、必要なのは自動リバース プロキシです。そのために2つのソリューションを使用しました。

  • jwilder/nginx-proxy
  • トラフィク

時間が経つにつれて、私の好みはTraefikを使用することです。主な理由は、十分に文書化および保守されており、より多くの機能 (さまざまな戦略と優先順位による負荷分散、ヘルスチェック、サーキット ブレーカー、ACME/Let's Encrypt による自動 SSL 証明書など) が付属しているためです。


jwilder/nginx-proxy の使用

Docker コンテナーJason Wilder の nginx-proxy Docker イメージを実行すると、構成を維持することなく、他のコンテナーのリバース プロキシとして nginx サーバーがセットアップされます。

VIRTUAL_HOST環境変数を使用して他のコンテナーを実行するだけで、nginx-proxy がそれらの ip:port を検出し、nginx 構成を更新します。

*.test.localDocker ホストの IP アドレスにマップするように DNS が設定されているとします。次に、次のコンテナーを起動して、簡単なデモを実行します。

# start the reverse proxy
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy

# start a first container for http://tutum.test.local
docker run -d -e "VIRTUAL_HOST=tutum.test.local" tutum/hello-world

# start a second container for http://deis.test.local
docker run -d -e "VIRTUAL_HOST=deis.test.local" deis/helloworld

Traefik の使用

Traefikコンテナーを実行すると、リバース プロキシ サーバーがセットアップされ、コンテナーで見つかったdocker ラベルを指定して転送ルールが再構成されます。

*.test.localDocker ホストの IP アドレスにマップするように DNS が設定されているとします。次に、次のコンテナーを起動して、簡単なデモを実行します。

# start the reverse proxy
docker run --rm -it -p 80:80 -v /var/run/docker.sock:/var/run/docker.sock traefik:1.7 --docker

# start a first container for http://tutum.test.local
docker run -d -l "traefik.frontend.rule=Host:tutum.test.local" tutum/hello-world

# start a second container for http://deis.test.local
docker run -d -l "traefik.frontend.rule=Host:deis.test.local" deis/helloworld
于 2014-06-01T01:15:20.690 に答える