新的Docker文档称,您仍然可以在默认的桥接网络中使用--link,但创建自己的桥接网络更加安全。然后它说,在自定义的桥接网络中,您不能再使用--link来映射端口。
因此,我想创建一个安全隔离的自定义桥接网络,可以互相通信的端口。
例如,我有一个nginx容器在桥接网络中,但也是私有网络的一部分,其中包含一个angular应用程序。如何从nginx代理调用到指定端口(例如端口8080)上的angular容器,而不会将angular端口全局公开?
更新:
我知道如何在同一网络中创建容器,然后使用其容器名称相互连接,使用ping。我不明白的是如何访问另一个容器的端口。例如,如果web2和nginx都在同一网络中,我可以从nginx ping web2,但如果我从nginx运行curl web2:4200,则会收到“无法连接到web2端口4200:连接被拒绝”的消息。如何打开端口4200而不将端口4200暴露给外部世界?
nginx配置文件
我已将此问题移至此处,以更好地隔离问题:docker容器在同一网络中无法访问同一网络中的其他容器。
因此,我想创建一个安全隔离的自定义桥接网络,可以互相通信的端口。
例如,我有一个nginx容器在桥接网络中,但也是私有网络的一部分,其中包含一个angular应用程序。如何从nginx代理调用到指定端口(例如端口8080)上的angular容器,而不会将angular端口全局公开?
更新:
我知道如何在同一网络中创建容器,然后使用其容器名称相互连接,使用ping。我不明白的是如何访问另一个容器的端口。例如,如果web2和nginx都在同一网络中,我可以从nginx ping web2,但如果我从nginx运行curl web2:4200,则会收到“无法连接到web2端口4200:连接被拒绝”的消息。如何打开端口4200而不将端口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.0网络设置
"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容器在同一网络中无法访问同一网络中的其他容器。
-H
参数仅适用于守护进程,用于指定 API 可访问的 IP 地址。对于官方的 nginx 镜像,无需进行任何配置即可正常使用。以下命令可以实现此功能:docker network create a
docker run -d --name=web2 --net=a nginx
docker run --rm --net=a ubuntu sh -c "apt-get install -yq curl && curl web2"
。 - thaJeztahlisten 80;
这样的行在server
指令内? - Andy Shinnweb2
是一个基于node
的镜像。其中包含有http-server
,返回一个简单的index.html
文件。 - monty_lenniehttp-server ./ -p 4200 -a 0.0.0.0 index.html
。 - monty_lennie