一尘不染

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

docker

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

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

  1. 我想访问docker容器,就像我们使用ip地址访问VM。没有端口映射,-p标志。如果我在容器中运行任何服务器,例如Apache或Tomcat,则应该使用容器ip和端口对其进行访问。例如:[http:// container_ip:8443]
    在docker中可能吗?

  2. 在我的Unix盒(RHEL 7.1)上运行ifconfig会显示docker0,ens,lo和veth接口。没有eth0。对此感到困惑。


阅读 435

收藏
2020-06-17

共1个答案

一尘不染

我一直在努力获得该功能,我将分享我的经验以及为获得您所需的一切所做的工作。

简短的答案:

您需要创建 自己的网桥
,将主机的物理网络接口连接到该网桥,并连接要像网络中的普通桥接虚拟机一样运行的每个容器的虚拟接口,然后使容器选择自己的容器启动时的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

现在像波纹管一样创建您的容器, 这将为您的容器提供一个固定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命令),只需安装提到的软件包,然后重新启动容器,一切都应该完全如您所愿!

希望能有所帮助。

2020-06-17