3.2 查看宿主机网络环境:
$ ip a
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:7d:a8:0b:18 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
6: veth0c0140e@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 4a:35:f2:f8:7a:e6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::4835:f2ff:fef8:7ae6/64 scope link
8: veth205c19e@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether a2:3b:b5:d1:cd:56 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::a03b:b5ff:fed1:cd56/64 scope link
说明:
①. docker0是Docker服务默认会创建一个docker0网桥(其上有一个 docker0内部接口),它在内核层连通了其它的物理或虚拟网卡,可以将所有容器和本地主机都放到同一个物理网络.
②. Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信,还给出了MTU(接口允许接收的最大传输单元),通常是1500 Bytes,或宿主主机网络路由上支持的默认值.
③. 宿主机上查看除了本机网卡还有4端口docker0、6端口veth0c0140e、8端口veth205c19e.
3.3 查看test1容器中的网络环境:
$ docker exec -it test1 /bin/sh
# ip a
......
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
3.4 查看bridge信息:
$ apt-get install -y bridge-utils
$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02427da80b18 no veth0c0140e
veth205c19e
3.5 说明:
container要怎样连到docker的bridge上面(docker0端口)?
①. docker0的namespace是宿主机的.宿主机的6端口veth0c0140e是负责连到docker0上面的.
②. test1容器也有自己的namesapce.这两个namespace要连在一起需要一对veth pair,而test1容器的5端口eth0@if6与宿主机的6端口veth0c0140e是一对.通过这一对veth pair就可以连接到了宿主机docker0上面.
如图:
①. 两个container各有一对veth pair(单独的namespace),通过连接在docker0 bridge(宿主机的namespace).
②. 类似两台真实机器通过路由器或交换机进行局域网连接在一起.
③. docker容器可以访问internet,是做了NAT,将docker的数据包发给了宿主机,再转发出去.