创建 docker 机器或容器时如何设置特定的固定 IP 地址?

Posted

技术标签:

【中文标题】创建 docker 机器或容器时如何设置特定的固定 IP 地址?【英文标题】:How to set a specific fixed IP address when I create a docker machine or container? 【发布时间】:2015-06-23 23:56:12 【问题描述】:

创建容器时,我想在同一个局域网中设置特定容器的 IP 地址。

这可能吗?如果没有,创建后可以修改DHCP IP地址吗?

【问题讨论】:

看看选项--net=host 用于docker daemon 启动选项docs.docker.com/articles/networking/#container-networking --net=host 给我与我的主机相同的网络,但我想在另一个容器的同一个 LAN 上设置一个特定的 ip,如 176.17.0.18。感谢回复 我刚刚编辑了my answer below,添加了两个有趣的解决方法,允许您为每台 docker 机器指定一个固定的 IP 地址。 我给了这个here的答案 【参考方案1】:

考虑到(现在是 2013 年 10 月)文章“How to configure Docker to start containers on a specific IP address range”的结论,这似乎还不可能(或至少“由 Docker 自动为您完成”) .


2015 年 11 月更新:docker/machine issue 1709 中讨论了类似的问题,其中包括 Tobias Munk (schmunk42) 为 docker machine 提出的 recent workaround (Nov 2015) (容器见下一节):

针对某些用例的解决方法可能是创建如下机器:

192.168.98.100

docker-machine create -d virtualbox --virtualbox-hostonly-cidr "192.168.98.1/24" m98

192.168.97.100

docker-machine create -d virtualbox --virtualbox-hostonly-cidr "192.168.97.1/24" m97

192.168.96.100

docker-machine create -d virtualbox --virtualbox-hostonly-cidr "192.168.96.1/24" m96

如果没有其他机器具有相同的cidr (Classless Inter-Domain Routing),则该机器在启动时应始终获得.100 IP。

另一种解决方法

(在“How do I create a docker machine with a specific URL using docker-machine and VirtualBox?”中查看我的脚本)

我的 virtualbox 的 dhcp 范围是 192.168.99.100 - 255,我想在 100 之前设置一个 IP。

我发现了一个设置静态 IP 的简单技巧:创建机器后,我运行此命令并重新启动机器:

echo "ifconfig eth1 192.168.99.50 netmask 255.255.255.0 broadcast 192.168.99.255 up" \
| docker-machine ssh prova-discovery sudo tee /var/lib/boot2docker/bootsync.sh > /dev/null 

此命令创建一个文件bootsync.sh,由boot2docker启动脚本搜索并执行。

现在在机器启动期间执行命令并设置静态 IP。

docker-machine ls
NAME              ACTIVE   DRIVER       STATE     URL                                      SWARM
test-1                      -        virtualbox     Running   tcp://192.168.99.50:2376      test-1 (mast

Michele Tedeschi (micheletedeschi)adds

我已经更新了命令:

echo "kill `more /var/run/udhcpc.eth1.pid`\nifconfig eth1 192.168.99.50 netmask 255.255.255.0 broadcast 192.168.99.255 up" | docker-machine ssh prova-discovery sudo tee /var/lib/boot2docker/bootsync.sh > /dev/null

然后运行命令(仅第一次)

docker-machine regenerate-certs prova-discovery

现在 DHCP 不会更改 IP

(将 prova-discovery 替换为您的 docker 机器的名称)


2015 年 4 月:

文章提到了 create your own bridge 的可能性(但这并没有将其中一个 IP 地址分配给容器):

创建自己的网桥,使用固定地址配置它,告诉 Docker 使用它。完成。

如果您手动执行,它将如下所示(在 Ubuntu 上):

stop docker
ip link add br0 type bridge
ip addr add 172.30.1.1/20 dev br0
ip link set br0 up
docker -d -b br0

要在现有网桥 IP 范围内分配静态 IP,您可以尝试“How can I set a static IP address in a Docker container?”,使用创建网桥和一对对等接口的静态脚本。

2015 年 7 月更新:

上面提到的想法也在“How can I set a static IP address in a Docker container?”中详述:

Building your own bridge

结果应该是 Docker 服务器启动成功,现在准备将容器绑定到新的网桥。 暂停以验证网桥的配置后,尝试创建一个容器——您会看到它的 IP 地址在您的新 IP 地址范围内,Docker 将自动检测到该范围。

您可以在启动和停止容器时使用brctl show 命令查看 Docker 在桥接器中添加和删除接口,并且可以在容器内运行 ip addr 和 ip route 以查看它是否已在网桥的 IP 地址范围,并被告知使用网桥上 Docker 主机的 IP 地址作为其通往 Internet 其余部分的默认网关。

使用以下命令启动 docker:-b=br0(这也是 echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker 默认为您设置的)

使用pipework(以下192.168.1.1为默认网关ip地址):

pipework br0 container-name 192.168.1.10/24@192.168.1.1

【讨论】:

您基于的链接已过时。 @SergeyMNikitin 我已经更新了答案并明确表示第一个链接已过时。

以上是关于创建 docker 机器或容器时如何设置特定的固定 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章

docker容器设置固定IP

docker镜像为啥有自己的ip

Docker 设置固定网络IP

开发人员如何理解kubernetes

通过pipework来固定Docker容器IP

docker 创建容器时指定容器ip