前言
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必须要和项目在同一个网络下
版权归原作者 ChatYU. 所有, 如有侵权,请联系我们删除。