Docker 核心命令实战指南:从入门到生产级运维
Docker 已经成为后端开发和运维中不可或缺的工具。但很多开发者对它的使用停留在“复制粘贴能用就行”的阶段,遇到问题就不知从何下手。
本文将基于实际工作场景,从镜像管理、容器生命周期控制、网络与存储配置,到Dockerfile 编写和 Docker Compose 编排,系统梳理 Docker 的核心命令与最佳实践。
读完本文,你将能够:
熟练使用 Docker 常用命令完成日常开发与部署
编写优化的 Dockerfile 构建轻量级镜像
使用 Docker Compose 一键启动多容器应用
掌握容器故障排查的常用方法
一、Docker 核心概念速览
在开始敲命令之前,先理解 Docker 的 3 个核心组件:
概念 类比 说明
镜像(Image) 类 / 模板 只读的文件系统,包含运行应用所需的代码、依赖、配置
容器(Container) 对象 / 实例 镜像运行后的实例,是独立的运行单元
仓库(Repository) 代码仓库 存放镜像的地方,如 Docker Hub
理解这三者的关系:镜像 → 运行 → 容器。用同一个镜像可以创建无数个相互隔离的容器。
Docker vs 虚拟机:Docker 容器共享宿主机内核,启动快(秒级)、资源占用少;虚拟机需要模拟完整的操作系统,启动慢(分钟级)、资源开销大。
二、镜像管理:容器化的起点
镜像(Image)是静态的文件,就像“食材”。
2.1 搜索与拉取镜像
bash
# 从 Docker Hub 搜索镜像
docker search nginx
# 拉取镜像(默认 latest 标签)
docker pull nginx
# 拉取指定版本(生产环境强烈建议指定版本号)
docker pull nginx:1.25
docker pull alpine:3.18 # 轻量级基础镜像,仅约 5MB[reference:7]
生产环境最佳实践:显式指定版本号(如 nginx:1.25 而非 nginx:latest),避免因镜像更新导致兼容性问题。
2.2 查看与删除本地镜像
bash
# 查看本地所有镜像
docker images
# 或
docker image ls[reference:10]
# 删除指定镜像
docker rmi nginx:1.25
# 删除悬空镜像(
docker rmi $(docker images -q -f "dangling=true")[reference:11]
# 强制删除(慎用)
docker rmi -f nginx:latest[reference:12]
注意:如果有正在运行的容器基于该镜像创建,需要先停止并删除容器才能删除镜像。
2.3 镜像导入导出(离线传输)
bash
# 将镜像保存为 tar 文件
docker save -o my_nginx.tar nginx:latest[reference:14]
# 从 tar 文件加载镜像
docker load -i my_nginx.tar[reference:15]
2.4 查看镜像详细信息
bash
# 以 JSON 格式查看镜像元数据
docker inspect nginx:latest[reference:16]
# 查看镜像构建历史(每一层)
docker history nginx:latest[reference:17]
三、容器生命周期管理:核心操作
容器(Container)是运行起来的进程。
3.1 创建并运行容器:docker run
docker run 是最核心的命令,整合了创建、启动、附加三个操作。
bash
# 基础语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...][reference:20]
# 最常用的生产级启动命令
docker run -d \
--name my-web \
-p 8080:80 \
-v /data:/app/data \
--restart=always \
nginx:latest[reference:21]
核心参数详解:
参数 说明 示例
-d 后台运行(Detached 模式) -d
-it 交互式终端(调试用) -it alpine sh
--name 给容器起名 --name my-web
-p 端口映射:宿主机端口:容器端口 -p 8080:80
-v 挂载数据卷 -v /data:/app/data
-e 设置环境变量 -e TZ=Asia/Shanghai
--rm 容器退出后自动删除(适合临时测试) --rm
--restart 重启策略 --restart=always
--cpus / --memory 限制资源使用 --cpus=1.5 --memory=512m
3.2 两种运行模式
交互式容器(调试/测试用):
bash
# 启动并进入容器的 shell
docker run -it ubuntu /bin/bash[reference:31]
# 退出交互模式
exit # 退出后容器会停止
# 或按 Ctrl + P + Q # 退出但容器继续运行[reference:32]
守护式容器(生产环境用):
bash
docker run -d nginx[reference:33]
注意:如果 docker run -d ubuntu 启动后容器立即退出,是因为容器没有前台进程。Docker 容器必须有一个前台进程(如 nginx、top、tail -f)才能保持运行。
3.3 容器状态管理
bash
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a[reference:35]
# 启动已停止的容器
docker start my-web
# 停止运行中的容器(优雅停止,发送 SIGTERM)
docker stop my-web
# 强制停止(发送 SIGKILL)
docker kill my-web[reference:36]
# 重启容器
docker restart my-web[reference:37]
# 删除已停止的容器
docker rm my-web
# 强制删除正在运行的容器
docker rm -f my-web
# 删除所有停止的容器
docker rm $(docker ps -a -q)[reference:38]
3.4 查看容器状态
bash
# 实时查看容器资源占用(CPU/内存)
docker stats[reference:39]
# 查看容器内运行的进程
docker top my-web[reference:40]
四、容器调试与故障排查
服务出问题时,这三板斧最管用。
4.1 查看日志:docker logs
bash
# 实时跟踪日志(-f 表示 follow)
docker logs -f my-web[reference:42]
# 查看最后 200 行日志
docker logs -f --tail 200 my-web[reference:43]
# 查看最近 30 分钟的日志
docker logs --since 30m my-web[reference:44]
4.2 进入容器内部:docker exec
bash
# 进入运行中的容器(推荐方式,不会导致容器退出)
docker exec -it my-web /bin/bash[reference:45]
# Alpine 镜像没有 bash,用 sh
docker exec -it alpine-container /bin/sh[reference:46]
# 在容器内执行单条命令(不进入交互)
docker exec my-web ls -la /app[reference:47]
docker exec vs docker attach:exec 是在容器内启动新进程,退出不会影响容器;attach 是连接到容器主进程的终端,退出可能导致容器停止。
4.3 查看容器详情与文件拷贝
bash
# 查看容器详细信息(IP、挂载路径、环境变量等)
docker inspect my-web[reference:49]
# 宿主机 → 容器:拷贝文件
docker cp test.txt my-web:/app/[reference:50]
# 容器 → 宿主机:拷贝文件
docker cp my-web:/app/logs.txt ./[reference:51]
五、网络配置:让容器对外提供服务
容器默认处于独立的网络命名空间,外部无法直接访问。
5.1 端口映射
bash
# 基本端口映射:宿主机 8080 → 容器 80
docker run -d -p 8080:80 --name my-nginx nginx[reference:53]
# 指定 IP 和端口
docker run -d -p 10.0.0.1:8080:80 nginx[reference:54]
# 随机分配宿主机端口
docker run -d -p 80 nginx[reference:55]
# 多个端口映射
docker run -d -p 8080:80 -p 3306:3306 my-app[reference:56]
5.2 自定义网络(多容器通信)
对于多容器协同场景,建议创建自定义网络,容器间可通过容器名直接通信:
bash
# 创建自定义网络
docker network create app-network
# 在自定义网络中启动容器
docker run -d --network app-network --name mysql mysql:8.0
docker run -d --network app-network --name api my-api-image[reference:58]
这样,api 容器可以直接通过 mysql 这个主机名访问数据库,无需硬编码 IP 地址。
六、数据卷:让数据持久化
容器删除后,内部数据会丢失。数据卷(Volume)实现了数据与容器解耦。
6.1 数据卷操作命令
bash
# 创建数据卷
docker volume create app_data[reference:60]
# 查看所有数据卷
docker volume ls[reference:61]
# 查看数据卷详情
docker volume inspect app_data[reference:62]
# 删除数据卷
docker volume rm app_data[reference:63]
# 删除未使用的数据卷
docker volume prune[reference:64]
6.2 挂载数据卷到容器
bash
# 方式一:挂载命名数据卷
docker run -d -v app_data:/app/data --name my-app nginx[reference:65]
# 方式二:挂载宿主机目录(bind mount)
docker run -d -v /host/data:/container/data nginx
# 方式三:挂载宿主机目录(--mount 语法,更明确)
docker run -d --mount type=bind,source=/host/data,target=/container/data nginx
最佳实践:生产环境推荐使用命名数据卷(docker volume create),由 Docker 管理存储位置,更安全可控。
七、Dockerfile:构建自定义镜像
Dockerfile 是一个包含一系列指令的文本文件,每一条指令对应镜像中的一个层。
7.1 核心指令详解
指令 作用 示例
FROM 指定基础镜像(必须是第一条指令) FROM alpine:3.18
WORKDIR 设置工作目录 WORKDIR /app
COPY 复制文件到镜像 COPY . .
RUN 在构建时执行命令 RUN apk add --no-cache curl
CMD 容器启动时执行的命令(可被覆盖) CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT 容器启动时执行的命令(不可被覆盖) ENTRYPOINT ["python", "app.py"]
ENV 设置环境变量 ENV TZ=Asia/Shanghai
EXPOSE 声明容器监听的端口 EXPOSE 80
LABEL 添加元数据 LABEL maintainer="admin@example.com"
7.2 完整示例:Go 应用的多阶段构建
多阶段构建是减小镜像体积的关键技术:
dockerfile
# 第一阶段:构建环境
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 第二阶段:运行环境(使用 Alpine 精简镜像)
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"]
这个方案可将 Go 应用镜像从 800MB 压缩至 10MB 以内。
7.3 构建与优化技巧
bash
# 构建镜像
docker build -t myapp:v1 .[reference:73]
# 指定 Dockerfile 路径
docker build -t myapp:v2 -f ./docker/Dockerfile .[reference:74]
Dockerfile 最佳实践:
使用 Alpine 等轻量级基础镜像
合并 RUN 指令,减少镜像层数
利用层缓存:将不常变化的指令(如 RUN apk add)放在前面
使用 .dockerignore 排除 node_modules、.git 等无关文件
多阶段构建分离构建与运行环境
八、Docker Compose:多容器编排
当你需要同时运行 Web 应用、数据库、缓存等多个容器时,手动执行多个 docker run 命令非常繁琐。Docker Compose 让你用一个 YAML 文件定义所有服务,一条命令启动整个应用栈。
重要提醒:Compose V1(docker-compose 命令)已弃用,请使用 Compose V2(docker compose 命令)。
8.1 常用命令
bash
# 启动所有服务(-d 后台运行)
docker compose up -d[reference:82]
# 查看服务状态
docker compose ps[reference:83]
# 查看日志
docker compose logs -f[reference:84]
# 停止所有服务
docker compose down
# 停止并删除数据卷
docker compose down -v
# 拉取最新镜像
docker compose pull[reference:85]
# 重建并启动
docker compose up -d --build[reference:86]
8.2 Compose V1 vs V2 区别
特性 V1(已弃用) V2(推荐)
命令格式 docker-compose(带连字符) docker compose(空格分隔)
实现语言 Python Go
性能 较慢 显著提升
支持状态 已弃用 官方推荐
九、清理维护:防止磁盘占满
开发久了,一堆停止的容器和悬空镜像会占满磁盘。
bash
# 一键清理(核弹级命令):删除停止的容器、未使用的网络、悬空镜像
docker system prune[reference:92]
# 更彻底的清理(包括未使用的数据卷)
docker system prune -a --volumes
# 查看磁盘占用
docker system df
十、总结:高频命令速查表
场景 命令
拉取镜像 docker pull nginx:1.25
查看镜像 docker images
删除镜像 docker rmi nginx:1.25
构建镜像 docker build -t myapp:v1 .
运行容器(后台) docker run -d --name web -p 8080:80 nginx
运行容器(交互) docker run -it alpine sh
查看运行中容器 docker ps
查看所有容器 docker ps -a
停止容器 docker stop web
启动容器 docker start web
重启容器 docker restart web
删除容器 docker rm web
查看日志 docker logs -f web
进入容器 docker exec -it web /bin/bash
查看详情 docker inspect web
数据卷列表 docker volume ls
Compose 启动 docker compose up -d
Compose 停止 docker compose down
清理资源 docker system prune
Docker 的命令虽然多,但日常开发中高频使用的其实只有十几条。掌握这些核心命令,再配合 Dockerfile 和 Compose,就能高效完成容器化应用的开发与部署。