78

さまざまなサーバーで実行できるdocker-composeファイルを作成したいと考えています。

そのためには、 docker-compose.ymlのいくつかの場所で、サーバー (すべてのコンテナーが実行されている場所) のホスト IP またはホスト名を指定できる必要があります。

たとえば、仲間の領事コンテナがサーバーを見つける方法を定義したい領事コンテナの場合。

consul:
  image: progrium/consul
  command: -server -advertise 192.168.1.125 -bootstrap

明らかに 192.168.1.125 をハードコーディングしたくありません。

env_file :を使用 してホスト名または IP を指定し、それをすべてのサーバーに適用できるので、その情報を 1 か所にまとめて docker-compose.yml で使用します。ただし、これは環境変数を指定するためにのみ使用でき、advertise パラメーターには使用できません。

より良い解決策はありますか?

4

7 に答える 7

22

docker-compose を使用すると、compose コマンドを実行している環境から環境変数を使用できます。

https://docs.docker.com/compose/compose-file/#variable-substitutionのドキュメントを参照してください

@balverが提案したように、ラッパースクリプトを作成できると仮定するとEXTERNAL_IP、の値を含むという環境変数を設定できます$(docker-machine ip)

例:

#!/bin/sh
export EXTERNAL_IP=$(docker-machine ip)
exec docker-compose $@

# docker-compose.yml
version: "2"
services:
  consul:
    image: consul
    environment:
      - "EXTERNAL_IP=${EXTERNAL_IP}"
    command: agent -server -advertise ${EXTERNAL_IP} -bootstrap

残念ながら、ランダムなポート割り当てを使用している場合、追加する方法がないEXTERNAL_PORTため、ポートを静的にリンクする必要があります。

PS: HashiCorp Nomad では、非常によく似たものがデフォルトで有効になっており、マップされたポートも含まれています。ドキュメント: https://www.nomadproject.io/docs/jobspec/interpreted.html#interpreted_env_vars

于 2016-06-07T13:06:09.493 に答える
20

静的と思われる docker 内部ネットワーク IP を使用しました: 172.17.0.1

于 2016-09-02T10:51:45.793 に答える
17

より良い解決策はありますか?

絶対!コンテナ間の通信にホスト IP はまったく必要ありません。ファイルにlinkコンテナーを作成するdocker-compose.yamlと、サービスの IP アドレスを検出するために使用できる多くの環境変数にアクセスできます。

たとえば、2 つのコンテナを持つ docker-compose 構成を考えてみましょうconsul

consul:
  image: progrium/consul
  command: -server -bootstrap
webserver:
  image: larsks/mini-httpd
  links:
    - consul

まず、 から開始consulして、独自-server -bootstrapconsulアドバタイズ アドレスを見つけます。次に例を示します。

consul_1    | ==> Consul agent running!
consul_1    |          Node name: 'f39ba7ef38ef'
consul_1    |         Datacenter: 'dc1'
consul_1    |             Server: true (bootstrap: true)
consul_1    |        Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 53, RPC: 8400)
consul_1    |       Cluster Addr: 172.17.0.4 (LAN: 8301, WAN: 8302)
consul_1    |     Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
consul_1    |              Atlas: <disabled>

コンテナーには、webserverpid 1 で使用できる次の環境変数があります。

CONSUL_PORT=udp://172.17.0.4:53
CONSUL_PORT_8300_TCP_START=tcp://172.17.0.4:8300
CONSUL_PORT_8300_TCP_ADDR=172.17.0.4
CONSUL_PORT_8300_TCP_PROTO=tcp
CONSUL_PORT_8300_TCP_PORT_START=8300
CONSUL_PORT_8300_UDP_END=udp://172.17.0.4:8302
CONSUL_PORT_8300_UDP_PORT_END=8302
CONSUL_PORT_53_UDP=udp://172.17.0.4:53
CONSUL_PORT_53_UDP_ADDR=172.17.0.4
CONSUL_PORT_53_UDP_PORT=53
CONSUL_PORT_53_UDP_PROTO=udp
CONSUL_PORT_8300_TCP=tcp://172.17.0.4:8300
CONSUL_PORT_8300_TCP_PORT=8300
CONSUL_PORT_8301_TCP=tcp://172.17.0.4:8301
CONSUL_PORT_8301_TCP_ADDR=172.17.0.4
CONSUL_PORT_8301_TCP_PORT=8301
CONSUL_PORT_8301_TCP_PROTO=tcp
CONSUL_PORT_8301_UDP=udp://172.17.0.4:8301
CONSUL_PORT_8301_UDP_ADDR=172.17.0.4
CONSUL_PORT_8301_UDP_PORT=8301
CONSUL_PORT_8301_UDP_PROTO=udp
CONSUL_PORT_8302_TCP=tcp://172.17.0.4:8302
CONSUL_PORT_8302_TCP_ADDR=172.17.0.4
CONSUL_PORT_8302_TCP_PORT=8302
CONSUL_PORT_8302_TCP_PROTO=tcp
CONSUL_PORT_8302_UDP=udp://172.17.0.4:8302
CONSUL_PORT_8302_UDP_ADDR=172.17.0.4
CONSUL_PORT_8302_UDP_PORT=8302
CONSUL_PORT_8302_UDP_PROTO=udp
CONSUL_PORT_8400_TCP=tcp://172.17.0.4:8400
CONSUL_PORT_8400_TCP_ADDR=172.17.0.4
CONSUL_PORT_8400_TCP_PORT=8400
CONSUL_PORT_8400_TCP_PROTO=tcp
CONSUL_PORT_8500_TCP=tcp://172.17.0.4:8500
CONSUL_PORT_8500_TCP_ADDR=172.17.0.4
CONSUL_PORT_8500_TCP_PORT=8500
CONSUL_PORT_8500_TCP_PROTO=tcp

EXPOSE画像の各ポート d には一連の変数がありますconsul 。たとえば、その 2 番目の画像では、以下に接続することで、consul REST API と対話できます。

http://${CONSUL_PORT_8500_TCP_ADDR}:8500/
于 2015-03-18T01:07:04.210 に答える
15

新しいバージョンの Docker Compose ( 1.4.0 ) では、次のようなことができるはずです。

docker-compose.yml

consul:
  image: progrium/consul
  command: -server -advertise HOSTIP -bootstrap

バッシュ

$ sed -e "s/HOSTIP/${HOSTIP}/g" docker-compose.yml | docker-compose --file - up

これは、次の新機能のおかげです。

  • Compose は、ファイル名として - を指定することにより、ファイルからではなく、標準入力から YAML 構成を読み取ることができるようになりました。これにより、構成を動的に生成することが容易になります。

    $ echo 'redis: {"image": "redis"}' | docker-compose --file - up
    
于 2015-08-14T13:20:20.793 に答える
5

以前のソリューションで提案された環境変数は、コンテナーがリンクされたときに Docker によって作成されます。ただし、コンテナが再起動された場合、環境変数は自動的に更新されません。したがって、本番環境で環境変数を使用することはお勧めしません。

Docker は、環境変数の作成に加えて、/etc/hosts ファイル内のホスト エントリも更新します。実際、Docker のドキュメントでは、環境変数の代わりに etc/hosts のホスト エントリを使用することを推奨しています。

参考:https ://docs.docker.com/userguide/dockerlinks/

/etc/hosts ファイルのホスト エントリとは異なり、環境変数に保存されている IP アドレスは、ソース コンテナーが再起動された場合に自動的に更新されません。/etc/hosts のホスト エントリを使用して、リンクされたコンテナーの IP アドレスを解決することをお勧めします。

于 2015-04-03T08:56:47.423 に答える