Docker-Compose部署Flask容器无法访问问题求助(Linux环境)
问题背景
作为Docker新手,尝试使用docker-compose运行两个返回Hello-World的Flask容器,将容器5000端口分别映射到主机5000和5001端口。执行sudo docker-compose up后容器显示正常启动,但访问http://127.0.0.1:5000或http://127.0.0.1:5001时提示“This site can’t be reached”。已配置的文件如下:
Dockerfile
FROM python:3.7 COPY app.py /app/ WORKDIR /app/ RUN pip3 install Flask CMD ["python", "app.py"]
app.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return "Hello-World" if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
docker-compose.yml
version: '3' services: flask1: image: imgflask build: . ports: - "5000:5000" flask2: image: imgflask build: . ports: - "5001:5000"
镜像构建命令:
sudo docker build -t imgflask .
排查与解决步骤
1. 确认容器内部服务状态
进入运行中的容器,检查Flask是否在0.0.0.0:5000正常监听:
# 查看运行容器ID sudo docker ps # 进入容器(替换<container_id>为实际ID) sudo docker exec -it <container_id> bash # 安装netstat并检查端口监听 apt update && apt install -y net-tools netstat -tulpn | grep 5000
若输出显示python进程监听0.0.0.0:5000,则容器内部服务正常;否则检查Flask安装状态或app.py执行逻辑。
2. 检查主机端口占用
验证主机5000/5001端口是否被其他程序占用:
# 检查5000端口 sudo lsof -i :5000 # 检查5001端口 sudo lsof -i :5001
若有进程占用,关闭对应进程或修改docker-compose.yml中的主机端口(如改为5002:5000)。
3. 验证Docker端口映射生效
查看容器端口映射配置:
sudo docker inspect <container_id> | grep -A 10 "Ports"
确认输出中存在"5000/tcp": [{"HostPort": "5000"}](flask1)或"5000/tcp": [{"HostPort": "5001"}](flask2),说明映射配置生效。
4. 调整防火墙规则
若主机启用防火墙(如ufw),开放对应端口:
sudo ufw allow 5000/tcp sudo ufw allow 5001/tcp sudo ufw reload
云服务器用户需额外检查服务商安全组是否开放5000/5001端口。
5. 更换访问地址测试
本地环境可尝试用http://0.0.0.0:5000或http://localhost:5000访问;远程服务器需使用公网/局域网IP而非127.0.0.1。
6. 清理缓存重新构建
镜像缓存可能导致配置未更新,重新构建并启动:
sudo docker-compose down sudo docker-compose build --no-cache sudo docker-compose up
内容的提问来源于stack exchange,提问作者Hartk

