在docker-compose中使用主机IP

我想创build一个能够在不同服务器上运行的docker-compose文件。

为此,我必须能够在docker-compose.yml中的多个位置指定服务器的主机IP地址或主机名(所有容器正在运行的地方)。

例如,对于一个领事容器,我想定义如何find服务器的领事容器。

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

我不想硬编码192.168.1.125明显。

我可以使用env_file:指定主机名或ip并在每个服务器上采用它,所以我将这些信息放在一个地方,然后在docker-compose.yml中使用。 但是这只能用来指定环境variables而不能用于advertise参数。

有更好的解决scheme吗?

有更好的解决scheme吗?

绝对! 您根本不需要主机ip来进行容器之间的通信。 如果在docker-compose.yaml文件中link容器,则可以访问许多可用于发现服务的IP地址的环境variables。

例如,考虑一个有两个容器的docker-composeconfiguration:一个使用consul ,另一个使用一些需要与consul交谈的服务。

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

首先, consul只用-server -bootstrap启动consulconsul找出自己的广告地址,例如:

 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> 

webserver容器中,我们发现以下环境variables可用于pid 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 

每个端口有一组variables,由consul图像显示。 例如,在第二张图片中,我们可以通过连接到:

 http://${CONSUL_PORT_8500_TCP_ADDR}:8500/ 

使用新版本的Docker Compose( 1.4.0 ),你应该可以做到这样的事情:

泊坞窗,compose.yml

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

庆典

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

这是由于新function:

  • Compose现在可以通过指定 – 作为文件名,从标准input读取YAMLconfiguration,而不是从文件读取。 这使得dynamic生成configuration更容易:

     $ echo 'redis: {"image": "redis"}' | docker-compose --file - up 

docker-compose允许使用运行compose命令的环境中的环境variables。

请参阅https://docs.docker.com/compose/compose-file/#variable-substitution上的文档;

假设你可以创build一个包装脚本,就像@balverbuild议的那样,你可以设置一个名为EXTERNAL_IP的环境variables,它包含$(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中默认启用的东西非常相似,也包含映射的端口。 Doc: https : //www.nomadproject.io/docs/jobspec/interpreted.html#interpreted_env_vars

前面的解决scheme中提出的环境variables是在容器链接时由Docker创build的。 但是,如果容器重新启动,envvariables不会自动更新。 所以,不build议在生产环境中使用环境variables。

除了创build环境variables外,Docker还更新/ etc / hosts文件中的主机条目。 实际上,Docker文档build议使用来自etc / hosts的主机条目而不是环境variables。

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

与/ etc / hosts文件中的主机条目不同,如果源容器重新启动,则存储在环境variables中的IP地址不会自动更新。 我们build议使用/ etc / hosts中的主机条目来parsing链接的容器的IP地址。

我已经使用了似乎是静态的docker内部networkingIP:172.17.0.1