一、docker0 是本机器在docker 内的Namespace
通过追踪docker0,我们解决如下两个问题:
- 我们通过多个容器是如何互连的?
- 单个容器是如何访问外网的 ?
1、创建一个 container
docker run -d --name test1 com/library/busybox /bin/sh /bin/sh -c "while true; do sleep 3600; done"
2、查看 docker 的网络情况: docker network ls
3、查看 test1 的网络是连接到那种 driver 上的: docker network inspect [ bridge 的 network_id]
输出中包含了 containers , 其中包含了 Name 为 test1 和 test2
4、查看 container的network : ip a
- docker0 是本机器 在docker 内的Namespace
- docker0 下的 test1 的Namespace 为虚拟的 是 以 veth 开头的
5、查看 test1 和test2的网络
- docker exec test1 ip a 可以看出eth0@if33 和 veth34bd270@if32是一对
- docker exec test2 ip a 可以看出 eth0@if37 和 vethfef8006@if36是一对
- 并且 veth34bd270@if32 和 vethfef8006@if36 是连到了 docker0 上
6、验证 veth85d9927@if5 是连到了 docker0 上
安装验证工具 bridge-utils: yum install bridge-utils
使用 brctl show
interfaces 的 数值 刚好与 container test1 的对外接口 对应上
说明 container test1 的对外接口 是通过 docker0 桥接出去的
7、桥接网络图
8、容器是如何访问外网的 ?
answer:通过 NAT 技术 查询 ip tables 然后访问的
二、手动创建bridge
2.1、bridge 的 创建
- 创建 driver 为 bridge 的网络:docker network create -d bridge my-bridge
- 查看创建的网络 :docker network ls
- 查看桥接方式: brctl show
2.2、指定的连接的网络
- 创建 容器 指定网络 为新创建的网络
docker run -d --name test3 --network my-bridge hub.c.163.com/library/busybox /bin/sh -c "while true; do sleep 3600; done"
- 查看 创建的网络 是否有新的 interfaces:docker exec test2 ip a
brctl show 或使用 docker network inspect my-bridge 查看
2.3、将test1 和 test2 link 到 my-bridge 上
连接语法: docker network connect [network_name] [container_name]
docker network connect my-bridge test1
- 验证是否连接上:
docker network inspect my-bridge 此时里面的 containers 是否包含 test1 和 test3
docker network inspect bridge 此时到container 内 也包含了 test1 和 test2
此时在 test1 容器内ping test2 和 test3 的 ip 地址是通的:docker exec -it test1 /bin/sh
此时在 test2容器内ping test3 的 ip 地址是不通的:docker exec -it test2 /bin/sh
2.4、用户创建的 network (eg:my-bridge) 内 是可以使用 ping [container_name]
默认使用了docker link,参考文章:Docker网络之容器间关联docker link