将 docker 容器连接到本地网络

Ash*_*rki 5 networking ssh linux-networking docker

我想做什么

我正在尝试使我的容器可用于所有设备的网络,而不仅仅是 docker 主机。

信息

  • 我的网络子网是 9.158.143.0/24
  • 我的网关是 9.1158.143.254
  • 我的 docker 主机 IP 是 9.158.143.52 主接口 (ens160)
  • 我的容器 IP 是 9.158.143.65
  • docker-pid 是 docker 进程 ID
  • docker id 是 docker ip

我想做什么

我正在尝试使我的容器可用于所有设备的网络,而不仅仅是 docker 主机。

我想制作 docker 配置,以便可以从我的网络中的任何地方访问 docker(在我的情况下是 ssh)。

到目前为止的步骤

  1. 首先创建一个新的桥接设备。

    • brctl addbr br-em1

    • ip 链接设置 br-em1

  2. 将此设备添加到您的网桥

    • brctl addif br-em1 ens160
  3. 使用曾经属于 ens160 的地址配置网桥

    • ip 地址 del 9.158.143.52/24 dev ens160

    • ip 地址添加 9.158.143.52/24 dev br-em1

  4. 将默认路由移动到网桥

    • ip route del 默认
    • ip route 通过 9.158.143.254 dev br-em1 添加默认值

到目前为止一切正常。docker 主机具有网络连接。

  1. docker run -itd --name web ubuntu

  2. 创建一个 veth 接口对:

    • ip link add web-int type veth peer name web-ext
  3. brctl addif br-em1 web-ext

  4. 并将 web-int 接口添加到容器的命名空间:

    • ip 链接集 netns $(docker-pid web) dev web-int
  5. nsenter -t $(docker-pid web) -n ip link set web-int up

  6. nsenter -t $(docker-pid web) -n ip addr add 9.158.143.65/24 dev web-int

到目前为止,veth 是在 docker 容器内创建的,并且互联网正在容器内工作。

  1. nsenter -t $(docker-pid web) -n ip route del 默认

  2. nsenter -t $(docker-pid web) -n ip route 通过 9.158.143.254 dev web-int 添加默认值

问题

这些是遵循的步骤。在最后 2 个步骤之后,互联网停止使用容器。我无法从网络中的任何其他机器(之前正在工作)ping docker 主机。

除了这些步骤之外,是否还需要添加任何 iptables 规则。如果是这样,请帮助。

PS:我的 docker0 ip 是 172.17.0.1 使用的链接:http ://blog.oddbit.com/2014/08/11/four-ways-to-connect-a-docker/ (使用 linux 桥接设备)

使用的 Ubuntu 映像已启动并运行 ssh 服务。

slm*_*slm 1

我在设置类似内容时采用的方法是为每个容器静态分配 IP 地址。然后,我将这些 IP 地址作为辅助 IP“堆叠”在网桥的接口上vmbr0

我的网络设置:

$ ip a l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:22:15:91:XX:XX brd ff:ff:ff:ff:ff:ff
    inet6 fe80::222:15ff:fe91:XXXX/64 scope link
       valid_lft forever preferred_lft forever
3: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 00:22:15:91:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global vmbr0
    inet 192.168.1.101/24 scope global secondary vmbr0
    inet 192.168.1.103/24 scope global secondary vmbr0
    inet6 fe80::222:15ff:fe91:c12d/64 scope link
       valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
Run Code Online (Sandbox Code Playgroud)

我添加了这些辅助 IP,如下所示:

$ ip addr add 192.168.1.101/24 dev vmbr0
$ ip addr add 192.168.1.101/24 dev vmbr0
Run Code Online (Sandbox Code Playgroud)

我会像这样运行我的容器:

$ docker run --name='bind' -d \
    -p 192.168.1.101:53:53/udp \
    -p 192.168.1.101:10000:10000 sameersbn/bind:latest
Run Code Online (Sandbox Code Playgroud)