--Docker学习进阶--中篇
列出当前主机网桥
[AppleScript] 纯文本查看 复制代码
1
2
3
|
$ sudo brctl show # brctl 工具依赖 bridge-utils 软件包 bridge name bridge id STP enabled interfaces docker 0 8000.0 00000000000 no |
5.3 查看当前 docker0 ip
[AppleScript] 纯文本查看 复制代码
1
2
3
4
5
|
$ sudo ifconfig docker 0 docker 0 Link encap : Ethernet HWaddr xx : xx : xx : xx : xx : xx inet addr : 172.1 7.4 2.1 Bcast : 0.0 . 0.0 Mask : 255.2 55.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 / bash 52 f 811 c 5 d 3 d 69 edddefc 75 aff 5 a 4525 fc 8 ba 8 bcfa 1818132 f 9 dc 7 d 4 f 7 c 7 e 78 b 4 $ sudo brctl show bridge name bridge id STP enabled interfaces docker 0 8000. fef 213 db 5 a 66 no vethQCDY 1 N |
以上, 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 docker 0 down $ sudo brctl delbr docker 0 $ sudo brctl addbr bridge 0 $ sudo ip addr add 192.1 68.5 . 1 / 24 dev bridge 0 $ sudo ip link set dev bridge 0 up # 确认我们的桥正在运行 $ ip addr show bridge 0 bridge 0 : < BROADCAST , MULTICAST > mtu 1500 qdisc noop state UP group default link / ether 66 : 38 : d 0 : 0 d : 76 : 18 brd ff : ff : ff : ff : ff : ff inet 192.1 68.5 . 1 / 24 scope global bridge 0 # 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 show bridge name bridge id STP enabled interfaces br 0 8000.0 00 c 291412 cd no eth 0 docker 0 8000.5 6847 afe 9799 no vetheb 48029 |
可以删除 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 docker 0 down $ sudo brctl delbr docker 0 $ 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 docker 0 down $ sudo brctl delbr docker 0 $ 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 / $ pipework Syntax : 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 ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a 46657528059 ubuntu : 14.0 4 "/bin/bash" 4 minutes ago Up 4 minutes hungry_lalande $ sudo pipework br 0 - i eth 0 a 46657528059 192.1 68.1 15.1 0 / 24 @ 192.1 68.1 15.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 eth0 eth 0 Link encap : Ethernet HWaddr 86 : b 6 : 6 b : e 8 : 2 e : 4 d inet addr : 192.1 68.1 15.1 0 Bcast : 0.0 . 0.0 Mask : 255.2 55.2 55.0 inet 6 addr : fe 80 : : 84 b 6 : 6 bff : fee 8 : 2 e 4 d / 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 -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0 . 0.0 192.1 68.1 15.2 0.0 . 0.0 UG 0 0 0 eth 0 192.1 68.1 15.0 0.0 . 0.0 255.2 55.2 55.0 U 0 0 0 eth 0 |
使用ip netns添加静态路由,避免创建容器使用--privileged=true选项造成一些不必要的安全问题:
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
|
$ docker inspect --format="{{ .State.Pid }}" a46657528059 # 获取指定容器 pid 6350 $ sudo ln - s / proc / 6350 / ns / net / var / run / netns / 6350 $ sudo ip netns exec 6350 ip route add 192.1 68.0 . 0 / 16 dev eth 0 via 192.1 68.1 15.2 $ sudo ip netns exec 6350 ip route # 添加成功 192.1 68.0 . 0 / 16 via 192.1 68.1 15.2 dev eth 0 |
在其它宿主机进行相应的配置,新建容器并使用 pipework 添加虚拟网卡桥接到 br0,测试通信情况即可。