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
相关产品推荐
相关产品推荐

