3

私はドッカーを初めて使用し、単一のサーバーですべてのアプリケーションをドッカー化しています。これまでのところ、すべてがうまく機能しています。しかし、私は一つのことを理解していません。私はすべてにdocker-composeを使用しています(プロジェクト用のdockerfileはまだ作成していません)。docker ports-composeにはこの属性があります。このようなものを書くと:

ports:
    8085:80

0.0.0.0:8085 でリッスンします。これは、外部からサーバーにアクセスできることを意味します。いくつかの議論とグーグル検索の後、docker bridge ネットワークで IP アドレスを取得し、ポート マッピングを簡単に実行できることがわかりました。

ports:
    172.17.0.1:8085:80

これは 172.17.0.1:8085 でのみリッスンします。これは、内部でのみリッスンし、nginx がトラフィックを必要なポートにプロキシするため、優れています。(例proxy_pass http://172.17.0.1:8085)。docker について詳しく知り、それらがどのように機能するかを理解した後、これらのコンテナーにはすべて独自の IP アドレスがあり、ポートはそれらのアドレスにのみ公開されていることに気付きました。たとえば、私の「Web」コンテナーの 1 つに 172.17.0.10 の IPv4 アドレスがあり、ポート 80 が公開されています。これらのコンテナーのいずれかで実行docker inspectすると、コンテナーの IP アドレスが表示されます。

ここで、これらの IP アドレスを nginx で使用したいと考えています。の代わりにproxy_pass http://172.17.0.1:8085、やりたいhttp://172.17.0.10。個人的にはとても洗練されたインターフェイスだと思いますが、気になる点が 1 つあります。マシンを再起動するとどうなりますか? すべてのコンテナは、何らかの順序で開始されます。5 つの Web コンテナーがあり、それらがランダムな順序で開始される場合、これらのコンテナーの IP が同じであることを確認できますか? それとも変わるのでしょうか?portsnginx で使用するために docker-compose で常に使用する必要がありますか? はいの場合、同じ IP を持つ異なるポートではなく、コンテナーごとに異なる IP を使用するにはどうすればよいですか? 別の docker ネットワーク インターフェイス (サブネット 172.17.1.0 としましょう) を作成し、そのインターフェイスから別の IP を公開された「パブリック」ポートに割り当てても問題ありませんか? これは基本的172.17.1.1:80:80に 1 つのコンテナで使用することを意味し、172.17.1.2:80:80別などで

4

2 に答える 2

6

docker-networking ドメインの専門家ではありませんが、質問にお答えできるよう最善を尽くします。

Q:マシンを再起動するとどうなりますか? すべてのコンテナは、何らかの順序で開始されます。
A:linksまたはキーワードを使用しない限りdepends_on、開始シーケンスを保証できません。

Q: 5 つの Web コンテナーがあり、それらがランダムな順序で開始される場合、これらのコンテナーの IP が同じであることを確認できますか?
A:既存の 2 つのコンテナー (postgresDB と influxDB) の IP アドレスを記録して、自分のマシンでちょっとした実験を行いました。

彼らは走っている

  1. ポストグル: 172.17.0.2
  2. 流入DB: 172.17.0.3

シャットダウンして再起動します。今回も同じ順番で起動したためか、IPアドレスは維持されているようです。depends_onPostgres が開始する前に InfluxDB コンテナーを強制的に開始するキーワードを追加しました。現在、両方のコンテナーの IP アドレスは次のとおりです。

  1. ポストグル: 172.17.0.3
  2. 流入DB: 172.17.0.2

IPは先着順で配布されていると思います。コンテナーを起動する順序を指定しなかった場合、コンテナーの IP が異なる可能性がわずかにあると思います。誰が最初に走るかによります。

Q: nginx で使用するために docker-compose で常にポートを使用する必要がありますか?
A:はい、nginx インスタンスのポートを外部に転送したい場合は可能です。そうしないと、誰もその Web サーバーにアクセスできなくなります。たとえば、トラフィックが通過できるようにポート443を公開します。HTTPs

Q:同じ IP を持つ異なるポートではなく、コンテナーごとに異なる IP を使用するにはどうすればよいですか?
A:それが可能かどうかはわかりませんが、docker-compose のドキュメントを調べたところ、ipamキーワードを使用することで可能と思われます。

参照:
https://docs.docker.com/compose/compose-file/#/ipam

それは私には恐ろしく見えるので、私が自分のプロジェクトで行ったことは、service_name代わりに を使用することでした。

例:

container_bbb:
    image: banana

my_nginx:
    image: apple
    environment:
      - MOUNT_SRC0=http://container_bbb:80
      - MOUNT_DEST0=/
    links:
      - container_bbb

コンテナー内のこのインスタンスの場合my_nginx、サービス名container_bbbはそのコンテナーのホスト名に解決されます。次に、コンテナーのエントリポイント スクリプト領域でこの情報を使用して ngix 構成を動的に生成する Python スクリプトを作成します。

少しやり過ぎに聞こえますが、これにより、nginx でやりたいことをより細かく制御できます。

したがって、私/etc/nginx/conf.d/default-locations/の設定では次のようになります。

location /container_bbb/ {
    proxy_pass http://container_bbb:3000/;
}

注: この nginx サーバー インスタンスをリバース プロキシ サーバーとして使用しています。

ここで言いたいのは、基本的に IP アドレスの代わりにホスト名を使用できるということです。隣のコンテナにたどり着くには、通り過ぎるhttp://CONTAINER_SERVICE_NAME:PORT

于 2016-08-03T00:23:15.067 に答える