提问者:小点点

如何在Docker容器中设置静态IP地址?


我非常满意docker默认为我提供的IP范围176.17。x、 x,所以我不需要创建新的网桥,我只想给我的容器一个该范围内的静态地址,这样我就可以直接将客户端浏览器指向它。我试着用

RUN echo "auto eth0" >> /etc/network/interfaces
RUN echo "iface eth0 inet static" >> /etc/network/interfaces
RUN echo "address 176.17.0.250" >> /etc/network/interfaces
RUN echo "netmask 255.255.0.0" >> /etc/network/interfaces
RUN ifdown eth0
RUN ifup eth0

它正确地填充了接口文件,但是接口本身没有改变。事实上,在容器中运行ifup eth0会出现以下错误:

RTNETLINK回答:不允许的操作无法启动eth0


共3个答案

匿名用户

我在这里已经回答了这个问题https://stackoverflow.com/a/35359185/4094678但我现在看到这个问题实际上比前面提到的问题更老,所以我也将复制答案:

使用Docker 1.10版很容易。1,构建9e83765。

首先,您需要创建自己的docker网络(mynet123)

docker network create --subnet=172.18.0.0/16 mynet123

而不是简单地运行图像(我将以ubuntu为例)

docker run --net mynet123 --ip 172.18.0.22 -it ubuntu bash

然后在ubuntu外壳中

ip addr

此外,您可以使用
--host name来指定主机名
--add-host来添加更多条目到/etc/host

文档(以及为什么需要创建网络)在https://docs.docker.com/engine/reference/commandline/network_create/

匿名用户

我使用的是Docker官方文档中所述的方法,我已确认该方法有效:

# At one shell, start a container and
# leave its shell idle and running

$ sudo docker run -i -t --rm --net=none base /bin/bash
root@63f36fc01b5f:/#

# At another shell, learn the container process ID
# and create its namespace entry in /var/run/netns/
# for the "ip netns" command we will be using below

$ sudo docker inspect -f '{{.State.Pid}}' 63f36fc01b5f
2778
$ pid=2778
$ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid

# Check the bridge's IP address and netmask

$ ip addr show docker0
21: docker0: ...
inet 172.17.42.1/16 scope global docker0
...

# Create a pair of "peer" interfaces A and B,
# bind the A end to the bridge, and bring it up

$ sudo ip link add A type veth peer name B
$ sudo brctl addif docker0 A
$ sudo ip link set A up

# Place B inside the container's network namespace,
# rename to eth0, and activate it with a free IP

$ sudo ip link set B netns $pid
$ sudo ip netns exec $pid ip link set dev B name eth0
$ sudo ip netns exec $pid ip link set eth0 up
$ sudo ip netns exec $pid ip addr add 172.17.42.99/16 dev eth0
$ sudo ip netns exec $pid ip route add default via 172.17.42.1

使用这种方法,我运行我的容器总是net=no,并使用外部脚本设置IP地址。

匿名用户

事实上,尽管我的初始故障,@MarkO'Connor的答案是正确的。我在我的主机 /etc/network/interfaces文件中创建了一个新接口(docker0),在主机上运行sudo ifup docker0,然后运行

docker run --net=host -i -t ... 

它获取静态IP并将其分配给容器中的docker0。

谢谢!