一、 docker0 是本机器在docker 内的Namespace
通过追踪docker0,我们解决如下两个问题:
我们通过多个容器是如何互连的?
单个容器是如何访问外网的 ?
1.1 创建一个 container
docker run -d --name test1 com/library/busybox /bin/sh /bin/sh -c “while true; do sleep 3600; done”
1.2 查看 docker 的网络情况
docker network ls
1.3 查看容器的网络
查看 test1 的网络是连接到那种 driver 上的:docker network inspect [ bridge 的 network_id]
输出中包含了 containers , 其中包含了 Name 为 test1 和 test2
1.4 查看 container的network
查看命令:ip a
docker0 是本机器 在docker 内的Namespace
docker0 下的 test1 的Namespace 为虚拟的 是 以 veth 开头的
1.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 上
1.6 验证veth85d9927@if5是连到了 docker0 上
安装验证工具 bridge-utils: yum install bridge-utils
使用 brctl show
interfaces 的 数值 刚好与 container test1 的对外接口 对应上
说明 container test1 的对外接口 是通过 docker0 桥接出去的
1.7 桥接网络图
1.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
用户创建的 network (eg:my-bridge) 内 是可以使用 ping [container_name]
默认使用了docker link。
三、 Docker网络之容器间关联docker link
案例:使用 link 关联后台与数据库
3.1 创建 test1 容器
docker run -d --name test1 hub.c.163.com/library/busybox /bin/sh -c “while true; do sleep 3600; done”
docker exec test1 ip a
3.2 创建 test2 并关联到 test1 上
docker run -d --name test2 --link test1 hub.c.163.com/library/busybox /bin/sh -c “while true; do sleep 3600; done”
3.3 进入test2 容器内
docker exec -it test2 /bin/sh
可以使用 ping test1 即可访问 test1
如果test1是 mysql 服务 可以使用 test1:3306 即可访问数据库
3.4 论证link链接是单向




