如何在Azure App Service(Basic计划)上部署两个Docker镜像且不使用部署槽位
如何在Azure App Service(Basic计划)上部署两个Docker镜像且不使用部署槽位
Hi Francesco,我来帮你解决这个问题~
你遇到的核心问题是:单个App Service默认只能运行一个独立容器实例,直接依次部署两个镜像的话,后部署的会覆盖掉先部署的。不过Basic计划其实支持多容器部署(Docker Compose/Kubernetes Manifest),这正是你需要的方案——不用升级计划也不用部署槽位就能同时运行两个镜像。
下面是具体的实现步骤,分两种场景给你参考:
方案一:直接运行两个容器(简单场景)
如果你的前端和API可以通过不同端口访问,或者前端内部能直接调用API的容器地址,可以直接用Docker Compose定义两个服务:
- 编写
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
- 部署这个Compose配置到App Service:
- 如果你用Deployment Center:选择「Docker Compose」类型,关联你的ACR,然后指定这个
docker-compose.yml文件的位置(可以存在代码仓库或ACR里)。 - 如果你用Azure DevOps Pipeline:添加一个Azure CLI任务,执行命令部署:
- 如果你用Deployment Center:选择「Docker Compose」类型,关联你的ACR,然后指定这个
az webapp config container set \ --resource-group <你的资源组名称> \ --name <你的App Service名称> \ --multicontainer-config-type compose \ --multicontainer-config-file docker-compose.yml
- 最后在App Service的「配置」→「常规设置」里,设置
WEBSITES_PORT为80(对应前端的对外端口),这样外部访问App Service域名就能直接打开前端,而API可以通过你的域名:8080访问。
方案二:用Nginx做反向代理(统一域名路径访问)
如果希望通过同一个域名的不同路径访问两个服务(比如your-domain.com/访问前端,your-domain.com/api/访问API),可以加一个Nginx容器做反向代理:
- 准备
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; } } }
- 部署方式和方案一一致:把这两个文件放到代码仓库,通过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
相关产品推荐
相关产品推荐

