【发布时间】:2016-01-17 03:52:28
【问题描述】:
新的Docker 文档说您仍然可以在默认的bridge 网络中使用--link,但创建自己的bridge network 更安全。然后它说在自定义bridge 网络中,您不能再使用--link 在内部映射port。
所以我想创建一个安全隔离的自定义bridge 网络,可以与彼此的端口通信。
例如,我在bridge 网络中有一个nginx 容器,但它也是包含angular 应用程序的private network 的一部分。如何在不全局公开angular 端口的情况下将proxy 从nginx 调用到angular container 上的指定端口(例如port 8080)?
更新:
我了解如何在同一网络中创建容器,然后使用它们的容器名称通过ping 相互连接。我不明白的是如何访问另一个容器的port。例如,如果web2 和nginx 都在同一个网络上,我可以从nginx ping web2 很好,但是如果我从nginx 运行curl web2:4200,我会得到Failed to connect to web2 port 4200: Connection refused。如何在不将port 4200 暴露给外界的情况下打开port 4200?
nginx 配置文件
upstream web {
server web2:4200;
}
upstream api {
server api:3000;
}
server {
listen 80;
server_name url.com;
location /api {
proxy_pass http://api;
}
location / {
proxy_pass http://web;
}
}
web 2 网络设置
"NetworkSettings": {
"Bridge": "",
"SandboxID": "f290157dd8f9b181bd544ee0b9814b1581adf61cee05c07e67a93df6bf85ecd3",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/f290157dd8f9",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks": {
"application-network": {
"EndpointID": "622f0afd4016eafc525b45c32c465c58b89ab543358ba860d31edac8ce877d83",
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:13:00:02"
}
}
}
nginx 网络设置
"NetworkSettings": {
"Bridge": "",
"SandboxID": "94f2d21562f6af5334547110893470b3bece02a081620daec98446ecd7b3f14b",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"443/tcp": null,
"80/tcp": null
},
"SandboxKey": "/var/run/docker/netns/94f2d21562f6",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "cfe8ec49e341aed2dd56bd61d1dff6867ddd0246c5a04ff8cebdeee571475bdb",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:03",
"Networks": {
"application-network": {
"EndpointID": "6242229877c5a29bfae1c0742d558daedf50fbe607b42722449367e5dda79371",
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:13:00:03"
},
"bridge": {
"EndpointID": "cfe8ec49e341aed2dd56bd61d1dff6867ddd0246c5a04ff8cebdeee571475bdb",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03"
}
}
}
我已将此问题移至此处以进一步隔离问题:docker container in same network cannot reach other container in same network
【问题讨论】:
-
你不必打开(发布)80端口,只要nginx容器监听80端口(例如
listen 0.0.0.0:80),网络中的其他容器就可以连接到它。你用的是官方的nginx图片吗?因为这对我来说是开箱即用的 -
@thaJeztah 我会运行
docker run -it -H 0.0.0.0:80 nginx让它监听那个端口吗?如何在端口 80 上将nginx获取到listen? -
-H仅用于守护进程,用于指定 API 可访问的 IP 地址。对于官方的 nginx 镜像,不需要配置。这行得通;docker network create adocker run -d --name=web2 --net=a nginxdocker run --rm --net=a ubuntu sh -c "apt-get install -yq curl && curl web2" -
此时已经超出了Docker配置的范围,在nginx的配置中。 nginx 在
server指令中是否有listen 80;之类的行? -
@AndyShinn 好的,我添加了 nginx 配置文件
标签: networking nginx docker digital-ocean