我有这个:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e3252abd7587 cdt-tests "/bin/bash /home/new…" 5 seconds ago Exited (1) 22 seconds ago cdt-tests
f492760705e3 cdt-server "/bin/bash /usr/loca…" 52 seconds ago Up About a minute 0.0.0.0:3040->3040/tcp cdt-server
89c5a28855df mongo "docker-entrypoint.s…" 55 seconds ago Up About a minute 27017/tcp cdt-mongo
1eaa4aa684a9 selenium/standalone-firefox:3.4.0-chromium "/opt/bin/entry_poin…" 59 seconds ago Up About a minute 4444/tcp cdt-selenium
cdt-tests容器正在尝试与同一网络中的其他容器建立连接。网络看起来像这样:
$ docker network inspect cdt-net # this yields the below json
[
{
"Name": "cdt-net",
"Id": "8c2b486e950076130860e0c6c09f06eaf8cccf02127786b80bf7cc169f8eae0f",
"Created": "2018-01-23T21:52:34.5021152Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"1eaa4aa684a9d7c1ad7a1b7ac28418b100e6b8d7a22ceb2a97cf51e4487c5fb2": {
"Name": "cdt-selenium",
"EndpointID": "674ce85e14339e67e767ab9844cd2fd1356fc3e60ab050e1cd1457e4168ac9fc",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"89c5a28855dfde05fe9db9a35bbe7bce232eb56d9024022785d2a65570c423b5": {
"Name": "cdt-mongo",
"EndpointID": "ed497939965363cd194b4fea8e6a26ee47ef7f24bef56c9726003a897be83dd1",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
},
"f492760705e30be4fe8469ae422e96548ee2192f41314e3815762a9e39a4cc82": {
"Name": "cdt-server",
"EndpointID": "17e8bd6f7735a52669f0fe92b2d5717c7a3ae6954c108af3f29c13233ef20ee6",
"MacAddress": "02:42:ac:12:00:04",
"IPv4Address": "172.18.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
在我的cdt-tests容器中,我运行这些命令:
export CDT_SELENIUM_HOST="cdt-selenium.cdt-net";
export OPENSHIFT_NODEJS_IP="127.0.0.1";
export OPENSHIFT_NODEJS_PORT="3040";
export CDT_SERVER_HOST="127.0.0.1";
export CDT_SERVER_PORT=3040;
export OPENSHIFT_MONGODB_DB_HOST="127.0.0.1"
export OPENSHIFT_MONGODB_DB_PORT=27017
nc -zv "$CDT_SELENIUM_HOST" 4444 > /dev/null 2>&1
nc_exit=$?
if [ ${nc_exit} -eq 0 ]; then
echo "selenium server is live"
else
echo "selenium server is NOT live"
exit 1;
fi
nc -zv "$OPENSHIFT_MONGODB_DB_HOST" 27017 > /dev/null 2>&1
nc_exit=$?
if [ ${nc_exit} -eq 0 ]; then
echo "mongo server is live"
else
echo "mongo server is NOT live"
exit 1;
fi
nc -zv "$CDT_SERVER_HOST" 3040 > /dev/null 2>&1
nc_exit=$?
if [ ${nc_exit} -eq 0 ]; then
echo "cdt server is live"
else
echo "cdt server is NOT live"
exit 1;
fi
并且所有这些连接测试都失败了。有谁知道如何连接同一个Docker网络中的容器?是否有一些可靠的模式可供使用?
答案 0 :(得分:3)
您似乎正在尝试使用127.0.0.1
作为其他容器的地址。 Docker容器在隔离的网络空间中都具有唯一的IP地址。就像你自己的物理主机一样,127.0.0.1
是一个特殊的地址,意味着"这个容器"。因此,由于这些服务都没有在您正在运行测试的容器中运行,因此您无法连接任何内容。
您需要使用运行您要测试的服务的容器的IP地址。由于ip地址随着每次部署而变化,因此使用文字地址并不方便。您需要一些方法来动态获取信息。因此,Docker在每个网络上维护一个DNS服务,这样您就可以像使用任何其他主机名一样使用容器名称。
例如,在您的环境中,您可以设置:
export OPENSHIFT_MONGODB_DB_HOST="cdt-mongo"
然后你的mongo测试应该会成功。等等你正在使用的其他_HOST和_IP变量。
答案 1 :(得分:0)
我可以向您保证,提到的@larsks会很好地工作。
但是仍然有一种简单的方法。根据上面的描述,我可以看到容器cdt-tests
与其他容器位于同一网络中。因此,您可以将所有容器附加到docker network create -d bridge mynet
创建的用户定义的桥接网络上。
启动容器时,只需添加--net=mynet
标志。
例如docker run -tid --name=cdt-server --net=mynet cdt-server
。
因此,无需将任何ENV添加到您的容器中。由于用户定义的桥接网络可在容器之间提供自动DNS解析。您可能会看到介绍here。