列出当前主机网桥
[AppleScript] 纯文本查看 复制代码
|
1
2
3
|
$ sudo brctl show # brctl 工具依赖 bridge-utils 软件包 bridge name bridge id STP enabled interfacesdocker0 8000.000000000000 no |
5.3 查看当前 docker0 ip
[AppleScript] 纯文本查看 复制代码
|
1
2
3
4
5
|
$ sudo ifconfig docker0docker0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xxinet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 |
在容器运行时,每个容器都会分配一个特定的虚拟机口并桥接到 docker0。
每个容器都会配置同 docker0 ip 相同网段的专用 ip 地址,docker0 的 IP 地址被用于所有容器的默认网关。
5.4 运行一个容器
[AppleScript] 纯文本查看 复制代码
|
1
2
3
4
5
6
7
8
9
|
$ sudo docker run -t -i -d ubuntu /bin/bash52f811c5d3d69edddefc75aff5a4525fc8ba8bcfa1818132f9dc7d4f7c7e78b4$ sudo brctl showbridge name bridge id STP enabled interfacesdocker0 8000.fef213db5a66 no vethQCDY1N |
以上, docker0 扮演着 52f811c5d3d6 container 这个容器的虚拟接口 vethQCDY1N interface 桥接的角色。
使用特定范围的 IP
Docker 会尝试寻找没有被主机使用的 ip 段,尽管它适用于大多数情况下,但是它不是万能的,有时候我们还是需要对 ip 进一步规划。
Docker 允许你管理 docker0 桥接或者通过-b选项自定义桥接网卡,需要安装bridge-utils软件包。
基本步骤如下:
ensure Docker is stopped # 确保 docker 的进程是停止的
create your own bridge (bridge0 for example) # 创建自定义网桥
assign a specific IP to this bridge # 给网桥分配特定的 ip
start Docker with the -b=bridge0 parameter # 以 -b 的方式指定网桥
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# Stopping Docker and removing docker0 $ sudo service docker stop $ sudo ip link set dev docker0 down$ sudo brctl delbr docker0$ sudo brctl addbr bridge0$ sudo ip addr add 192.168.5.1/24 dev bridge0$ sudo ip link set dev bridge0 up # 确认我们的桥正在运行$ ip addr show bridge0bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff inet 192.168.5.1/24 scope global bridge0# Tell Docker about it and restart (on Ubuntu) $ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker $ sudo service docker start |
5.5 不同主机间容器通信
安装相应依赖软件
桥接网络
不同容器之间的通信可以借助于 pipework 这个工具:
[AppleScript] 纯文本查看 复制代码
|
1
2
3
|
$ git clone [url=https://github.com/jpetazzo/pipework.git]https://github.com/jpetazzo/pipework.git[/url]$ sudo cp -rp pipework/pipework /usr/local/bin/ |
安装相应依赖软件
[AppleScript] 纯文本查看 复制代码
|
1
|
$ sudo apt-get install iputils-arping bridge-utils -y |
桥接网络
[AppleScript] 纯文本查看 复制代码
|
1
2
3
4
5
6
7
|
# brctl showbridge name bridge id STP enabled interfacesbr0 8000.000c291412cd no eth0docker0 8000.56847afe9799 no vetheb48029 |
可以删除 docker0,直接把 docker 的桥接指定为 br0。
也可以保留使用默认的配置,这样单主机容器之间的通信可以通过 docker0,而跨主机不同容器之间通
过 pipework 新建 docker 容器的网卡桥接到 br0,这样跨主机容器之间就可以通信了。
· ubuntu
[AppleScript] 纯文本查看 复制代码
|
1
2
3
4
5
6
7
8
9
|
$ sudo service docker stop$ sudo ip link set dev docker0 down$ sudo brctl delbr docker0$ echo 'DOCKER_OPTS="-b=br0"' >> /etc/default/docker$ sudo service docker start |
· CentOS 7/RHEL 7
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
|
$ sudo systemctl stop docker$ sudo ip link set dev docker0 down$ sudo brctl delbr docker0$ cat /etc/sysconfig/docker | grep 'OPTIONS='OPTIONS=--selinux-enabled -b=br0 -H fd://$ sudo systemctl start docker |
pipework
不同容器之间的通信可以借助于 pipework 这个工具给 docker 容器新建虚拟网卡并绑定 IP 桥接到 br0
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
$ git clone [url=https://github.com/jpetazzo/pipework.git]https://github.com/jpetazzo/pipework.git[/url]$ sudo cp -rp pipework/pipework /usr/local/bin/$ pipeworkSyntax:pipework <hostinterface> [-i containerinterface] <guest> <ipaddr>/<subnet>[@default_gateway] [macaddr][@vlan]pipework <hostinterface> [-i containerinterface] <guest> dhcp [macaddr][@vlan]pipework --wait [-i containerinterface] |
如果删除了默认的 docker0 桥接,把 docker 默认桥接指定到了 br0,则最好在创建容器的时候加上--net=none,防止自动分配的 IP 在局域网中有冲突。
[AppleScript] 纯文本查看 复制代码
|
1
2
3
4
5
6
7
8
9
|
$ sudo docker run --rm -ti --net=none ubuntu:14.04 /bin/bash$ sudo docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa46657528059 ubuntu:14.04 "/bin/bash" 4 minutes ago Up 4 minutes hungry_lalande$ sudo pipework br0 -i eth0 a46657528059 192.168.115.10/24@192.168.115.2 |
# 默认不指定网卡设备名,则默认添加为 eth1
# 另外 pipework 不能添加静态路由,如果有需求则可以在 run 的时候加上 --privileged=true 权限在容器中手动添加,
# 但这种安全性有缺陷,可以通过 ip netns 操作
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
[email protected]46657528059:/# ifconfig eth0eth0 Link encap:Ethernet HWaddr 86:b6:6b:e8:2e:4d inet addr:192.168.115.10 Bcast:0.0.0.0 Mask:255.255.255.0 inet6 addr: fe80::84b6:6bff:fee8:2e4d/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:648 (648.0 B) TX bytes:690 (690.0 B) |
[AppleScript] 纯文本查看 复制代码
|
1
2
3
4
5
6
7
8
9
|
[email protected]46657528059:/# route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 192.168.115.2 0.0.0.0 UG 0 0 0 eth0192.168.115.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 |
使用ip netns添加静态路由,避免创建容器使用--privileged=true选项造成一些不必要的安全问题:
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
|
$ docker inspect --format="{{ .State.Pid }}" a46657528059 # 获取指定容器 pid6350$ sudo ln -s /proc/6350/ns/net /var/run/netns/6350$ sudo ip netns exec 6350 ip route add 192.168.0.0/16 dev eth0 via 192.168.115.2$ sudo ip netns exec 6350 ip route # 添加成功192.168.0.0/16 via 192.168.115.2 dev eth0 |
在其它宿主机进行相应的配置,新建容器并使用 pipework 添加虚拟网卡桥接到 br0,测试通信情况即可。