文章目录
初识Docker网络
1.启动测试容器
# 在不指定网络配置时,默认使用 bridge 模式,可以使用 docker network ls 查看网络模式
docker run -d -P --name mytomcat01 fe38b6185261
docker run -d -P --name mytomcat02 fe38b6185261
2.查看网配置
ip a
3.测试连通性
# 两个容器之间测试连通性
docker exec -it mytomcat02 ip a # 查看ip地址
docker exec -it mytomcat01 ping 172.17.0.3 # ping 对应地址
4.原理图
Docker 网络默认情况下使用 bridge 模式,所以在 mytomcat01 ping mytomcat02 时实际是通过 Docker0 桥接
veth设备的特点
- veth和其它的网络设备都一样,一端连接的是内核协议栈。
- veth设备是成对出现的,另一端两个设备彼此相连
- 一个设备收到协议栈的数据发送请求后,会将数据发送到另一个设备上去。
5.–link (不推荐使用,了解即可)
通过容器服务名称 ping 通容器,这样在容器关闭后 ip 地址改变也不影响连接
docker run --name mytomcat03 --link mytomcat02 -d -P mytomcat:2.0
# 通过 --link 将 mytomcat02 绑定在 mytomcat03 实际是在 mytomcat03 中的 /etc/hosts 文件中绑定
6.Docker 四种网络模式
- 查看 docker 网络配置
docker network ls
bridge
Bridge 桥接模式的实现步骤主要如下:
- Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
- Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;
- Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性
Bridge桥接模式的缺陷:
-
最明显的是,该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。
-
虽然 NAT 模式经过中间处理实现了这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。
-
另外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。
-
bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。
Container
Container 网络模式实现过程
在 Docker 容器的 Container 网络模式实现过程中,不涉及网桥,同样也不需要创建
虚拟网卡 veth pair 。完成 Container 网络的创建只需要两个步骤:
- 查找 Container (即需要被共享网络环境的容器)的网络命名空间。
- 新创建的 Docker 容器的网络命名空间使用其他容器的网络命名空间。
Container网络模式的缺陷:
它并没有改善容器与宿主机以外世界通信的情况(和桥接模式一样,不能连接宿主机以外的其他设备)。
host
host优点
- host 模式是 bridge 桥接模式很好的补充。采用 host 模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。
Host 网络模式的缺陷:
当然,有这样的方便,肯定会损失部分其他的特性。
- 最明显的是 Docker Container 网络环境隔离性的弱化。即容器不再拥有隔离、独立的网络栈。
- 使用 host 模式的 Docker Container 虽然可以让容器内部的服务和传统情况无差别、无改造的使用,但是由于网络隔离性的弱化,该容器会与宿主机共享竞争网络栈的使用;
- 另外,容器内部将不再拥有所有的端口资源,原因是部分端口资源已经被宿主机本身的服务占用,还有部分端口已经用以 bridge 网络模式容器的端口映射。
None
- 在这种模式下,容器有独立的网络栈,但不包含任何网络配置,只具有lo这个loopback网卡用于进程通信。也就是说,none模式为容器做了最少的网络设置,但是俗话说得好“少即是多”,在没有网络配置的情况下,通过第三方工具或者手工的方式,开发这任意定制容器的网络,提供了最高的灵活性
7.自定义网络(推荐使用)
1)自定义网络的好处:
- 网络之间相互隔离
- 不同服务可以自定义使用不同的网络环境
docker network --help
docker network create --help
2)自定义网络配置
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# --driver bridge 配置网络模式
# --subnet 192.168.0.0/16 配置子网掩码
# --gateway 192.168.0.1 配置网关
# mynet 命名
3)使用自定义网桥创建容器,,自定义ip地址:
docker run -it -d -P --name mytomcat-mynet-03 --net mynet --ip 192.168.0.10 mytomcat:2.0
# 查看网配置
docker network inspect mynet
8.相同网桥测试连通性
# 使用自定义网络启动两个容器
docker run -it -d -P --name mytomcat-mynet-01 --net mynet mytomcat:2.0
docker run -it -d -P --name mytomcat-mynet-02 --net mynet mytomcat:2.0
docker exec -it mytomcat-mynet-01 ping mytomcat-mynet-02
docker exec -it mytomcat-mynet-02 ping mytomcat-mynet-01
# 自定义网络,直接使用容器名就可以互相 ping 通
9.使两个不同网桥的容器通信
1) 使用默认 bridge 启动一个容器
# 使用默认 bridge 启动一个容器
docker run -it -d -P --name mytomcat-bridge mytomcat:2.0
默认使用不同网桥的容器是不可以通讯的
2) connect(一个容器两个 ip)
- 将一个容器连接到一个网络上
docker network connect [OPTIONS] NETWORK CONTAINER
docker network connect mynet mytomcat-bridge
# 将一个名为 mytomcat-bridge 的容器添加到 mynet 网络中
3) 测试不同网桥之前的连通性
docker exec -it mytomcat-bridge ping mytomcat-mynet-02
docker exec -it mytomcat-mynet-02 ping mytomcat-bridge
4) 原理图
5) 注意事项
1) docker的bridge自定义网络之间:双方可以随便添加对方的网卡
2) docker的bridge自定义网络与系统自带的网桥之间:只能是,系统自带的网桥对应的容器添加bridge自定义网络对应的容器的网卡。而反过来会报错。
3) 但是docker的系统自带的网桥之间:是可以通信的,因为是在一个网络桥接上。