将LAN IP地址分配给Docker容器,使其与主机的IP地址不同

14

我对Unix网络和添加虚拟接口等方面不是很熟悉,现在正在学习。我们正试图将应用程序容器化。
我的要求是:为可从外部应用程序/浏览器访问的docker容器分配IP地址。

该容器的IP地址基本上应该能够从同一网络中的另一台计算机进行ping测试。我不想使用端口转发。

  1. 我想像使用IP地址访问VM一样访问Docker容器。 [不使用端口映射、-p标志。 如果我在容器内运行Apache或Tomcat等服务器,则应该可以使用容器IP和端口进行访问。 例如:http://container_ip:8443]
    在Docker中是否可能实现此目标?

  2. 在我的Unix盒子(RHEL 7.1)上运行ifconfig显示docker0、ens、lo和veth接口。 没有eth0。 我有点困惑。

2个回答

17

我曾经也遇到过同样的问题,现在我将分享我的经验并告诉你如何得到你所需要的功能。

简短回答:

你需要创建自己的网络桥接,将主机的物理网络接口连接到该桥接中,并将每个容器的虚拟接口连接到该桥接中,以便使容器能够像正常的桥接虚拟机一样在你的网络中运行。然后让容器在启动时选择自己的IP地址。

详细回答:

创建持久性网络桥接

网络桥接,是一个设备(在我们的情况下为虚拟设备),类似于网络交换机(主要在网络层2上操作),即它可以连接两个或多个网络接口,如果它们有相同的子网,则这些接口可以处于同一局域网(LAN)上

你将创建新的持久性桥接 br0(它将在系统启动时自动启动),将你的物理网络接口添加到其中(在我的情况下是 eth0)。请注意,在将接口添加到桥接后,该接口不再需要IP地址,因为桥接将获得IP地址,并且可以代替你的接口使用,即你可以像使用物理接口一样使用该桥接进行通信,它将转发输入/输出数据包到正确的目标地址。你不需要为桥接分配任何硬件(MAC地址),它将自动获取第一个添加接口的MAC地址。

警告:强烈建议不要远程执行这些步骤,除非你可以访问服务器!如果不小心,你可能会失去与服务器的连接。

安装管理网络桥接的实用程序:

sudo apt install bridge-utils

如果没有安装bridge-utils软件包,系统将无法创建桥接。

要创建持久性的桥接,请编辑interfaces文件:

sudo vim /etc/network/interfaces
将以下配置添加到文件末尾(根据您的需要进行调整):
auto br0
iface br0 inet static
    bridge_ports eth0
    address 192.168.1.10
    netmask 255.255.255.0
    broadcast 192.168.1.255
    gateway 192.168.1.1

现在删除Docker的默认桥接docker0,因为我们不需要它:

sudo systemctl stop docker
sudo ip link set dev docker0 down
sudo brctl delbr docker0

编辑 Docker 的服务启动脚本,将其使用你的桥接器(br0)代替 Docker 默认的桥接器(docker0),并传递一些重要的桥接参数:

Ubuntu:

sudo vim /etc/systemd/multi-user.target.wants/docker.service

将文件调整为如下的样子:

[Service]

ExecStart=/usr/bin/dockerd -H fd:// --bridge=br0 --fixed-cidr=192.168.1.32/27 --default-gateway=192.168.1.1

现在让系统了解该文件的更改:

sudo systemctl daemon-reload

重新启动系统:

sudo reboot

现在检查一下你的桥,它应该在那里!

ip addr

现在按照以下方式创建您的容器,这将使您的容器获得固定IP地址

  docker run --name myContainer \
  -it --restart always --memory 100M \
  --network bridge --cap-add NET_ADMIN \
  --hostname client1.noureldin.local \
  --add-host "client1.noureldin.local client1":192.168.1.123 \
  mnoureldin/general-purpose:latest /bin/bash -c " \
  ip addr flush dev eth0; \
  ip addr add 192.168.1.123/24 brd + dev eth0; \
  ip route add default via 192.168.1.1 dev eth0; \
  /bin/bash"

与您的网络要求相关的重要部分是:

  --network bridge --cap-add NET_ADMIN \
  ip addr flush dev eth0; \
  ip addr add 192.168.1.123/24 brd + dev eth0; \
  ip route add default via 192.168.1.1 dev eth0; \

当然,请确保已在您的容器中安装了iproute2 net-tools iputils-ping软件包,以便能够执行常见的网络命令(使用ip命令分配固定IP)。

如果您首次运行容器,则可能不会注意到IP地址的任何更改,因为您的容器可能没有iproute2软件包(即没有ip命令)。只需安装提到的软件包,然后重新启动容器,一切都应该正如您所希望的那样!

希望这可以帮助到您。


6
我的当前首选方法是使用macvlan或ipvlan Docker网络驱动程序。我更喜欢macvlan,因为每个容器都可以有自己的MAC地址,但有些东西(比如VMware)不喜欢在一个虚拟网卡上有多个MAC地址,并且无法正确地路由流量。
设置非常简单。首先,您需要确定一些内容:
- 主网络的子网。本例中使用10.0.0.0/24。 - 网络的网关。例如使用10.0.0.1。 - 用于分配IP的范围(如果需要,在进行Docker运行时可以静态分配范围之外的IP)。本例将使用10.0.0.128/25。您需要一块IP地址来让Docker管理,因此需要确保这些IP地址在您的网络上未被使用。 - 您要用于流量的设备的名称。例如,本例中使用eth0。 - 您要创建的新Docker网络的名称。例如,本例中使用“my net”。
接下来,您可以像下面这样创建一个新的Docker网络:
docker network create -d macvlan —-subnet 10.0.0.0/24 --ip-range 10.0.0.128/25 —-gateway 10.0.0.1 -o parent=eth0 mynet

现在当您启动容器时,请使用以下命令:
docker run —-network mynet .....

更多信息请参见Docker文档:https://docs.docker.com/engine/userguide/networking/get-started-macvlan 需要注意的是,macvlan/ipvlan与Docker for Mac不兼容。它创建的HyperKit虚拟机是一个黑盒子。macvlan/ipvlan需要更受控制的网络,而Docker for Mac无法提供。如果您想在Docker for Mac上尝试此操作,则建议设置Docker Machine。如何设置的文档在这里:https://docs.docker.com/machine/get-started/
在这种情况下,除非您喜欢在Mac上设置路由规则,否则应该让docker machine使用桥接接口,然后将macvlan/ipvlan网络连接到该接口。根据我的经验,不需要通过MacOS主机进行NAT的第二个NIC,但您可能会发现其他情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接