当前位置:  开发笔记 > 运维 > 正文

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

如何解决《将LANIP地址分配给Docker容器,与主机的IP地址不同》经验,为你挑选了1个好方法。

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

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

    我想访问一个docker容器,就像我们使用ip地址访问VM一样.[没有端口映射,-p标志.如果我在容器内运行Apache或Tomcat之类的任何服务器,则应使用容器ip和端口访问它.例如:http:// container_ip:8443]
    在docker中这可能吗?

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

Mohammed Nou.. 9

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

简短的回答:

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

详细答案:

创建持久性网桥

Bridge是一个设备(在我们的例子中是虚拟设备),其行为类似于网络交换机(主要在网络层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> Mohammed Nou..:

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

简短的回答:

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

详细答案:

创建持久性网桥

Bridge是一个设备(在我们的例子中是虚拟设备),其行为类似于网络交换机(主要在网络层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命令),只是安装所提到的包然后重新启动容器,一切都应该是完全按照你的意愿!

希望有所帮助.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有