À l'heure actuelle, j'ai deux nœuds dans le cluster Swarm
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
yey1njv9uz8adf33m7oz0h80f * redis2 Ready Active Leader
lbo91v2l15h24isfd5jegoxu1 redis3 Ready Active
c'est le fichier 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:
comme vous le voyez, je configure explicitement hostname pour le service daggr
le conteneur daggr exécute essentiellement un serveur Web python tornado
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write('Hello from daggr running on %s\n' % socket.gethostname())
J'ai testé comme ci-dessous
$ curl redis2:4000
Hello from daggr running on examplehostname
Maintenant, au lieu de définir de manière statique le nom d’hôte, je veux que ce soit une correspondance dynamique avec le nom d’hôte de l’emplacement du conteneur. c'est à dire. si le conteneur daggr est exécuté sur redis2, il devrait indiquer redis2 et sur redis3, il devrait indiquer redis3.
Comment puis-je spécifier cela à partir du fichier docker-compose.yml?
Si vous utilisez au moins Docker 17.10
, vous pouvez utiliser quelque chose comme ceci:
services:
daggr:
hostname: '{{.Node.Hostname}}'
Voir this pour plus d'informations.
La réponse sélectionnée ci-dessus n'a pas fonctionné pour moi (probablement parce que je ne lance pas docker/docker-compose en mode essaim).
J'ai pu configurer le nom d'hôte du conteneur pour mon proxy inverse afin qu'il corresponde au nom de domaine complet de l'hôte docker en procédant comme suit:
version: '3'
reverse-proxy:
hostname: $HOSTNAME
Cela m'a permis de configurer facilement Nginx pour qu'il sélectionne la paire cert/serveur de serveur correcte avant le démarrage.