現在、スウォームクラスターに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ファイルからそれをどのように指定できますか?
少なくともDockerを実行している場合17.10
次に、次のようなものを使用できます。
services:
daggr:
hostname: '{{.Node.Hostname}}'
詳細は this を参照してください。
上記で選択した答えがうまくいきませんでした(おそらく、私は群れモードでdocker/docker-composeを実行していないためです)。
次の手順を実行することにより、ドッカーのホストFQDNと一致するようにリバースプロキシのコンテナーホスト名を設定できました。
version: '3'
reverse-proxy:
hostname: $HOSTNAME
これにより、起動前に正しいサーバー証明書/キーペアを選択するようにNginxを簡単に構成できました。