web-dev-qa-db-ja.com

Docker-compose:コンテナーが実行されているホスト名と同じホスト名を設定する

現在、スウォームクラスターに2つのノードがあります

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
yey1njv9uz8adf33m7oz0h80f *   redis2              Ready               Active              Leader
lbo91v2l15h24isfd5jegoxu1     redis3              Ready               Active   

これはdocker-compose.ymlファイルです

version: "3"
services:
  daggr:
    # replace username/repo:tag with your name and image details
    image: daggr
    hostname: examplehostname
    deploy:
      replicas: 1
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "4000:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
        - "8080:8080"
    volumes:
        - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
        placement:
            constraints: [node.role == manager]
    networks:
        - webnet
  redis:
    image: redis
    networks:
        - webnet
networks:
  webnet:

ご覧のとおり、daggrサービスのホスト名を明示的に設定しています

daggrコンテナは基本的にpython tornado web serverを実行します

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('Hello from daggr running on %s\n' % socket.gethostname())

私は以下のようにテストしました

$ curl redis2:4000
Hello from daggr running on examplehostname

ここで、静的にホスト名を設定する代わりに、コンテナーが実行されているホスト名に動的に一致するようにします。すなわち。 daggrコンテナーがredis2で実行されている場合、redis2と表示され、redis3でredis3と表示されます。

Docker-compose.ymlファイルからそれをどのように指定できますか?

6
ealeon

少なくともDockerを実行している場合17.10次に、次のようなものを使用できます。

services:
  daggr:
    hostname: '{{.Node.Hostname}}'

詳細は this を参照してください。

6

上記で選択した答えがうまくいきませんでした(おそらく、私は群れモードでdocker/docker-composeを実行していないためです)。

次の手順を実行することにより、ドッカーのホストFQDNと一致するようにリバースプロキシのコンテナーホスト名を設定できました。

version: '3'

reverse-proxy:
  hostname: $HOSTNAME

これにより、起動前に正しいサーバー証明書/キーペアを選択するようにNginxを簡単に構成できました。

1
brandonsimpkins