【问题标题】:How to set up a bridge between two docker containers (connection refused)如何在两个 docker 容器之间建立桥接(连接被拒绝)
【发布时间】:2018-03-22 15:41:58
【问题描述】:

我正在尝试在静态文件 (nginx) 服务器和动态内容服务器之间架起一座桥梁。

两个码头工人作为一个单一的实体正常工作。但是,似乎 nginx 服务器无法将(反向代理)数据转发到动态内容服务器。
如果我不使用 docker,它也可以正常工作,而只是在主机操作系统中运行。

码头工人(名为“sails”和“nginx”的容器)连接到:

docker network create -d bridge --subnet 172.25.0.0/16 bink
docker network connect bink sails
docker network connect bink nginx

nginx 尝试有一个到代理的链接:

location /api {
    proxy_pass  http://127.0.0.1:1337;
}

这是其他 docker 监听的端口:http://127.0.0.1:1337/api/get-employees/(示例 url)在从主机操作系统运行时确实给了我正确的数据。 (当 docker 还活着时)。

但是 nginx 服务器中的error.log 显示:

2018/03/22 15:21:12 [错误] 8#8: *11 connect() failed (111: Connection 拒绝)同时连接到上游,客户端:172.25.0.1,服务器:_, 请求:“GET /api/order-status-list/?_dc=1521732072867 HTTP/1。

我也尝试过手动获取 nginx 服务器内部的数据(docker exec -it nginx sh 之后)

wget 127.0.0.1:1337/api/get-employees
wget: can't connect to remote host (127.0.0.1): Connection refused

docker network inspect bink的结果

[
    {
        "Name": "bink",
        "Id": "e859514bd4186a0cc7fa7b1021c05e99cbb1d6fcf903b024c63fad2c5880ec6a",
        "Created": "2018-03-22T16:06:58.373431562+01:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.25.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "1d96ac9b62dcce80d24552b8c9513e4d91f9c9fb6bc9ac731d2e635ba1ad0ac4": {
                "Name": "nginx",
                "EndpointID": "0429077af2cf0573ec073e9834fae7b710daf3c9d4e0f9bce7638ad9c4d07205",
                "MacAddress": "02:42:ac:19:00:03",
                "IPv4Address": "172.25.0.3/16",
                "IPv6Address": ""
            },
            "2ce6e54bf01c73ca06306b49a8021ab2b438710607a96a32f3c3349d89e93293": {
                "Name": "sails",
                "EndpointID": "98c5bece45cd77a468a8dc92c6938525bd8ef38d27051e675ae1c4494e5081b4",
                "MacAddress": "02:42:ac:19:00:02",
                "IPv4Address": "172.25.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

一切似乎都如预期的那样?


编辑:我可以通过明确说明sails docker的ip地址从nginx docker获取sails/dynamic的数据:

wget 172.25.0.2:1337/api/get-employees

给出预期的结果。然而,这不是一个解决方案,因为 docker 网络的内部 ips 应该是一个实现细节并且不应该被使用。

【问题讨论】:

    标签: docker nginx sails.js bridge


    【解决方案1】:

    这两个容器有不同的IP地址,一个是172.25.0.2,另一个是172.25.0.3。这就是为什么你们不能使用127.0.0.1 互相访问。

    用户定义的网桥提供容器之间的自动 DNS 解析。您可以使用容器名称连接到不同的容器。

    欲了解更多信息,请参阅https://docs.docker.com/network/bridge/#differences-between-user-defined-bridges-and-the-default-bridge

    【讨论】:

    • 这意味着我的开发电脑的设置(它不会将图像放入容器中)与生产环境本质上是不同的? - 我每次都必须手动修改生产环境中的 nginx 配置?这通常是如何完成的?在同一个容器中运行两个服务器似乎也违背了 docker 试图做的事情。
    • 也许您可以将您的开发 Nginx 配置绑定挂载到容器,而无需接触生产 Nginx 配置?
    • 这将使生产 nginx 容器依赖于另一个容器的“特定”名称。它不会使这两个进程分开(可测试)和“谁可能正在监听端口 1337”。
    猜你喜欢
    • 2019-10-20
    • 2020-07-08
    • 1970-01-01
    • 2021-09-06
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多