端口不响应需将python服务绑定到0.0.0.0;dockerfile中应先copy requirements.txt再pip install以利用缓存;docker-compose中服务间通信须用服务名而非localhost;开发时需配合--reload与正确挂载实现热重载;注意容器时区同步。

docker run 启动 Python Web 服务时端口不响应?检查 -p 参数和容器内绑定地址
常见现象是浏览器访问 localhost:8000 显示连接被拒绝,但 docker ps 显示容器在运行。根本原因不是 Docker 没启动,而是容器内应用没监听到外部可访问的地址。
Python Web 框架(如 Flask、FastAPI)默认只绑定 127.0.0.1:8000,这在容器里等于“只给本容器内部访问”,宿主机自然连不上。必须显式改成 0.0.0.0:8000。
- Flask 启动加
--host=0.0.0.0 --port=8000,别依赖默认值 - FastAPI 用
uvicorn main:app --host 0.0.0.0 --port 8000 -
docker run命令里-p 8000:8000是对的,但若容器内只听127.0.0.1,这个映射就失效 - 验证方式:进容器执行
netstat -tuln | grep :8000,确认输出里有0.0.0.0:8000或*:8000
Dockerfile 中 pip install 总失败?分层缓存 + requirements.txt 顺序是关键
每次改一行代码就重装全部依赖,不仅慢,还容易因网络抖动或 PyPI 临时故障中断。Docker 构建缓存机制能解决,但前提是 COPY 和 RUN pip install 的顺序写对。
- 先
COPY requirements.txt .,再RUN pip install -r requirements.txt,最后才COPY . . - 如果把源码
COPY放前面,哪怕只改了一个.py文件,Docker 也会丢弃之前所有缓存,重跑pip install - 确保
requirements.txt用pip freeze > requirements.txt生成,避免本地未提交的包版本漏掉 - 生产环境建议加
--no-cache-dir和--upgrade-strategy only-if-needed,减少镜像体积和冲突风险
用 docker-compose up 启动多个服务时,Python 应用连不上 PostgreSQL?networks 和 host 配置别写 localhost
错误日志常是 ConnectionRefusedError: [Errno 111] Connection refused,或 psycopg2.OperationalError: timeout expired。这不是数据库没启,而是 Python 代码里写了 host=localhost。
- Docker 容器间通信不能用
localhost——它指向容器自己,不是宿主机,更不是同 network 下的其他容器 -
docker-compose.yml里定义的服务名(如db:)会自动成为 DNS 名,Python 连接串应写host=db - 确保
depends_on只控制启动顺序,不保证服务已就绪;加健康检查或用wait-for-it.sh类脚本做依赖等待 - PostgreSQL 默认不接受外部连接,
docker-compose.yml中要配POSTGRES_HOST_AUTH_METHOD=trust或挂载自定义pg_hba.conf
开发时想实时看到 Python 代码修改效果?不要直接 docker run -v,用 volume + 代码热重载组合
单纯用 -v $(pwd):/app 挂载代码,可能发现改了文件,容器里进程却没重启,还是旧逻辑。因为 Python 进程本身不感知文件变化,得靠框架或工具触发 reload。
- Flask 开发模式加
--reload,FastAPI 用--reload(Uvicorn 自带),别只靠挂载 -
docker-compose.yml中volumes写法要明确路径映射,比如- .:/app,且确保容器内工作目录是/app - 注意文件权限:Mac / Windows 上挂载的文件可能被容器内用户(如
nonroot)无权读取,加user: "1001:1001"或改基础镜像用户 - 某些 IDE(如 VS Code Remote-Containers)会自动注入
devcontainer.json配置,比手写docker-compose.yml更稳
最麻烦的其实是时间同步和时区——容器里时间不对,日志、JWT token、数据库事务时间戳全乱。启动时加 -v /etc/localtime:/etc/localtime:ro,或者镜像里 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











