博客 docker之网络配置

docker之网络配置

   数栈君   发表于 2023-08-22 10:47  466  0

前言

当你开始大规模使用 Docker 时,你会发现需要了解很多关于网络的知识。
Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。
然而,Docker 同样有着很多不完善的地方,网络方面就是 Docker 比较薄弱的部分。

因此,我们有必要 深入了解 Docker 的网络知识,以满足更高的网络需求。

Docker 作为目前最火的轻量级容器技术,牛逼的功能,如 Docker 的镜像管理,不足的地方网络方面。

Docker 有自身的4种网络工作方式,和一些自定义网络模式。

安装 Docker 时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host


Bridge:此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。

host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。

None:该模式关闭了容器的网络功能。

以上都是不用动手的,真正需要配置的是自定义网络。

Docker 网络配置

Docker 网络模式介绍:

Docker在创建容器时有四种网络模式:bridge、host、container、none


bridge 为默认不需要用 --net 去指定,其他三种模式需要在创建容器时使用 --net 去指定

    1.bridge 模式 (默认模式)

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。
虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。
可以通过brctl show命令查看。

bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。
使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。
可以使用iptables -t nat -vnL 查看。

docker run 时使用 --net=bridge,这种模式会为每个容器分配一个独立的Network Namespace,
同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。

注意:bridge 为默认模式,不需要使用参数 --net 去指定,使用了 --net 参数反而无效
bridge模式无法指定容器 IP(但非绝对)

bridge 模式图解:
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/49ece8ae275b4f9554dae74a3b5a56e9..jpg
  

    2.host 模式

如果启动容器的时候使用 host模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个Network Namespace。
容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

docker run 时使用 --net=host,容器将不会虚拟出IP/端口,而是使用宿主机的IP和端口。

docker run -itd --net=host 961769676411

注意:host模式不能使用端口映射和自定义路由规则,这些都与主机一致,-p 与-icc 参数是无效的

host 模式图解:
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/dc75983f34e7e6943024f5fdb024e055..jpg
  

    3.container 模式

不常用

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。
新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。
同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

container 模式图解 :
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/c248ce1f5d3c086805dffde67d47e60b..jpg
  

    4.none 模式

不常用

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器没有网卡、IP、路由等信息。
需要我们自己为Docker容器添加网卡、配置IP等。

none 模式图解:
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/fd5ea90f2ac4a104ad51f23f30ad0858..jpg
  

    5.跨主机通信

Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信。
这种端口映射方式对很多集群应用来说极不方便。
如果能让Docker容器之间直接使用自己的IP地址进行通信,会解决很多问题。
按实现原理可分别直接路由方式、桥接方式(如pipework)、Overlay隧道方式(如flannel、ovs+gre)等。

以上四种均未跨主机,也就是说容器均运行在一台宿主机上,但实际生产环境不可能只用一台来跑。
肯定会用到多台,那么多台主机之间的容器如何通信 ?

        1.使用路由机制打通网络

        2.使用Open vSwitch(OVS)打通网络

        3.使用flannel来打通网络

        4.使用Quagga来实现自动

简单演示:
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/d61fa1948cc7e1844573a19b328bf9cf..png
  
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/036b7f164f89a6ec8241e29fc3fab406..jpg
  
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/39b828b3ed32d5fb124c6189fec04eeb..png
  
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/0e035c9aef85a13b44bc3303776dfc72..jpg
  
上面通过宿主机访问容器里的tomcat
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/a6b5115c8a2983bdeb29faba01c9e1e0..png
  
效果:8080/8081都可以访问到!!!

外部访问 Docker 容器

bridge 模式

docker run -itd -p 7101:7101 镜像ID
## -p参数可以出现多次,绑定多个端口号
docker run -itd -p 8080:8080 -p 8088:8088 镜像ID

实例:
docker run -it --name mytomcat02 -p 8081:8080 882487b8be1d
http://192.168.147.142:8081/

host 模式

docker run -itd --net=host 镜像ID

实例:
docker run -itd --net=host 882487b8be1d
http://192.168.147.142:8080/

注1:不需要添加-p参数,因为它使用的就是主机的IP和端口,添加-p参数后,反而会出现以下警告:
WARNING: Published ports are discarded when using host network mode
注2:宿主机的ip路由转发功能一定要打开,否则所创建的容器无法联网!
echo 1 > /proc/sys/net/ipv4/ip_forward

相关命令

#停止并删除所有容器
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)

网桥查看工具 bridge-utils

apt install bridge-utils
brctl show



免责申明:


本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:
https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
https://github.com/DTStack

0条评论
上一篇:Zookeeper学习笔记
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群