Docker 的网络模式是一种定义容器如何在网络中通信的方式。Docker 提供了多种网络模式,每种模式都适用于不同的使用场景
子网掩码是 “255.255.255.0” 的网络:最后面一个数字可以在 0~255 范围内任意变化,因此可以提供 256 个 IP 地址。但是实际可用的 IP 地址数量是 256-2 ,即 254 个,因为主机号不能全是 “0” 或全是 “1” 。子网掩码是“255.255.0.0”的网络:
后面两个数字可以在0~255范围内任意变化,可以提供255²个IP地址。但是实际可用的IP地址数量
是255²-2,即65023个。IP 地址的子网掩码设置不是任意的。如果将子网掩码设置过大,也就是说子网范围扩大,那么,根据子网寻径规则,很可能发往和本地主机不在同一子网内的目标主机的数据,会因为错误的判断而认为目标主机是在同一子网内,那么,数据包将在本子网内循环,直到超时并抛弃,使数据不能正确到达目标主机,导致网络传输错误;如果将子网掩码设置得过小,那么就会将本来属于同一子网内的机器之间的通信当做是跨子网传输,数据包都交给缺省网关处理,这样势必增加缺省网关的负担,造成网络效率下降。因此,子网掩码应该根据网络的规模进行设置。如果一个网络的规模不超过 254 台电脑,采用“255.255.255.0” 作为子网掩码就可以了,现在大多数局域网都不会超过这个数字,因此“255.255.255.0” 是最常用的 IP 地址子网掩码;假如在一所大学具有 1500 多台电脑,这种规模的局域网可以使用 “255.255.0.0” 。
网关实质上是一个网络通向其他网络的IP地址。
在学习Docker网络配置之前我们要先了解什么是网络模式
模式 | 描述 |
---|---|
Bridge(桥接) | 默认模式,用于在同一主机上的容器通信。每个容器有唯一的 IP 地址,可以通过容器名或容器 ID 进行通信。容器与主机之间使用 NAT。 |
Host(主机) | 容器共享主机的网络命名空间,直接使用主机的网络接口。性能较好,但容器和主机之间可能出现端口冲突。 |
None(无网络) | 容器没有网络接口,只能通过其他网络连接。用户可以自行配置容器的网络。 |
Overlay | 用于跨多个 Docker 守护进程的容器通信,例如在 Docker Swarm 模式下。创建 overlay 网络,容器加入该网络即可。 |
Macvlan | 允许容器直接使用物理网络的 MAC 地址,使容器看起来像是物理设备。配置 Macvlan 网络,容器加入该网络。 |
Custom Bridge | 用户可以创建自定义的桥接网络,适用于多容器应用。创建自定义桥接网络,容器加入该网络。 |
CNI(Container Network Interface) | 开放的插件化网络接口,允许使用第三方网络插件。Kubernetes 中广泛使用的网络模式,支持多种网络实现,例如 Calico、Flannel 等。 |
Sidecar | 使用额外的容器(sidecar)来处理网络通信或其他功能。主容器与 sidecar 共享网络命名空间,通过 localhost 进行通信。 |
Bridge to Host | 在用户定义的网络命名空间中,容器连接到主机网络。在 Linux 中,容器直接连接到主机网络命名空间,不再进行网络隔离。 |
Network Namespace | 不是一种独立的模式,而是一种容器网络隔离的基础。每个容器都有自己的网络命名空间,可以配置自己的网络接口、路由等,实现网络隔离。 |
docker run -itd --net=bridge --name cname iname
查看容器网络
ip addr
ifconfig
docker run -itd \
--name y1 \
-p 8081 \
tomcat:8.5.20
docker inspect bridge
我们可以看到我们利用命令可以查看详细的bridge信息以及关联的ip
当然,在我们映射端口时可以同时映射多个端口
例:docker run -itd --name bridge05 -p 8082:8080 -p 8083:8080 spring:1.0
小结:
每个容器有自己独立的ip
如果外部访问需要设置端口映射
默认模式就为网桥模式
在我们创建容器时不需要去做端口映射,且容器会直接占用当前使用端口,无法再进行多端口映射
docker network create --subnet=172.20.0.0/16 mynet
查看当前所有网络
docker network ls
docker run -it \
--name t1 \
-p 8080:8080 \
-v /soft:/usr/local/tomcat/webapps \
--net mynet \
--ip 172.20.0.100 \
tomcat:8.5.20
docker run \
--name m1 \
-v /mysql/conf/my.cnf:/etc/my.cnf \
-v /mysql/data:/var/lib/mysql \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
--net mynet \
--ip 172.20.0.200 \
-d mysql/mysql-server:5.7
grant all on *.* to YU@'%' identified by '123456';
小结:当我们为mysql指定网络配置后,我们在部署项目时就不需要去指定我们的IP,可以直接使用当前Mysql容器名+mysql端口进行配置,但是前提是当前MySQL必须要和项目在同一个网络下