如何在两个 docker 容器之间建立桥接(连接被拒绝)
How to set up a bridge between two docker containers (connection refused)
好吧,我正在尝试在静态文件 (nginx) 服务器和动态内容服务器之间架起一座桥梁。
两个 docker 作为单一实体都可以正常工作。然而,nginx 服务器似乎无法将数据转发(反向代理)到动态内容服务器。
如果我不使用 dockers,而只是在 host 操作系统中使用 运行,它也能正常工作。
dockers(名为 "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 尝试 link 给一个代理:
location /api {
proxy_pass http://127.0.0.1:1337;
}
这是另一个 docker 监听的端口:http://127.0.0.1:1337/api/get-employees/
(示例 url)确实给我正确的数据,当 运行 来自 host os。 (当 docker 还活着时)。
然而error.log
在nginx服务器中显示:
2018/03/22 15:21:12 [error] 8#8: *11 connect() failed (111: Connection
refused) while connecting to upstream, client: 172.25.0.1, server: _,
request: "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": {}
}
]
一切似乎都如预期的那样?
编辑:我可以通过明确说明风帆的 ip 地址 docker:
从 nginx docker 从 sails/dynamic 获取数据
wget 172.25.0.2:1337/api/get-employees
给出了预期的结果。然而,这不是解决方案,因为 docker 网络的内部 ips 应该是一个实现细节,不应使用。
这两个容器的IP地址不同,一个是172.25.0.2
,一个是172.25.0.3
。这就是为什么你们不能使用 127.0.0.1
互相访问的原因。
User-defined 网桥提供容器间的自动 DNS 解析。您可以使用容器名称连接到不同的容器。
好吧,我正在尝试在静态文件 (nginx) 服务器和动态内容服务器之间架起一座桥梁。
两个 docker 作为单一实体都可以正常工作。然而,nginx 服务器似乎无法将数据转发(反向代理)到动态内容服务器。
如果我不使用 dockers,而只是在 host 操作系统中使用 运行,它也能正常工作。
dockers(名为 "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 尝试 link 给一个代理:
location /api {
proxy_pass http://127.0.0.1:1337;
}
这是另一个 docker 监听的端口:http://127.0.0.1:1337/api/get-employees/
(示例 url)确实给我正确的数据,当 运行 来自 host os。 (当 docker 还活着时)。
然而error.log
在nginx服务器中显示:
2018/03/22 15:21:12 [error] 8#8: *11 connect() failed (111: Connection refused) while connecting to upstream, client: 172.25.0.1, server: _, request: "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": {}
}
]
一切似乎都如预期的那样?
编辑:我可以通过明确说明风帆的 ip 地址 docker:
从 nginx docker 从 sails/dynamic 获取数据wget 172.25.0.2:1337/api/get-employees
给出了预期的结果。然而,这不是解决方案,因为 docker 网络的内部 ips 应该是一个实现细节,不应使用。
这两个容器的IP地址不同,一个是172.25.0.2
,一个是172.25.0.3
。这就是为什么你们不能使用 127.0.0.1
互相访问的原因。
User-defined 网桥提供容器间的自动 DNS 解析。您可以使用容器名称连接到不同的容器。