Docker & Docker Compose部署与排查常用命令总结
在应用容器化部署中,Docker(容器引擎)与Docker Compose(多容器编排工具)是核心工具。本文分部署阶段(构建/启动)、排查阶段(故障定位)两部分,总结常用命令及实战场景,帮你高效完成部署并快速解决问题。
一、部署阶段:核心命令
1. Docker 基础命令
docker build
(1)构建镜像:- 作用:根据
Dockerfile
构建容器镜像(应用的"打包文件")。 - 示例:
# 构建镜像(标签格式:仓库名:版本号) docker build -t myapp:v1 .
- 关键参数:
-t
:指定镜像标签(必填,用于识别镜像);--no-cache
:不使用缓存(强制重新构建,避免旧缓存导致的问题);--build-arg
:传递构建时变量(如--build-arg ENV=prod
,用于区分开发/生产环境)。
docker run
(2)启动容器:- 作用:基于镜像启动容器(运行应用)。
- 示例:
# 后台运行容器,映射主机80端口到容器80端口,挂载数据卷 docker run -d -p 80:80 -v ./data:/app/data myapp:v1
- 关键参数:
-d
:后台运行(detach
,不占用终端);-p
:端口映射(主机端口:容器端口
,让外部访问容器内服务);-v
:挂载数据卷(主机路径:容器路径
,持久化数据,避免容器删除后数据丢失);--restart
:重启策略(如always
:容器退出时自动重启,适合生产环境);-e
:设置环境变量(如-e DB_URL=mysql://user:pass@db:3306
,传递数据库配置)。
docker push
/docker pull
(3)推送/拉取镜像:- 作用:将镜像上传到远程仓库(如Docker Hub、Harbor)或从仓库下载镜像(用于多环境部署)。
- 示例:
# 推送镜像到Docker Hub(需先登录:docker login) docker push username/myapp:v1 # 从Docker Hub拉取镜像 docker pull username/myapp:v1
2. Docker Compose 核心命令
docker compose up
(1)启动服务:- 作用:根据
docker-compose.yml
(服务配置文件)启动所有服务(多容器协同)。 - 示例:
# 后台启动服务,重新构建镜像(若Dockerfile有更新) docker compose up -d --build
- 关键参数:
-d
:后台运行;--build
:启动前重新构建镜像(确保使用最新代码);--force-recreate
:强制重新创建容器(忽略缓存,适合版本更新);-f
:指定配置文件(如-f docker-compose.prod.yml
,用于生产环境)。
docker compose down
(2)停止服务:- 作用:停止并删除服务的容器、网络(不删除数据卷)。
- 示例:
# 停止服务并删除容器、网络 docker compose down # 停止服务并删除数据卷(谨慎使用,会丢失持久化数据) docker compose down -v
docker compose ps
(3)查看服务状态:- 作用:查看服务的容器状态(运行中、停止、异常)。
- 示例:
# 查看所有服务状态(包括停止的) docker compose ps -a
二、部署失败:排查命令
docker logs
/docker compose logs
1. 日志查看:- 作用:查看容器/服务的日志(排查故障的第一步骤,大部分问题能从日志中找到原因)。
- 示例:
# 查看单个容器的实时日志(跟踪最新输出) docker logs -f mycontainer # 查看Docker Compose服务的日志(如"web"服务) docker compose logs -f web
- 关键参数:
-f
:跟踪实时日志(follow
,持续输出);--tail
:查看最后N行日志(如--tail 100
,快速定位最新错误);-t
:显示日志时间戳(便于定位时间点)。
docker ps
/docker inspect
2. 状态与详情检查:docker ps
(1)查看容器状态:- 作用:查看容器的运行状态(如
Up
:运行中、Exited
:停止、Restarting
:重启中)。 - 示例:
# 查看所有容器(包括停止的) docker ps -a
- 关键参数:
-a
:显示所有容器(默认只显示运行中的);-q
:仅显示容器ID(用于批量操作,如docker stop $(docker ps -q)
停止所有运行中的容器)。
docker inspect
(2)查看容器详情:- 作用:查看容器的详细配置(如网络、挂载卷、环境变量、exit code)。
- 示例:
# 查看容器的IP地址(用于网络问题排查) docker inspect --format '{{.NetworkSettings.IPAddress}}' mycontainer # 查看容器的环境变量(验证配置是否正确) docker inspect --format '{{.Config.Env}}' mycontainer # 查看容器的退出原因(若容器停止) docker inspect --format '{{.State.ExitCode}} {{.State.Error}}' mycontainer
- 说明:
--format
参数用Go模板语法提取特定字段,适合快速定位问题。
docker compose config
3. 配置验证:- 作用:检查
docker-compose.yml
配置文件的有效性(如语法错误、缩进问题、变量引用错误)。 - 示例:
# 验证配置文件(无输出表示有效) docker compose config --quiet # 验证并输出配置文件(带注释,便于查看) docker compose config --validate
- 说明:部署前必做!避免因配置文件错误导致部署失败(如
depends_on
拼写错误、端口映射格式错误)。
docker stats
4. 资源监控:- 作用:实时查看容器的资源使用情况(CPU、内存、网络、磁盘IO)。
- 示例:
# 查看所有容器的资源使用情况 docker stats # 查看指定容器的资源使用情况 docker stats mycontainer
- 说明:用于排查资源耗尽问题(如内存溢出导致容器崩溃,
exit code 137
)。
docker compose ps
5. 依赖检查:- 作用:查看服务的依赖关系(如
depends_on
配置的服务是否启动)。 - 示例:
# 查看"web"服务依赖的"db"服务状态 docker compose ps web db
- 说明:若依赖服务未启动(如
db
服务状态为Exited
),需先解决依赖问题(如查看db
服务的日志)。
三、常见失败场景及解决命令
1. 端口冲突
- 现象:启动容器时提示"
port is already allocated
"(端口已被占用)。 - 解决命令:
# 查看主机端口占用情况(Linux) netstat -tuln | grep :80 # 查看容器端口映射情况(如"mycontainer"的80端口映射到主机的哪个端口) docker port mycontainer # 停止占用端口的容器(如停止所有映射80端口的容器) docker stop $(docker ps -q --filter "publish=80")
2. 镜像不存在
- 现象:启动容器时提示"
image not found
"(镜像未找到)。 - 解决命令:
# 查看本地镜像(是否存在指定标签的镜像) docker images | grep myapp:v1 # 从远程仓库拉取镜像(若本地没有) docker pull username/myapp:v1
3. 配置文件错误
- 现象:启动服务时提示"
invalid compose file
"(配置文件无效)。 - 解决命令:
# 验证配置文件(找出语法错误) docker compose config --validate # 查看配置文件的缩进问题(用cat或vim查看) cat docker-compose.yml
4. 依赖服务未启动
- 现象:"web"服务启动失败,日志提示"
无法连接到db服务
"。 - 解决命令:
# 查看"db"服务的状态(是否运行中) docker compose ps db # 查看"db"服务的日志(找出启动失败原因) docker compose logs -f db # 重启"db"服务 docker compose restart db
5. 容器崩溃(Exit Code非0)
- 现象:
docker ps -a
显示容器状态为Exited (1)
(退出码1表示错误)。 - 解决命令:
# 查看容器的退出原因(exit code和错误信息) docker inspect --format '{{.State.ExitCode}} {{.State.Error}}' mycontainer # 查看容器的最后100行日志(定位错误原因) docker logs --tail 100 mycontainer
四、最佳实践建议
- 配置文件分层:用
docker-compose.yml
(基础配置)和docker-compose.prod.yml
(生产环境配置)分层管理,避免重复配置(如-f docker-compose.yml -f docker-compose.prod.yml
合并配置)。 - 环境变量管理:用
.env
文件存储环境变量(如DB_URL
、PORT
),在docker-compose.yml
中引用(如${DB_URL}
),避免硬编码。 - 集中化日志:使用ELK Stack(Elasticsearch+Logstash+Kibana)或Prometheus+Grafana收集容器日志,便于统一查看和分析(避免登录每个容器看日志)。
- 保留旧版本镜像:部署新版本前,保留旧版本镜像(如
myapp:v1
、myapp:v2
),若新版本部署失败,可快速回滚:
docker compose down
docker compose up -d --force-recreate --no-build # 使用旧版本镜像启动
- 定期清理资源:定期清理未使用的镜像、容器、数据卷(如
docker image prune
、docker container prune
、docker volume prune
),释放磁盘空间。
总结
Docker与Docker Compose的命令体系覆盖了部署的全流程,掌握构建、启动、日志查看、状态检查等核心命令,能快速解决部署中的常见问题。建议结合实战场景(如端口冲突、配置错误)反复练习,形成"日志→状态→配置→资源"的排查思路,提高部署效率。
参考资料:
- Docker官方文档:https://docs.docker.com/
- Docker Compose官方文档:https://docs.docker.com/compose/
- Docker命令速查:https://docs.docker.com/reference/