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

如何在Azure App Service(Basic计划)上部署两个Docker镜像且不使用部署槽位

如何在Azure App Service(Basic计划)上部署两个Docker镜像且不使用部署槽位

Hi Francesco,我来帮你解决这个问题~

你遇到的核心问题是:单个App Service默认只能运行一个独立容器实例,直接依次部署两个镜像的话,后部署的会覆盖掉先部署的。不过Basic计划其实支持多容器部署(Docker Compose/Kubernetes Manifest),这正是你需要的方案——不用升级计划也不用部署槽位就能同时运行两个镜像。

下面是具体的实现步骤,分两种场景给你参考:

方案一:直接运行两个容器(简单场景)

如果你的前端和API可以通过不同端口访问,或者前端内部能直接调用API的容器地址,可以直接用Docker Compose定义两个服务:

  1. 编写docker-compose.yml文件,配置两个镜像的信息:
version: '3.8'
services:
  api-service:
    # 替换成你的ACR镜像地址
    image: your-acr-name.azurecr.io/api-repo:latest
    ports:
      - "8080:80"  # API容器内部用80端口,对外映射8080
    restart: always

  frontend-service:
    # 替换成你的ACR镜像地址
    image: your-acr-name.azurecr.io/frontend-repo:latest
    ports:
      - "80:80"    # 前端容器对外用80端口(App Service默认监听端口)
    restart: always
  1. 部署这个Compose配置到App Service:
    • 如果你用Deployment Center:选择「Docker Compose」类型,关联你的ACR,然后指定这个docker-compose.yml文件的位置(可以存在代码仓库或ACR里)。
    • 如果你用Azure DevOps Pipeline:添加一个Azure CLI任务,执行命令部署:
az webapp config container set \
  --resource-group <你的资源组名称> \
  --name <你的App Service名称> \
  --multicontainer-config-type compose \
  --multicontainer-config-file docker-compose.yml
  1. 最后在App Service的「配置」→「常规设置」里,设置WEBSITES_PORT为80(对应前端的对外端口),这样外部访问App Service域名就能直接打开前端,而API可以通过你的域名:8080访问。

方案二:用Nginx做反向代理(统一域名路径访问)

如果希望通过同一个域名的不同路径访问两个服务(比如your-domain.com/访问前端,your-domain.com/api/访问API),可以加一个Nginx容器做反向代理:

  1. 准备docker-compose.yml和nginx.conf两个文件:
    • docker-compose.yml:
version: '3.8'
services:
  api-service:
    image: your-acr-name.azurecr.io/api-repo:latest
    expose:
      - "80"  # 只在内部网络暴露端口,不对外映射
    restart: always

  frontend-service:
    image: your-acr-name.azurecr.io/frontend-repo:latest
    expose:
      - "80"
    restart: always

  nginx-proxy:
    image: nginx:alpine
    ports:
      - "80:80"
    # 挂载自定义Nginx配置文件(注意要把这个文件和compose文件放在一起)
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    restart: always
    depends_on:
      - api-service
      - frontend-service
  • nginx.conf(配置路径路由):
events {}
http {
    server {
        listen 80;

        # 根路径转发到前端容器
        location / {
            proxy_pass http://frontend-service;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        # /api路径转发到API容器
        location /api/ {
            proxy_pass http://api-service/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}
  1. 部署方式和方案一一致:把这两个文件放到代码仓库,通过Deployment Center或DevOps Pipeline部署即可。App Service的WEBSITES_PORT依然设置为80,这样访问根路径就是前端,/api路径自动转发到API服务。

注意事项

  • 确保你的App Service有权限访问Azure Container Registry:可以在ACR的「访问密钥」里开启管理员账户,然后在App Service的「配置」→「容器设置」里填写ACR的用户名和密码;或者用服务主体授予拉取权限。
  • Basic计划的资源有限(比如1vCPU、1.75GB内存),如果两个容器的资源消耗较大,可能会出现性能问题,需要根据实际情况调整镜像的资源占用。

这样就能在同一个Basic计划的App Service上同时运行两个Docker镜像啦~

备注:内容来源于stack exchange,提问作者Franzkom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 15:52:59