Docker Swarm中是否支持类似docker-compose的expose指令不对外暴露端口?
Docker Swarm 中类docker-compose expose功能的实现说明
首先给出明确结论:Docker Swarm原生支持和docker-compose完全一致的expose指令功能,核心特性与ports完全区分,不会将端口暴露给外部网络。
具体使用方式
Swarm模式下通过docker stack deploy加载compose文件部署服务时,直接在服务配置中声明expose字段即可,用法和单机docker-compose没有区别,示例配置如下:
version: "3.8" services: backend: image: your-backend-image # 仅将8080端口开放给同网络下的其他服务 expose: - "8080" # 接入内部专属overlay网络,默认仅集群内服务可互访 networks: - internal-only networks: internal-only: driver: overlay # 配置internal为true后,该网络完全无法和集群外部通信 internal: true
配置效果说明
expose声明的端口不会在宿主机上启动监听,不会对外暴露,仅允许同一个overlay网络下的其他Swarm服务访问- 如果需要对外提供访问,才需要配置
ports字段,该配置会将端口映射到Swarm节点的宿主机端口,默认对集群外部网络开放
为什么有人认为Swarm不支持expose?
大部分无法生效的场景都是以下两类原因导致的:
- 版本兼容性问题:17.06之前的旧版Docker,stack部署对compose v3格式的字段支持不完善,部分版本会忽略
expose配置,升级到Docker稳定版即可解决 - 网络配置错误:如果服务接入的是没有设置
internal: true的overlay网络,且你的集群节点路由对外可达,确实可能从外部访问到expose的端口,这种情况只需给内部服务单独配置internal类型的overlay网络即可隔离外部访问。
内容的提问来源于stack exchange,提问作者Federico Bellini
相关产品推荐
相关产品推荐

