如何创建暴露两个端口的Azure多容器应用?
Azure多容器应用部署:单容器多端口配置问题
问题描述
我需要运行一个多容器应用,其中Python容器需开放两个独立端口(8080用于主服务,8050用于单独线程处理文件上传),不想将Python服务拆分为两个容器。已经尝试多种方法一周,求可行方向。
目前遇到的平台限制:
- Azure Web App支持多容器部署,但无法使用自定义端口;
- Azure Container Apps支持自定义端口,但配置时仅允许指定单个镜像。
现有配置文件
docker-compose.yml
version: '3.8' volumes: db-data: uploads: services: redis: image: redis:alpine ports: - '6379:6379' python-server: image: <custom image name>:latest privileged: true build: context: . dockerfile: dockerfile working_dir: / ports: - '8080:8080' - '8050:8050' env_file: .env volumes: - db-data:/instance/ - uploads:/persistence/uploads/
Dockerfile
FROM python:3.11 WORKDIR / # Install dependencies COPY requirements.txt requirements.txt RUN pip install -r requirements.txt # Copy your application code COPY . . VOLUME /instance/ VOLUME /persistence/uploads/ # Expose ports EXPOSE 8080 EXPOSE 8050 # Run the server command CMD ["./run-app.sh"]
解决方案方向
1. Azure Container Apps + 容器应用环境(推荐)
Azure Container Apps单个实例虽仅支持一个镜像,但可在同一容器应用环境下部署多个独立容器应用:
- 将Redis单独部署为一个容器应用,无需暴露公网端口(同环境内容器可通过内部域名
redis.<环境名>.internal:6379访问); - 部署Python服务容器应用时,在容器配置中添加两个TCP端口映射(8080和8050);
- 两个端口可通过容器应用的公网域名访问,格式为
https://<应用名>.azurecontainerapps.io:8080和https://<应用名>.azurecontainerapps.io:8050(启用HTTPS后)。
2. Azure Kubernetes Service (AKS)
AKS完全支持多容器多端口部署需求:
- 编写K8s Deployment配置,在Pod中定义Redis和Python两个容器并配置对应端口;
- 通过Service资源暴露Python的8080/8050端口(可选择LoadBalancer或NodePort类型),Redis仅需配置ClusterIP服务供内部访问;
- 可搭配Ingress统一管理外部访问路由。
3. Azure Web App折中方案
若坚持使用Web App,可通过以下方式绕过端口限制:
- 在Web App多容器部署中,将
WEBSITES_PORT设为8080作为主端口; - 修改Python服务逻辑,将文件上传请求通过主端口(8080)转发至容器内部的8050端口,无需暴露第二个公网端口;
- 若必须暴露8050,可通过VNet集成或私人端点实现内部访问,无法直接通过公网访问该端口。
内容的提问来源于stack exchange,提问作者AdamCodes716
相关产品推荐
相关产品推荐

