You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:13:11