我曾经也遇到过同样的问题,现在我将分享我的经验并告诉你如何得到你所需要的功能。
简短回答:
你需要创建自己的网络桥接,将主机的物理网络接口连接到该桥接中,并将每个容器的虚拟接口连接到该桥接中,以便使容器能够像正常的桥接虚拟机一样在你的网络中运行。然后让容器在启动时选择自己的IP地址。
详细回答:
创建持久性网络桥接
网络桥接,是一个设备(在我们的情况下为虚拟设备),类似于网络交换机(主要在网络层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
命令)。只需安装提到的软件包,然后重新启动容器,一切都应该正如您所希望的那样!
希望这可以帮助到您。