我很难获得该功能,我将分享我的经验以及我为获得您需要的功能所做的工作。
简短的回答:
您需要创建您自己的网桥,将主机的物理网络接口连接到该网桥,并连接每个容器的虚拟接口,使其表现得像您的普通桥接虚拟机一样网络,然后让容器在启动时选择自己的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
现在像下面这样创建你的容器,这将为你的容器提供一个固定 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 命令),只需安装提到的包,然后重新启动容器,一切都应该完全如你所愿!
希望对您有所帮助。