连接Docker网络中的容器

时间:2018-01-23 21:58:31

标签: docker docker-network

我有这个:

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网络中的容器?是否有一些可靠的模式可供使用?

2 个答案:

答案 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