前言
Docker 的网络模式是一种定义容器如何在网络中通信的方式。Docker 提供了多种网络模式,每种模式都适用于不同的使用场景
一.网络相关概念
1.子网掩码
互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。
IP
地址在设计时就考虑到地址分配的层次特点,将每个
IP
地址都分割成网络号和主机号两部分,以便于
IP
地址的寻址操作。
子网掩码是 “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” 。
2.网关
网关实质上是一个网络通向其他网络的IP地址。
3.规则
计算机的
IP
地址由两部分组成,一部分为网络标识,一部分为主机标识,同一网段内的计算机网络部分
相同,主机部分不同同时重复出现。
路由器连接不同网段,负责不同网段之间的数据转发,交换机连接的是同一网段的计算机。通过设置网
络地址和主机地址,在互相连接的整个网络中保证每台主机的
IP
地址不会互相重叠,即
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 | 不是一种独立的模式,而是一种容器网络隔离的基础。每个容器都有自己的网络命名空间,可以配置自己的网络接口、路由等,实现网络隔离。 |
1.网桥模式(bridge)
当
Docker
进程启动时,会在主机上创建一个名为
docker0
的虚拟网桥,此主机上启动的
Docker
容器会连
接到这个虚拟网桥上。
虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从
docker0
子网中分配一个
IP
给容器使用,并设置
docker0
的
IP
地址为容器的默认网关。
而网桥模式是docker默认的网络模式,不写-net参数,就是bridge(网桥)模式
打开容器
docker run -itd --net=bridge --name cname iname
查看容器网络
ip addr
ifconfig
在主机上创建一对虚拟网卡
veth pair
设备,
Docker
将
veth pair
设备的一端放在新创建的容器中,并命名
为
eth0
(容器的网卡),另一端放在主机中,以
vethxxx
这样类似的名字命名,并将这个网络设备加入
到
docker0
网桥中
当我们直接创建一个容器将tomcat默认的8080端口映射8081再去查看它的网络模式
docker run -itd \
--name y1 \
-p 8081 \
tomcat:8.5.20
查看bridge信息
docker inspect bridge
我们可以看到我们利用命令可以查看详细的bridge信息以及关联的ip
当然,在我们映射端口时可以同时映射多个端口
例:docker run -itd --name bridge05 -p 8082:8080 -p 8083:8080 spring:1.0
小结:
每个容器有自己独立的ip
如果外部访问需要设置端口映射
默认模式就为网桥模式
2.主机模式(Host)
如果启动容器的时候使用
host
模式,那么这个容器将不会获得一个独立的
Network Namespace
,而是
和宿主机共用一个
Network Namespace
。
容器将不会虚拟出自己的网卡,配置自己的
IP
等,而是使用宿主机的
IP
和端口。
但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
在我们创建容器时不需要去做端口映射,且容器会直接占用当前使用端口,无法再进行多端口映射
三.Docker自定义网络配置
1.创建自定义网络
docker network create --subnet=172.20.0.0/16 mynet
查看当前所有网络
docker network ls
2.创建指定自定义网络容器
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
3.创建并指定Mysql容器网络配置
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
4.创建Mysql远程访问用户
grant all on *.* to YU@'%' identified by '123456';
小结:当我们为mysql指定网络配置后,我们在部署项目时就不需要去指定我们的IP,可以直接使用当前Mysql容器名+mysql端口进行配置,但是前提是当前MySQL必须要和项目在同一个网络下