我想通过在我的networking上分配静态IP地址来configurationDocker容器,使其看起来像一个真正的系统。
目前我在主机上有一个networking桥接设置(br0)。 我在/etc/default/docker文件中configuration了DOCKER_OPTS="-b=br0" 。 我可以通过他们的/etc/network/interface文件为每个容器分配静态地址。
问题是Docker将继续自行分配IP地址。 (如何阻止这个?)更麻烦的是它现在将使用桥接networking的IPscheme。 这将导致networking问题,因为它可以/将分配已经在networking上使用的地址。
问题:
networking挂起/暂停
Pinging容器时的回应地址可以改变。
Error messages such as this are seen in the logs of the host: kernel: [31912.876161] br0: port 3(vethb228701) entered disabled state kernel: [31913.441517] device veth122d9f8 left promiscuous mode kernel: [22491.609856] audit: type=1400 audit(1434148604.621:124): apparmor="DENIED" operation="getattr" info="Failed name lookup - disconnected path" error=-13 profile="/usr/sbin/ntpd" name="var/lib/docker/aufs/diff/eb00895db3d297979df741cd560ccbea2ab4d572264bd703fc6cbc7ea2acb5c4/usr/lib" pid=30955 comm="ntpd" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
Docker也为容器分配与我的networking相同的子网地址。 起初,我只是简单地在容器的/etc/hosts文件中添加一行。 它做什么,但即使删除它仍然看到问题。
例:
root@myhostname:/# cat /etc/hosts XX192.3 myhostname.mydomain.com myhostname 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters root@myhostname:/# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:09:1a:c0:03 inet addr:XXXX Bcast:XXXX Mask:255.255.252.0 inet6 addr: fe80::42:9ff:fe1a:c003/64 Scope:Link UP BROADCAST RUNNING MTU:1500 Metric:1 RX packets:231 errors:0 dropped:26 overruns:0 frame:0 TX packets:46 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:23719 (23.7 KB) TX bytes:3960 (3.9 KB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
如果没有通过命令行(-h)分配主机名来启动容器,则将使用随机分配的主机名
环境:
Host: OS: Ubuntu 14.04.2 Arch: PPC64LE Kernel: 3.16.0-30 docker version : Client version: 1.4.1-dev Client API version: 1.17 Go version (client): gccgo (GCC) 5.0.0 20150118 (experimental) Git commit (client): 7294f26 OS/Arch (client): linux/ppc64le Server version: 1.4.1-dev Server API version: 1.17 Go version (server): gccgo (GCC) 5.0.0 20150118 (experimental) Git commit (server): 7294f26
硬件:
IBM Power 8, 8247-22L CPUs: 192 Memory: 512GB
集装箱:
OS: Ubuntu 14.04.2 Arch: PPC64LE Kernel: 3.16.0-30
networking:
brctl show bridge name bridge id STP enabled interfaces br0 8000.6cae8b6aaf64 no eth0 br0 Link encap:Ethernet HWaddr 6c:ae:8b:6a:af:64 inet addr:XXXX Bcast: XXXX Mask:255.255.252.0 inet6 addr: fe80::6eae:8bff:fe6a:af64/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6750867 errors:0 dropped:80 overruns:0 frame:0 TX packets:1586308 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1049658934 (1.0 GB) TX bytes:6936734104 (6.9 GB) eth0 Link encap:Ethernet HWaddr 6c:ae:8b:6a:af:64 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:7155242 errors:0 dropped:7598 overruns:0 frame:0 TX packets:6347549 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1212526214 (1.2 GB) TX bytes:7339350703 (7.3 GB) Interrupt:249 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:238 errors:0 dropped:0 overruns:0 frame:0 TX packets:238 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:22564 (22.5 KB) TX bytes:22564 (22.5 KB)
前段时间我也试图解决这个问题。 我无法find一种方法来改变docker工人的IP分配行为,而不禁用整个networkingfunction( --net=none )。 因此,我将一个迄今未使用的子网分配给了docker bridge接口,并让docker完成了这个任务。 我还编写了一个守护进程,监听某些docker API事件,然后将dynamic更新推送到我们的DNS服务器,所以我不必关心IP,并可以通过名称来寻址容器。
这里是DNS守护进程的github回购。 https://github.com/cschritt/docker-dns-daemon我会推动我的最新变化和一些重构。
不幸的是,似乎没有办法阻止Docker在网桥模式下将IP地址分配给容器。 作为解决方法,我将pre-up ip addr flush dev eth0到/etc/network/interface ,以便按照此处所述closuresDocker的IP地址。 这是一个例子,它是如何完成的:
auto eth0 iface eth0 inet static pre-up ip addr flush dev eth0 address 192.168.0.249 netmask 255.255.255.0 gateway 192.168.0.1
当Docker将自己的不正确/重写的IP地址注入到容器的/etc/hosts文件中时,这种方法的注意事项是使用多个容器。 我发现解决这个问题的唯一方法是安装inotify-tools软件包,运行下面的脚本,在Docker改变它之后立即将/etc/hosts恢复到预定义的状态:
#!/bin/sh while /usr/bin/inotifywait -e close /etc/hosts; do cp -v /etc/hosts.orig /etc/hosts done
以上脚本要求您将有效的/etc/hosts.orig文件添加到容器中。
从Docker 1.10开始 ,设置为在未来几天内发布,你可以在启动你的容器时明确地指定一个静态IP地址,带--ip6=和--ip6= options,分别指定IPv4和IPv6地址。 这些可以与docker run和docker network connect一起使用,只要容器存在就可以持续docker run 。