刚接到任务,要在测试环境搭个新服务,想着用容器快速部署服务器应用,结果一通操作下来,服务起不来,端口连不上,日志一堆报错。这种情况太常见了,别急,多数问题都出在几个关键细节上。
镜像拉取失败?检查网络和源
很多人图快,直接写个 docker-compose.yml 就 run,结果卡在 pulling image。公司内网没配私有镜像源,又没提前拉好基础镜像,自然卡住。建议先手动试一下拉取命令:
docker pull nginx:alpine
如果超时,就得考虑换国内镜像加速源,比如阿里云提供的容器镜像服务,改下 daemon.json 就能提速。
端口没映射,外边根本访问不到
最典型的低级错误:容器跑起来了,docker ps 显示运行中,但浏览器一访问就拒绝连接。查了一圈才发现,启动时没加 -p 8080:80,或者 compose 文件里 ports 写错了。
ports:
- "8080:80"
记住,冒号前面是宿主机端口,后面是容器内部端口,顺序别颠倒。本地调试用 8080 没问题,上了正式环境记得检查防火墙和安全组。
配置文件没挂载,改了也白搭
有个同事部署了个 Node.js 应用,改了 config.js,重启容器后发现还是老配置。问题出在没做 volume 挂载,代码更新根本没进容器。正确做法:
volumes:
- ./app:/usr/src/app
这样本地代码一改,容器里实时同步(开发环境适用)。生产环境建议重新构建镜像,避免意外修改。
依赖服务没启动,主服务一直报错
微服务架构下,A 服务依赖数据库或 Redis。一键部署时,主应用启动速度比 MySQL 快,连不上就直接崩了。Docker Compose 默认并行启动,不会等数据库 ready。
解决办法是在启动脚本里加个等待逻辑,比如用 shell 重试检测数据库端口:
until nc -z db 3306; do
echo "等待数据库启动..."
sleep 2
done
或者用现成的工具如 wait-for-it.sh,避免服务因依赖未就绪而退出。
日志看不见?别忘了查看输出
容器启动后立刻退出,查不出原因?别光看界面,赶紧执行:
docker logs 容器名
很多问题一眼就能定位,比如缺少环境变量、配置语法错误、权限不足。建议部署前先把命令加个 -it 跑一次,实时看输出。
快速部署不是盲目快,而是靠规范流程和经验避坑。每次上线前花十分钟检查端口、网络、挂载和依赖,能省下几小时排错时间。