当前位置: 首页 > news >正文

【docker】端口暴露

Docker 提供了两种方式来处理容器的端口:暴露端口不暴露端口

本文以Tomcat为案例,理解这两种方式的区别

1. 暴露端口

将容器内部的服务端口映射到宿主机的某个端口上,从而使外部网络能够访问容器内的服务。

实现方式

通过 docker run 命令中的 -p--publish 参数,可以将容器的端口映射到宿主机的端口。

示例命令

假设 Tomcat 默认运行在容器内的 8080 端口,我们可以将其映射到宿主机的 8080 端口:

docker run -d -p 8080:8080 -v /opt/tomcat-server:/usr/local/tomcat/webapps/ROOT tomcat:latest

  • d:后台运行容器。
  • p 8080:8080:将宿主机的 8080 端口映射到容器的 8080 端口。
    • 格式为 宿主机端口:容器端口
  • v:挂载目录。

添加HTML文件

echo "Tomcat is running" > /opt/tomcat-server/index.html

访问方式

通过浏览器访问宿主机的 IP 地址和映射的端口即可访问 Tomcat 应用:

http://<宿主机IP>:8080

[#30#root@bserptest15 tomcat-server]# curl 192.168.0.15:8080
Tomcat is running

web

2. 不暴露端口

不暴露端口意味着容器内的服务仅限于容器内部访问,外部网络无法直接访问容器内的服务

实现方式

在运行容器时,不使用 -p 参数进行端口映射。

示例命令

docker run -d tomcat:latest

容器内的 Tomcat 服务仍然会运行在默认的 8080 端口,但宿主机无法直接访问该端口

访问方式

  • 容器内部访问 :可以通过进入容器内部的方式访问服务
docker exec -it <container_id> /bin/bash
curl http://localhost:8080
  • 通过其他容器访问

如果其他容器与当前容器在同一 Docker 网络中,可以通过容器名称或 IP 地址访问服务

适用场景

  • 内部服务通信 :当容器内的服务仅用于其他容器调用时(例如微服务架构中的后端服务)
  • 安全性要求高 :避免将服务直接暴露给外部网络,减少潜在的安全风险
  • 批处理任务 :如果容器运行的是后台任务(如定时任务、数据处理),不需要外部访问

3. 区别对比

特性暴露端口不暴露端口
外部访问可以通过宿主机的 IP 和端口访问容器内的服务宿主机无法直接访问容器内的服务
安全性存在一定的安全风险(需配置防火墙或认证机制)更加安全,适合内部服务
适用场景需要对外提供服务的应用(如 Web 应用)内部服务通信或后台任务
命令参数使用-p参数(如-p 8080:8080不使用-p参数
访问方式浏览器或外部工具直接访问通过容器内部或其他容器间接访问

4. 高级用法-自定义网络

如果希望多个容器之间可以互相通信,同时又不暴露端口给宿主机,可以使用docker的自定义网络

  • 创建一个自定义网络:

docker network create my_network

  • 启动 Tomcat 容器并加入自定义网络:

docker run -d --name tomcat_container --network my_network tomcat:latest

  • 启动另一个容器(如 Nginx)并加入同一网络:

docker run -d --name nginx_container --network my_network nginx:latest

  • 在 Nginx 容器中访问 Tomcat 容器:

curl http://tomcat_container:8080

优点

  • 容器之间可以直接通过容器名称访问服务,无需暴露端口给宿主机。
  • 更加灵活和安全。

相关文章:

  • Webservice如何调用
  • zabbix学习笔记
  • 前端开发:Web蜜罐详解
  • Java实例化详解:从概念到实践的全方位解读
  • 如何把绿色可执行应用程序添加到Ubuntu的收藏夹Dock中
  • 【DvAdmin】基于腾讯云Cos实现资源预签名访问
  • 硬件工程师入门教程(四)
  • k8s面试题总结(十五)
  • Windows本地部署DeepSeek模型指南
  • react native
  • 前端 JavaScript 中快速发起多个下载请求时,解决浏览器的并发下载连接限制
  • 数字人源码部署-支持oem
  • Netty基础—4.NIO的使用简介二
  • 编程考古-VCL跨平台革命:CrossVCL如何让Delphi开发者梦想成真(上)
  • 从 pip 到 Poetry:开启高效 Python 包管理新时代
  • LVGL 中设置 UI 层局部透明,显示下方视频层
  • 1720. 解码异或后的数组
  • 大型语言模型与强化学习的融合:迈向通用人工智能的新范式
  • Unity3D IK 解算器(Inverse Kinematics,IK Solver)
  • 双指针算法介绍+算法练习(2025)
  • 姜再冬大使会见巴基斯坦副总理兼外长达尔
  • 习近平离京赴莫斯科对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典
  • 哥伦比亚总统称将在访华期间签署“一带一路”倡议意向书,外交部回应
  • 马上评|从一个细节看今年五一档电影
  • 科技日报刊文批院士专家“赶场式”跑会:助长浮躁之气功利之心
  • 长线游、县域游、主题游等持续升温,假期文旅市场供需两旺