À l'aide de l'ip de l'hôte dans le menu fixe-composer
Je veux créer un docker-composer fichier qui est capable de s'exécuter sur des serveurs différents.
Pour ce que j'ai à être en mesure de spécifier l'hôte ip ou nom d'hôte du serveur (où tous les conteneurs sont en cours d'exécution) à plusieurs endroits dans le docker-composer.yml.
E. g. pour un consul récipient où je veux définir comment le serveur peut être trouvé par les autres consul conteneurs.
consul:
image: progrium/consul
command: -server -advertise 192.168.1.125 -bootstrap
Je ne veux pas coder en dur 192.168.1.125 évidemment.
Je pourrais utiliser env_file: pour spécifier le nom d'hôte ou ip et de l'adopter sur chaque serveur, donc j'ai que les informations en un seul endroit et de l'utiliser dans le menu fixe-composer.yml. Mais ce ne peut être utilisé pour spécifier des variables d'environnement et non pas pour faire de la publicité paramètre.
Est-il une meilleure solution?
- Ce n'est pas quelque chose que l'essaim et composer de la poignée de la boîte pour le moment. Vous pourriez probablement faire ce travail sur l'Armure, mais vous aurez besoin de Powerstrip aussi, mais cela prendra un peu plus de travail.
Vous devez vous connecter pour publier un commentaire.
docker-composer permet d'utiliser des variables d'environnement de l'environnement de l'exécution de la composition de la commande.
Voir la documentation à https://docs.docker.com/compose/compose-file/#variable-substitution
En supposant que vous pouvez créer un script de lancement, à l'instar de @balver suggéré, vous pouvez définir une variable d'environnement appelée
EXTERNAL_IP
qui comprendra la valeur de$(docker-machine ip)
.Exemple:
et
Malheureusement, si vous êtes à l'aide de random affectation de port, il n'y a aucun moyen d'ajouter
EXTERNAL_PORT
, de sorte que les ports doivent être liés statiquement.PS: quelque Chose de très similaire est activé par défaut dans HashiCorp Nomade, comprend également des ports mappés. Doc: https://www.nomadproject.io/docs/jobspec/interpreted.html#interpreted_env_vars
NO_PROXY
variable d'environnement qui contient déjà docker-ip de l'appareil et il pourrait être utilisé dansdocker-compose.yaml
docker system info -f "{{.Swarm.NodeAddr}}"
Absolument! Vous n'avez pas besoin de l'ip de l'hôte à tous pour la communication entre les conteneurs. Si vous
link
des conteneurs dans ledocker-compose.yaml
fichier, vous aurez accès à un certain nombre de variables d'environnement que vous pouvez utiliser pour découvrir les adresses ip de vos services.Considérons, par exemple, un docker-composition de configuration avec deux récipients: l'un utilisant
consul
, et exécute un certain nombre de services qui doit parler au consul.Tout d'abord, en commençant par
consul
avec juste-server -bootstrap
,consul
chiffres, c'est le propre de la publicité de l'adresse, par exemple:Dans le
webserver
conteneur, nous trouvons les variables d'environnement suivantes disponibles pour le pid 1:Il y a un ensemble de variables pour chaque port
EXPOSE
d par leconsul
image. Par exemple, dans cette seconde image, on pourrait interagir avec le consul d'API REST en se connectant à:
-1
mais de son utilisation ce pour une option de ligne de commande appelé--advertise
je devine que le processus de déclaration d'adresse quelque part à travers une autre sorte de protocole pour des machines ou des clients, et non pas dans le panneau. Donc il a besoin de savoir ce que c'est de l'ip externe est (c'est à dire le panneau d'accueil) sinon il va signaler l'un docker assigne à celle-ci. Si vous avez un poste de "C'est la manière de relier les œuvres" complètement à côté de la question, puisque ces ip ne sont pas visibles de l'extérieur de la conteneurs docker.external_links
ouextra_hosts
pour connecter le Panneau de la machine hôte de service? Par exemple j'ai eu de Postfix en cours d'exécution sur la machine hôte, mais je veux me connecter à partir d'un Support de récipient pour le service Postfix sans se lancer dans un autre conteneur docker...http://${AUTOSERVICE_PORT_8097_TCP_ADDR}:8097/path/v1/
me donner:http://:8097/path/v1/
Avec la nouvelle version de Docker Composer ( 1.4.0 ), vous devez être en mesure de faire quelque chose comme ceci:
docker-composer.yml
bash
C'est grâce à la nouvelle fonctionnalité:
sed -e "s/HOSTIP/$(docker-machine ip your-machine-name)/g" docker-compose.yml | docker-compose --file - up
sed -e "s/HOSTIP/$(hostname --ip-address)/g" docker-compose.yml | docker-compose --file - up
J'ai utilisé le panneau interne de réseau IP qui semble être statique: 172.17.0.1
Variables d'environnement, comme suggéré dans la première solution, sont créés par Docker lorsque les conteneurs sont liés. Mais l'env de vars ne sont pas automatiquement mis à jour si le conteneur est redémarré. Donc, il n'est pas recommandé d'utiliser des variables d'environnement dans la production.
Docker, en plus de créer les variables d'environnement, met également à jour les entrées d'hôte dans le fichier /etc/hosts. En fait, le Panneau de la documentation recommande d'utiliser les entrées d'hôte etc/hosts à la place des variables d'environnement.
Référence: https://docs.docker.com/userguide/dockerlinks/