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

Azure Ubuntu VM部署Docker应用遇OSError[Errno99]地址不可用求助

问题:Docker容器中Waitress绑定失败(OSError: [Errno 99] Address not available)

在Azure Ubuntu 22虚拟机上部署Docker应用,已开放5000-5005端口,但执行docker-compose启动后所有节点日志均报错:

File "/usr/local/lib/python3.11/site-packages/waitress/server.py", line 78, in create_server
    last_serv = TcpWSGIServer(
                ^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/waitress/server.py", line 243, in __init__
    self.bind_server_socket()
File "/usr/local/lib/python3.11/site-packages/waitress/server.py", line 364, in bind_server_socket
    self.bind(sockaddr)
File "/usr/local/lib/python3.11/site-packages/waitress/wasyncore.py", line 374, in bind
    return self.socket.bind(addr)
           ^^^^^^^^^^^^^^^^^^^^^^
OSError: [Errno 99] Address not available

相关配置如下:

Dockerfile

FROM python:3.11-alpine

ENV FLASK_APP=flaskr ENV FLASK_ENV=production

WORKDIR /app

COPY requirements.txt requirements.txt COPY dockerstart.sh start.sh COPY Crypto/py-fhe /app/Crypto/py-fhe RUN apk add build-base python3-dev libffi-dev linux-headers net-tools wireless-tools gmp-dev mpfr-dev mpc1-dev RUN pip install --no-cache-dir --upgrade pip \
    && pip install --no-cache-dir -r requirements.txt \
    && pip install /app/Crypto/py-fhe 

COPY . .

EXPOSE 5000 CMD ["./start.sh"]

Docker Compose配置

version: '3'
services:
  node-1:
    image: thing1
    ports:
      - "5002:5000"
    networks:
      - container_network
    environment:
      - PORT=5000
  node-2:
    image: thing2
    ports:
      - "5003:5000"
    networks:
      - container_network
    environment:
      - PORT=5000
  node-3:
    image: thing3
    ports:
      - "5004:5000"
    networks:
      - container_network
    environment:
      - PORT=5000
  node-4:
    image: thing4
    ports:
      - "5005:5000"
    networks:
      - container_network
    environment:
      - PORT=5000
networks:
  container_network:

requirements.txt

pyzmq~=25.1.2
flask~=3.0.2
phe~=1.5.0
psutil~=5.9.8
firebase_admin~=6.5.0
damgard-jurik~=0.0.3
waitress~=3.0.0

dockerstart.sh脚本

#!/bin/sh
waitress-serve --call --host <<azure public ip>> --port=$PORT "flaskr:create_app"

应用无法正常启动,网页访问陷入加载循环,尝试绑定localhost也无效。


解决方案

1. 核心原因

容器内部无法直接绑定Azure虚拟机的公网IP——该IP属于宿主机的网络接口,容器自身的网络栈中不存在这个地址,因此触发"Address not available"错误。

2. 修复步骤

(1)修改启动脚本的绑定地址

将dockerstart.sh中的--host <<azure public ip>>改为--host 0.0.0.0,让Waitress监听容器内所有可用网络接口,允许宿主机转发的请求接入:

#!/bin/sh
waitress-serve --call --host 0.0.0.0 --port=$PORT "flaskr:create_app"

(2)验证容器内部监听状态

启动容器后,进入容器检查监听端口:

docker exec -it <容器名称/ID> sh
netstat -tulpn

确认输出中存在0.0.0.0:5000的监听记录。

(3)检查宿主机端口转发

在Azure虚拟机上执行以下命令,确认端口转发是否生效:

ss -tulpn | grep -E '500[2-5]'

(4)确认Azure网络安全组规则

确保虚拟机的NSG已配置入站规则,开放5002-5005端口,源地址设置为允许访问的范围(如0.0.0.0/0或特定IP段)。

3. 额外优化建议

  • 拆分Dockerfile中的ENV指令,避免一行多变量的潜在问题:
    ENV FLASK_APP=flaskr
    ENV FLASK_ENV=production
    
  • 在Dockerfile中添加权限设置,确保启动脚本可执行:
    RUN chmod +x start.sh
    

内容的提问来源于stack exchange,提问作者Pablo pelotazos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:17:18