Docker Swarm中无需暴露独立端口,如何通过容器名访问应用实例?
在Docker Swarm中无需暴露独立端口实现Nginx反向代理
完全不需要给每个应用实例暴露独立端口,Docker Swarm自带的服务发现和overlay网络机制可以直接实现你想要的「容器/服务名+固定内部端口」访问方式,具体实现步骤如下:
1. 创建Swarm专用的Overlay网络
Overlay网络是Docker Swarm跨节点通信的标准网络,能让集群内的容器(不管在哪个节点)互相通过名称访问。执行以下命令创建:
docker network create --driver overlay my-swarm-network
2. 以Swarm Service方式部署应用实例
不要手动创建单个容器,用Swarm Service来管理应用实例,这样Swarm会自动维护服务发现、负载均衡和实例调度。部署命令示例:
docker service create \ --name app-service \ --network my-swarm-network \ --replicas 5 \ my-app-image:latest
--name app-service:这个就是你要在Nginx里用的服务名称--network:把应用加入刚才创建的overlay网络- 不需要加
--publish参数:因为应用只需要和Nginx在内部网络通信,不用暴露到宿主机端口
3. 部署Nginx反向代理服务
同样把Nginx加入同一个overlay网络,只需要把Nginx的对外端口(80/443)暴露到宿主机即可,同时挂载你的配置文件:
先准备Nginx配置文件
修改你的Nginx配置,直接用服务名+应用内部端口(比如8080):
server { listen 80; server_name your-domain.com; location / { proxy_pass http://app-service:8080; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 900; } }
部署Nginx服务
docker service create \ --name nginx-proxy \ --network my-swarm-network \ --publish 80:80 \ --publish 443:443 \ --mount type=bind,source=/本地路径/nginx.conf,target=/etc/nginx/conf.d/default.conf \ nginx:latest
额外说明
- 如果是手动创建的独立容器(不是Service),只要把它们加入同一个overlay网络,也可以直接用容器名+内部端口访问,但Swarm环境下优先用Service,因为自带负载均衡和故障恢复。
- Swarm的服务发现会自动把
app-service解析到所有应用实例的IP,Nginx请求这个地址时,Swarm内置的负载均衡会自动把请求分发到不同的实例上,不需要你手动配置upstream。
内容的提问来源于stack exchange,提问作者Philipp M
相关产品推荐
相关产品推荐

