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

时间:2016-01-11 05:43:39

标签: docker ip port containers public

我不熟悉Unix网络,添加虚拟接口等,现在尝试学习它。我们正试图将我们的应用程序停靠 我的要求是:将ip分配给可从外部应用程序/浏览器访问的docker容器。

容器ip应该可以从同一网络中的另一台计算机上ping通。我不想使用端口转发。

  1. 我想访问一个docker容器,就像我们使用ip访问VM一样 地址。[没有端口映射,-p标志。如果我运行像Apache或Tomcat这样的服务器 在容器内部,应该可以使用容器ip和来访问它 港口。例如:http://container_ip:8443]
    这在Docker中是否可行?

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

2 个答案:

答案 0 :(得分:9)

我努力获得这项功能,我将分享我的经验以及我所做的工作以获得您所需要的。

答案简短:

您需要创建您自己的网桥,将主机的物理网络接口连接到该网桥,并将您想要表现的每个容器的虚拟接口连接到您正常的桥接虚拟机中网络,然后让容器在启动时选择自己的IP地址。

详细答案:

创建持久性网桥

Bridge是一种设备(在我们的例子中是虚拟设备),其行为类似于网络swiches(主要在网络层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

现在像bellow一样创建容器,这将导致为您的容器提供修复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地址的任何更改,因为您的conainer可能没有iproute2包(即没有ip命令),只是提到所提到的包,然后重新启动容器,一切都应该是你想要的!

希望有所帮助。

答案 1 :(得分:2)

我目前首选的方法是使用macvlan或ipvlan Docker网络驱动程序。我更喜欢macvlan,因为每个容器都有自己的MAC地址,但有些像VMware这样的东西不喜欢为单个虚拟化的nic提供多个Mac地址,并且不会正确路由流量。

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

  • 主网络的子网。在此示例中使用10.0.0.0/24
  • 您网络的网关。使用10.0.0.1作为示例
  • 用于分配ips的IP范围(如果需要,可以在执行Docker运行时静态分配ips超出此范围)。对于此示例,我将使用10.0.0.128/25。您将需要一大块ips才能让Docker管理,因此您需要确保这些ips未在您的网络上使用。
  • 要用于流量的设备的名称。例如,我将使用eth0
  • 您要创建的新Docker网络的名称。使用“我的网”作为例子。

接下来,您将创建一个新的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 vm有点像黑盒子。 macvlan / ipvlan方法需要一个更加可控的网络,Docker for Mac无法为您提供。如果您尝试使用Docker for Mac执行此操作,那么我建议您设置Docker Machine。有关如何执行此操作的文档位于:https://docs.docker.com/machine/get-started/

在这种情况下,除非您喜欢在Mac上设置路由规则,否则您应该让docker计算机使用桥接接口,然后可以将macvlan / ipvlan网络连接到该接口。根据我的经验,不需要通过MacOS主机进行NAT的第二个NIC,但你可能会发现其他的东西。