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

我不熟悉Unixnetworking,添加虚拟接口等,试图现在学习。 我们正试图dockerize我们的应用程序。
我的要求是:将IP分配给可从外部应用程序/浏览器访问的泊坞窗容器。

容器ip应该可以从同一个networking中的不同计算机基本上ping。我不想使用端口转发。

  1. 我想访问一个docker容器,就像我们使用一个IP地址访问一个虚拟机一样[没有端口映射,-p标志。 如果我在容器内运行Apache或Tomcat等任何服务器,应该可以使用容器的IP和端口进行访问。 例如: http:// container_ip:8443]
    在docker中可能吗?

  2. 在我的Unix机器上运行ifconfig(RHEL 7.1)显示docker0,ens,lo和veth接口。 没有eth0。 有点困惑于此。

我努力获得这个function,我会分享我的经验和我所做的,以得到你需要的东西。

简短的回答:

您需要创build自己的桥接器 ,将主机的物理networking接口连接到该桥接器,并将每个容器的虚拟接口连接起来,就像networking中正常的桥接虚拟机一样,然后让容器select自己的桥接器IP地址启动时。

详细的答案:

创build持久性networking桥

Bridge是一种设备(在我们的情况下是虚拟设备),其function类似于networking切换(主要在networking层2上运行),即它可以将两个或多个networking接口连接到同一局域网(LAN)如果他们有相同的子网

你将要创build一个新的持久桥br0 (它将在系统启动时自动启动),将你的物理networking接口添加到它(在我的情况下是eth0 )。 请注意,将接口添加到桥接器后,接口不再需要IP地址,因为桥接器将获得IP地址,可以用来代替您的接口,也就是说,您可以使用桥接器进行通信,就好像它是您的物理接口,它会将input/输出数据包转发到正确的目的地。 您不需要为桥分配任何硬件(MAC地址),它将自动采用第一个添加的接口的MAC。

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

安装桥梁pipe理工具:

 sudo apt install bridge-utils 

如果没有bridge-utils软件包,系统将无法创build网桥。

要创build持久桥,编辑interfaces文件:

 sudo vim /etc/network/interfaces 

将以下configuration添加到文件末尾(使其适合您的需要):

 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 

现在创build你的容器像波纹pipe, 这将导致给你的容器一个修复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" 

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

  --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软件包,以便能够执行常用的networking命令(通过ip命令给出固定的IP)。

你第一次运行容器,你可能不会注意到IP地址有任何变化,因为你的容器可能没有iproute2软件包(也就是没有ip命令) ,只要安装上述软件包,然后重新启动容器和一切应该是你想要的!

希望有所帮助。

我目前的首选方法是使用macvlan或ipvlan Dockernetworking驱动程序。 我更喜欢macvlan,因为每个容器都可以拥有自己的MAC地址,但是VMware不喜欢为单个虚拟化网卡提供多个Mac地址,并且不能正确路由stream量。

安装非常简单。 首先,你需要确定一些事情。

  • 你的主networking的子网。 在这个例子中使用10.0.0.0/24
  • 你的networking的网关。 使用10.0.0.1作为例子
  • IP范围用于分配ips(如果需要,可以在执行Docker运行时静态分配此范围以外的ips)。 对于这个例子,我将使用10.0.0.128/25。 您将需要一大堆ips来让Dockerpipe理,因此您需要确保这些ips不在您的networking中使用。
  • 您要用于stream量的设备的名称。 例如,我将使用eth0
  • 您要创build的新Dockernetworking的名称。 以“我的网”为例。

接下来,您将创build一个新的Dockernetworking,如下所示:

 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一起工作。 它创build的HyperKit虚拟机有点黑盒子。 macvlan / ipvlan方法需要一个更受控制的networking,Docker for Mac不会给你。 如果你正在试图用Docker for Mac来做到这一点,那么我会build议设置一个Docker机器。 文档如何做到这一点: https : //docs.docker.com/machine/get-started/ 。

在这种情况下,除非您喜欢在Mac上设置路由规则,否则您应该使用桥接器来连接macvlan / ipvlannetworking。 根据我的经验,对于通过MacOS主机进行NAT的第二块网卡是不必要的,但是您可能会发现其他的东西。