Docker核心原理之网络
在前面几篇文章中有关使用Docker安装Zookeeper、MySQL、Nginx之后,都进行了验证测试。对于不是使用Docker安装的软件,启动后根据配置的端口(没有自定义就是默认端口)就可以进行测试,如果是使用Docker拉取的镜像,运行之后外界可以直接使用默认或者自定义的端口进行访问么?
通过上图可以观察到:对于nginx、zookeeper、mysql,尽管在docker容器内都使用了默认的端口,但是对外(操作系统)而言通过端口并不能找到相应的服务进程。
重新使用run加选项-p对nginx进行操作,如下:
操作系统可以看到80端口服务进程了。这是咋了?所以是不是需要更深入的理解下Docker网络相关知识呢?
docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如docker的镜像管理。然而,docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。因此有必要深入了解docker的网络知识,以满足更高的网络需求。
在Docker中容器默认是无法与外部通信的,需要在启动命令中加入对应参数才允许容器与外界通信。当容器运行一个Web服务时,需要把容器内的Web服务应用程序端口映射到本地宿主机的端口,这样通过范围数组及指定端口时相当于访问容器内部的Web服务端口。
这个参数就是上图中使用的-p(或者-P):
当使用-P时无指定端口,Docker会随机映射一个端口至容器内部的开放端口。使用docker port container_name可以查看端口映射情况。
当使用-p时可以指定端口,支持的格式有:
local_Port:cantainer_Port——映射所有接口地址,即所有访客均可通过宿主机端口访问容器服务;
local_IP:local_Port:cantainer_Port——指定映射地址端口,即固定ip客户可以通过宿主机端口访问容器服务;
local_IP:cantainer_Port——指定地址但是端口随机;
同时通过/tcp|udp还可以定制传输协议。
单机版端口映射搞定了,接下来还有两个问题:1、端口暴露;2、容器互联
一、端口暴露
端口暴露和端口映射新手可能混淆,本质上它们可以这样理解:我口袋有没有米我知道但是要不要通知其他人我口袋有没有米呢?
Docker现有端口暴露采用两种方式:EXPOSE指令在Dockerfile中定义或者docker run时指定--expose=port,区别在于后者可以指定端口范围作为参数。
有时候通过inspect查看容器信息,可以发现端口被表示为已暴露但是实际上没有定义任何映射的场景也是有的;因为没有规定一定要端口映射成功了才能暴露端口。
回忆一下,是不是与防火墙开发端口很类似:端口开发了不代表有个服务必须使用这个端口。同时新添加的端口可能也不在暴露端口范围之内。
二、容器互联
容器互联是处理端口映射外另一种可以与容器通信的方式。端口映射的用途是宿主机与容器的通信,而容器互联是容器之间的通信。
实际上docker run提供 --link参数进行容器互联,同时这个参数也在depreted中而采取更实用的方式。具体实现容器互联可以参考Docker网络之多容器之间通讯 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2021-04-26 Spring Boot 热插拔技术应用
2021-04-26 Spring Boot自动配置实战