Docker 核心命令实战指南:从入门到生产级运维

2026-07-02 13:11:27

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,就能高效完成容器化应用的开发与部署。