在默认安装情况下, Docker 会在宿主机上创建一个名为 docker0 的 Linux 网桥设备。该网
桥设备拥有一个私有网络地址及其所属子网。
分配给 docker0 网桥的子网地址为
- 172.[17-31].42.1/16
- 10.[0-255].42.1/16
- 192.168.[42-44].1/24
中第一个没有被占用的子网地址。因此,很多时候你的 docker0 网桥设备的地址都是 172.17.42.1。所有容器都会连接到该网桥设备上,并从中分配一个位于子网 172.17.42.0/16 中的 IP 地址。容器链接到网桥的网络接口会把 docker0 网络设备作为网关。
创建新容器时, Docker 会创建一对网络设备接口,并将它们放到两个独立的网络命名空间:一个网络设备放到容器的网络命名空间(即 eth0);另一个网络设备放到宿主机的网络命名空间,并连接到 docker0 网桥设备上。
通过Pipework理解容器网络
Pipework 能实现的功能几乎都内置在 Docker 中了,但是 Pipework 工具可以对 Docker 网络进行逆向工程。以便更深入了解容器之间以及容器与外部之间是如何通信的。
1、启动容器,并下载pipework
2、--net=none 选项启动一个不带网络功能的容器
root@foobar-server:~# docker run -it --rm --net none --name cookbook ubuntu:14.04 bash
这个容器只有一个本地环回设备,没有其他网络设备,也没有路由信息。如果需要和外部通信,只能手动进行设置。
pipework脚本可以帮我们做这件事情。
3、使用 Pipework 来创建一个完整的网络
root@foobar-server:/vagrant# ./pipework br0 nettest 192.168.1.10/24@192.168.1.254 Warning: arping not found; interface may not be immediately reachable
此时在容器中已经可以看到eth1 设备已启用,并且路由信息已经设置好。
这条命令完成如下四个步骤
• 在宿主机上创建网桥设备 br0。
• 分配 IP 地址 192.168.1.254。
• 在容器内部创建一个网络接口,并为其分配 IP 地址 192.168.1.10。
• 最后在容器内部添加路由信息,将网桥设置为默认网关。
4、查看该 Docker 主机上的网络设备列表
除了默认的 docker0 网桥设备,还会看到多出来一个 br0 设备
root@foobar-server:/vagrant# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000 link/ether 08:00:27:5f:bb:e6 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe5f:bbe6/64 scope link valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 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 4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 62:c5:12:b3:dc:2f brd ff:ff:ff:ff:ff:ff inet6 fe80::f011:baff:fe81:370c/64 scope link valid_lft forever preferred_lft forever 6: veth1pl7218: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000 link/ether 62:c5:12:b3:dc:2f brd ff:ff:ff:ff:ff:ff inet6 fe80::60c5:12ff:feb3:dc2f/64 scope link valid_lft forever preferred_lft forever root@foobar-server:/vagrant#
5、 查看网桥信息
bridge-utils 软件包的 brctl 命令
下面胡原始股由 pipework 创建并连接到 br0 的虚拟以太网接口
此时宿主机上就可以访问容器。也可以在容器内访问其他容器了
6、如何访问宿主机之外的网络?
缺少NAT 地址转换规则,而这个 NAT 地址转换(伪装)规则在默认情况下会由 Docker 自动添加。在Docker 宿主机上添加相应的 iptables 规则
添加NAT规则
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE
访问外网