Static docker具有静态地址的多个容器

Static docker具有静态地址的多个容器,static,ip,docker,Static,Ip,Docker,我正在从事一个通常用虚拟机实现的项目。但是我想用docker容器来代替,以便练习和学习新的东西 所以我想做的是:创建几个运行在同一台主机上的容器,使用静态ip地址,彼此连接(但不一定连接到外部世界)。 换句话说,我想模拟一种独立的网络,由连接到同一交换机的多台计算机组成 我试图更改容器中的/etc/network/interfaces来设置eth0、docker0等的静态ip地址。。。但它不会以任何方式影响系统。我试图使用--net=host,-cap add=net\u ADMIN,但没有用

我正在从事一个通常用虚拟机实现的项目。但是我想用docker容器来代替,以便练习和学习新的东西

所以我想做的是:创建几个运行在同一台主机上的容器,使用静态ip地址,彼此连接(但不一定连接到外部世界)。 换句话说,我想模拟一种独立的网络,由连接到同一交换机的多台计算机组成

我试图更改容器中的/etc/network/interfaces来设置eth0、docker0等的静态ip地址。。。但它不会以任何方式影响系统。我试图使用--net=host,-cap add=net\u ADMIN,但没有用

这快把我逼疯了。求救! 谢谢

编辑: 重要的事情我没有说:我正在使用我的MacBookAir,我正在运行boot2docker(它创建了一个运行docker的VM)。 当我使用“docker run-I-t ubuntu/bin/bash”运行映像时,我没有docker 0作为接口:在容器中运行“ip a”只显示lo和eth0。

为什么要尝试
--net=host
?此选项完全禁用网络隔离,并在默认网络命名空间中运行容器。这意味着docker容器可以看到所有主机网络接口。我认为这不是你的选择

有一点很重要,那就是docker如何处理孤立的网络。首先,它创建名为
docker0
(至少在默认情况下)的桥。每次使用隔离网络启动容器时(即,没有
--net=host
),docker都会创建一对
veth
接口。docker提供给容器的一个接口(如果您在容器中运行
ip链接列表
,您将看到这个虚拟接口)。另一个docker插入bridge
docker0
(顺便说一句,您可以通过向docker守护进程传递“-b${bridge}”选项来确定要使用哪个网桥)

我建议你阅读和阅读

尝试使用隔离网络运行容器,然后分配您喜欢的静态IP。但要注意路由——主机必须有到子网的路由,您的容器在子网中运行。最简单的方法(也是对我来说唯一合适的方法)-将容器IP从docker网桥的同一子网分配给您

下面的例子对我很有用

user@host$ ip addr
docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::5484:7aff:fefe:9799/64 scope link 
       valid_lft forever preferred_lft forever

root@docker-1# ip addr
eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever


root@docker-2# ip addr
eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:5/64 scope link 
       valid_lft forever preferred_lft forever
user@host$ip地址
docker0:mtu 1500 qdisc noqueue state UP组默认值
链接/以太56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16范围全局docker0
永远有效\u lft首选\u lft永远有效
inet6 fe80::5484:7aff:fefe:9799/64范围链接
永远有效\u lft首选\u lft永远有效
root@docker-1#ip地址
eth0:mtu 1500 qdisc pfifo_快速状态上限组默认qlen 1000
链接/以太02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16范围全局eth0
永远有效\u lft首选\u lft永远有效
inet6 fe80::42:acff:fe11:2/64范围链接
永远有效\u lft首选\u lft永远有效
root@docker-2#ip地址
eth0:mtu 1500 qdisc pfifo_快速状态上限组默认qlen 1000
链接/以太02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16范围全局eth0
永远有效\u lft首选\u lft永远有效
inet6 fe80::42:acff:fe11:5/64范围链接
永远有效\u lft首选\u lft永远有效

哦,是的,您是如何尝试将IP分配给您的容器的?仅仅修改
/etc/network/interfaces
将不起作用,因为没有人可以为您应用此配置。容器启动后,您应该使用
ifdown
ifup
工具根据您的配置配置界面。嗨,Viacheslav,感谢您这么快的回答。所以我尝试了-net=host,因为到目前为止我所做的一切都不起作用,所以我尝试了我发现的一切,包括这个。让我们看看你建议我写的那些文章。感谢使用/etc/network/interfaces:auto-lo-iface-lo-inet环回auto-eth0允许热插拔eth0-iface-eth0-inet静态地址10.0.2.50网络掩码255.255.255.0网关10.0.2.100广播10.0.2.255,但使用“ifdown-eth0”给出:“ifdown:interface-eth0未配置”。我不明白,因为容器中的“ip a”为eth0提供了“inet 172.17.0.3/16 scope global eth0”(与docker0无关…),是的,我错了。ifdown不会取消此接口的配置,因为接口是由docker配置的,而不是
ifup
。您可以只运行
ifup eth0
。之后,eth0将有两个ip地址。您还可以使用
IP addr del${old_address}dev eth0
删除旧的IP地址,谢谢您的提示。所以我尝试了ifup,但我得到了与前几天相同的错误:root@758da37c06e7:/#ifup eth0 RTNETLINK回答:不允许的操作无法启动eth0。//我在尝试时遇到相同的错误“RTNETLINK回答:不允许操作”root@758da37c06e7:/#ip地址del 172.17.0.4/16 dev eth0 RTNETLINK回答:不允许操作“之前”。