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

优点

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

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐