本地正常运行的Flask应用容器化后无法访问问题
问题描述
我有一个Flask应用,本地执行flask run可正常运行,但Docker部署后Mac设备无法访问,其他设备能正常运行。
项目结构
flask-demo │ Dockerfile │ requirements.txt │ start.sh └───app │ __init__.py │ other-extensions.py │ └───microservice-folders │ │ ... └───templates │ │ ...
关键文件内容
1. app/init.py
# imports def create_app(config_class=Config): app = Flask(__name__) app.config.from_object(config_class) # manage login # ... # Initialize Flask extensions here # ... bs = Bootstrap(app) # flask-bootstrap # Register blueprints here # ... return app
2. Dockerfile
FROM python:3.9 WORKDIR /python-docker COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt COPY . . CMD ["flask", "run", "--host=0.0.0.0"]
3. start.sh
#!/bin/zsh app="docker.test" docker build -t ${app} . docker run -d -p 56733:80 \ --name=${app} \ -v $PWD:/app ${app}
现象
- 执行
zsh start.sh后容器成功启动,docker ps输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 40c6b6dfca3a docker.test "flask run --host=0.…" 5 seconds ago Up 3 seconds 0.0.0.0:56733->80/tcp docker.test
- 访问
http://localhost:56733时Safari提示“无法打开页面,连接已断开” - 修改端口映射为
-p 8080:5000后,页面空白 - 非Mac设备拉取项目可正常运行,Mac设备不行
排查与解决步骤
1. 确认容器内Flask监听端口
Flask默认监听5000端口,你的Docker命令未指定端口,容器内服务实际跑在5000端口,之前的56733:80映射错误。进入容器验证:
docker exec -it docker.test bash # 容器内执行 netstat -tulpn | grep python # 正常会显示0.0.0.0:5000
2. 修正端口映射
修改start.sh的端口映射为-p 56733:5000,或直接执行:
docker run -d -p 56733:5000 --name docker.test docker.test
3. 更换本地端口尝试
Mac上可能原端口被占用,换个端口测试:
docker run -d -p 8080:5000 --name docker.test docker.test
访问http://localhost:8080
4. 使用Mac内网IP访问
Mac的localhost偶尔会有映射问题,用内网IP替代:
- 终端执行
ipconfig getifaddr en0获取内网IP - 访问
http://[你的内网IP]:8080
5. 查看容器日志排查启动问题
docker logs docker.test
如果看到* Running on http://0.0.0.0:5000说明Flask启动正常;若有依赖缺失、蓝图注册失败等报错,对应修复。
6. 检查Mac防火墙设置
临时关闭防火墙测试:
- 系统设置 → 网络 → 防火墙 → 关闭
若能访问,再将Docker添加到防火墙例外列表。
7. 确认Docker Desktop网络设置
打开Docker Desktop → 设置 → 资源 → 网络,确保“允许Docker从本地网络访问”已勾选。
内容的提问来源于stack exchange,提问作者ai.jennetta
相关产品推荐
相关产品推荐

