目录
桥接模式
docker基于桥接模式的网络类型
*1. host模式(宿主机和容器共享)
2.container模式(容器和容器共享)
3.none模式(无网络模式/单机模式)
*4.自定义网络
桥接模式
桥接模式是默认模式
工作流程:部署好docker服务,启动之后,就会创建一个虚拟网桥docker0,这就是虚拟的网络设备,类似于交换机。每一次运行容器之后,docker0就会从网段当中分配一个ip地址给这个容器。
容器与主机之间通信:通过桥接模式进行
容器与容器之间通信:多个容器都在同一网段,都在同一网桥,可以通过自己的ip地址进行通信
默认情况下,桥接模式下的容器与宿主机之间的通信是隔离的,除非你配置了端口映射。
桥接模式工作原理:连接两个不同网络段的设备,使他们之间可以共享通信。
桥接模式的设备有:路由器、交换机。
桥接模式是基于mac地址转发数据帧
举例:172.17.0.2 路由器 192.168.233.10
当172.17.0.2 与192.168.233.10要进行通信,桥接设备会查看目标的mac地址,路由器发送ARP广播,如果在mac地址表,桥接设备直接把数据帧转发目标的相应接口;如果不在mac地址表,发送ARP广播,所有接口都会收到数据报文,有则响应,无则丢弃。
桥接模式在物理和数据链路层上工作,学习和转发mac地址,用于局域网内部的连接和扩展。
通过桥接模式创建新的容器后,会以vethpair 方式生成一个对应容器的虚拟网卡。
docker网桥是宿主机虚拟出来的,并不是真正的网络设备,外部是没有办法通过寻址找到的。也就是客户端是无法直接访问容器的ip地址。
如果希望外部网络能够访问,要通过映射容器的端口到宿主机。(做端口映射)
桥接模式的宿主机和容器之间的端口映射,实际上就是做了NAT地址的转换,也就是把容器的私有ip映射到主机的ip上,从而实现容器与外部网络的通信。好处:隐藏了容器内部的真实ip地址。
容器内部之间通信是做数据帧转发,外部和容器之间用iptables做NAT地址的转换来实现通信。
docker基于桥接模式的网络类型
*1. host模式(宿主机和容器共享)
容器不会虚拟出自己的网卡,也不会配置自己的ip。容器全部使用宿主机的ip和端口。
host模式一般用于端口不重复的类型的应用。docker本身是单节点模式,使用与部署单个服务的应用程序。
创建host模式(不需要做-p 端口映射 直接能访问虚拟机本机地址)
docker run -itd --name nginx2 --network host nginx:1.22
2.container模式(容器和容器共享)
容器和容器之间共用一个网络命名空间(network namespace),不是和宿主机共享。
新创建的容器也不会有自己的网卡,也不会配置自己的ip,而是和一个容器共享ip和端口。除了网络是共享的之外,其他的比如文件系统等等都是隔离。
创建container模式:
docker run -itd --name test2 --net=container:test1 centos:7 /bin/bash
docker inspect -f '{{.State.Pid}}' test1 查看容器在系统当中的进程号
查看命名空间的id
3.none模式(无网络模式/单机模式)
创建容器之后,容器有自己的网络命名空间,但是不会进行任何网络的配置,也就是它没有网卡、ip、端口,它只有本地的lo回环网络,没有办法进行联网。网络是封闭的,一般用于内部调试。
创建none模式
docker run itd --name nginx3 --network none nignx:1.22
*4.自定义网络
它和桥接模式一样,只不过我们可以自定义容器的网段和给新创建的容器指定ip地址。
只有自定义网络可以在创建容器的时候指定ip地址
查看docker网络设备的命令 :docker network ls
先创建自定义网络
docker network create --subnet=172.111.0.0/16 --opt "com.docker.network.bridge.name"="docker 1" mynetwork1
再给容器指定ip地址
docker run -itd --name nginx2 --net mynetwork1 --ip 172.111.0.10 -p 81:80 nginx:1.22