【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
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
优点
- 容器之间可以直接通过容器名称访问服务,无需暴露端口给宿主机。
- 更加灵活和安全。