Docker 网络:通过无根容器使用默认网桥

Docker 网络:通过无根容器使用默认网桥

介绍

我在 docker root-less 中遇到了网络问题。

我有一个名为rounting-dockerdocker-compose 的文件夹,其中有 2 个服务:

version: "3"

services:
    ngnix:
        image: ngnix
        ports:
            - 8080:80
    
    cmdline:
        image: ubuntu

我想要从cmdline容器中卷曲ngnix容器。


无根测试

我启动了我的 ngnix 服务器:docker-compose up -d ngnix

因此它会自动创建网络routing-docker_default172.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_default172.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 container172.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

相关内容