Docker & Docker Compose部署与排查常用命令总结

Docker & Docker Compose部署与排查常用命令总结

在应用容器化部署中,Docker(容器引擎)与Docker Compose(多容器编排工具)是核心工具。本文分部署阶段(构建/启动)、排查阶段(故障定位)两部分,总结常用命令及实战场景,帮你高效完成部署并快速解决问题。


一、部署阶段:核心命令

1. Docker 基础命令

(1)构建镜像:docker build

  • 作用:根据Dockerfile构建容器镜像(应用的"打包文件")。
  • 示例
    # 构建镜像(标签格式:仓库名:版本号)
    docker build -t myapp:v1 .
    
  • 关键参数
    • -t:指定镜像标签(必填,用于识别镜像);
    • --no-cache:不使用缓存(强制重新构建,避免旧缓存导致的问题);
    • --build-arg:传递构建时变量(如--build-arg ENV=prod,用于区分开发/生产环境)。

(2)启动容器:docker run

  • 作用:基于镜像启动容器(运行应用)。
  • 示例
    # 后台运行容器,映射主机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,传递数据库配置)。

(3)推送/拉取镜像:docker push/docker pull

  • 作用:将镜像上传到远程仓库(如Docker Hub、Harbor)或从仓库下载镜像(用于多环境部署)。
  • 示例
    # 推送镜像到Docker Hub(需先登录:docker login)
    docker push username/myapp:v1
    # 从Docker Hub拉取镜像
    docker pull username/myapp:v1
    

2. Docker Compose 核心命令

(1)启动服务:docker compose up

  • 作用:根据docker-compose.yml(服务配置文件)启动所有服务(多容器协同)。
  • 示例
    # 后台启动服务,重新构建镜像(若Dockerfile有更新)
    docker compose up -d --build
    
  • 关键参数
    • -d:后台运行;
    • --build:启动前重新构建镜像(确保使用最新代码);
    • --force-recreate:强制重新创建容器(忽略缓存,适合版本更新);
    • -f:指定配置文件(如-f docker-compose.prod.yml,用于生产环境)。

(2)停止服务:docker compose down

  • 作用:停止并删除服务的容器、网络(不删除数据卷)。
  • 示例
    # 停止服务并删除容器、网络
    docker compose down
    # 停止服务并删除数据卷(谨慎使用,会丢失持久化数据)
    docker compose down -v
    

(3)查看服务状态:docker compose ps

  • 作用:查看服务的容器状态(运行中、停止、异常)。
  • 示例
    # 查看所有服务状态(包括停止的)
    docker compose ps -a
    

二、部署失败:排查命令

1. 日志查看:docker logs/docker compose logs

  • 作用:查看容器/服务的日志(排查故障的第一步骤,大部分问题能从日志中找到原因)。
  • 示例
    # 查看单个容器的实时日志(跟踪最新输出)
    docker logs -f mycontainer
    # 查看Docker Compose服务的日志(如"web"服务)
    docker compose logs -f web
    
  • 关键参数
    • -f:跟踪实时日志(follow,持续输出);
    • --tail:查看最后N行日志(如--tail 100,快速定位最新错误);
    • -t:显示日志时间戳(便于定位时间点)。

2. 状态与详情检查:docker ps/docker inspect

(1)查看容器状态:docker ps

  • 作用:查看容器的运行状态(如Up:运行中、Exited:停止、Restarting:重启中)。
  • 示例
    # 查看所有容器(包括停止的)
    docker ps -a
    
  • 关键参数
    • -a:显示所有容器(默认只显示运行中的);
    • -q:仅显示容器ID(用于批量操作,如docker stop $(docker ps -q)停止所有运行中的容器)。

(2)查看容器详情:docker inspect

  • 作用:查看容器的详细配置(如网络、挂载卷、环境变量、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模板语法提取特定字段,适合快速定位问题。

3. 配置验证:docker compose config

  • 作用:检查docker-compose.yml配置文件的有效性(如语法错误、缩进问题、变量引用错误)。
  • 示例
    # 验证配置文件(无输出表示有效)
    docker compose config --quiet
    # 验证并输出配置文件(带注释,便于查看)
    docker compose config --validate
    
  • 说明:部署前必做!避免因配置文件错误导致部署失败(如depends_on拼写错误、端口映射格式错误)。

4. 资源监控:docker stats

  • 作用:实时查看容器的资源使用情况(CPU、内存、网络、磁盘IO)。
  • 示例
    # 查看所有容器的资源使用情况
    docker stats
    # 查看指定容器的资源使用情况
    docker stats mycontainer
    
  • 说明:用于排查资源耗尽问题(如内存溢出导致容器崩溃,exit code 137)。

5. 依赖检查:docker compose ps

  • 作用:查看服务的依赖关系(如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
    

四、最佳实践建议

  1. 配置文件分层:用docker-compose.yml(基础配置)和docker-compose.prod.yml(生产环境配置)分层管理,避免重复配置(如-f docker-compose.yml -f docker-compose.prod.yml合并配置)。
  2. 环境变量管理:用.env文件存储环境变量(如DB_URLPORT),在docker-compose.yml中引用(如${DB_URL}),避免硬编码。
  3. 集中化日志:使用ELK Stack(Elasticsearch+Logstash+Kibana)或Prometheus+Grafana收集容器日志,便于统一查看和分析(避免登录每个容器看日志)。
  4. 保留旧版本镜像:部署新版本前,保留旧版本镜像(如myapp:v1myapp:v2),若新版本部署失败,可快速回滚:
docker compose down
docker compose up -d --force-recreate --no-build  # 使用旧版本镜像启动
  1. 定期清理资源:定期清理未使用的镜像、容器、数据卷(如docker image prunedocker container prunedocker volume prune),释放磁盘空间。

总结

Docker与Docker Compose的命令体系覆盖了部署的全流程,掌握构建、启动、日志查看、状态检查等核心命令,能快速解决部署中的常见问题。建议结合实战场景(如端口冲突、配置错误)反复练习,形成"日志→状态→配置→资源"的排查思路,提高部署效率。

参考资料