介绍
我在 docker root-less 中遇到了网络问题。
我有一个名为rounting-docker
docker-compose 的文件夹,其中有 2 个服务:
version: "3"
services:
ngnix:
image: ngnix
ports:
- 8080:80
cmdline:
image: ubuntu
我想要从cmdline
容器中卷曲ngnix容器。
无根测试
我启动了我的 ngnix 服务器:docker-compose up -d ngnix
因此它会自动创建网络routing-docker_default
172.28.0.0/16
ngnix 容器被分配了ip:172.28.0.2
然后启动我的cmdline
容器docker-compose run --rm cmdline
从cmdline
容器中我只能使用curl 172.28.0.2
我可以从我的电脑通过以下 URL 访问 ngnix 页面:
localhost:8080
127.0.0.1:8080
192.168.25.54:8080 #My computer ip
172.17.0.1:8080 #172.17.0.0/16 is the default bridge network for docker
127.28.0.2 #which seems logic according to the fact that my docker network is 172.28.0.0/16
Rootful 测试
我启动了我的 ngnix 服务器:docker-compose up -d ngnix
因此它会自动创建网络routing-docker_default
172.23.0.0/16
ngnix 容器被分配了ip:172.23.0.2
然后启动我的cmdline
容器docker-compose run --rm cmdline
我可以通过以下方式从cmdline
容器访问它:
172.23.0.2 #the ip of the ngnix container
172.23.0.1:8080 #the "router" foy my routing-docker_default network
172.17.0.1:8080 #the "router" for the default docker network
192.168.25.54:8080
我可以从我的电脑通过以下 URL 访问 ngnix 页面:
localhost:8080
127.0.0.1:8080
192.168.25.54:8080 #My computer ip
172.17.0.1:8080 #172.17.0.0/16 is the default bridge network for docker
127.23.0.2 #which seems logic according to the fact that my docker network is 172.23.0.0/16
172.23.0.2 #the ip of the ngnix container
172.23.0.1:8080 #the "router" foy my routing-docker_default network
172.17.0.1:8080 #the "router" for the default docker network
我期望/我想要什么
在无根模式下,我想通过 ip 访问ngnix
容器cmdline container
:172.17.0.1
我希望这在我的产品/开发环境中具有完全相同的网络寻址。
我希望它足够清晰。我已经把我所做的所有调试处理都放上去了。我希望我没有遗漏任何东西。
谢谢
答案1
编辑 注意,以下答案适用于dockerd在root帐户下运行的系统(它不是rootless)
原始答案
考虑使用默认网络以外的网络。在下面的例子中,无论在什么环境下,都可以从 192.168.27.100 访问 nginx
version: "3"
services:
nginx:
image: nginx
ports:
- 8080:80
networks:
cust_network:
ipv4_address: 192.168.27.100
cmdline:
image: ubuntu
networks:
- cust_network
networks:
cust_network:
driver: bridge
ipam:
config:
- subnet: 192.168.27.0/24
如果在执行 docker-compose 之前使用 grep 查看桥接接口,您会看到:
$ ip a | grep -A 2 "[0-9].*br-"
$
可以看到,主机上没有桥接接口。但是,启动 docker-compose 后:
$ docker-compose up -d
Starting test_nginx_1 ... done
Starting test_cmdline_1 ... done
$ ip a | grep -A 2 "[0-9].*br-"
5: br-03317adad668: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:75:73:52:48 brd ff:ff:ff:ff:ff:ff
inet 192.168.27.1/24 brd 192.168.27.255 scope global br-03317adad668
valid_lft forever preferred_lft forever
inet6 fe80::42:75ff:fe73:5248/64 scope link
---
1: vetha4d6986@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-03317adad668 state UP group default
link/ether 36:de:ab:19:93:4a brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::34de:abff:fe19:934a/64 scope link
您可以使用 nc 验证端口是否打开
$ nc -zv 192.168.27.100 80
192.168.27.100: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.27.100] 80 (http) open