Files
cs-note/gyh/docker/Docker常用命令.md
2026-05-24 11:42:38 +08:00

10 KiB
Raw Permalink Blame History

tags, create time
tags create time
docker
devops
containerization
reference
2026-04-28 14:40

Docker 常用命令

按「容器生命周期」组织的命令速查手册。从拉取镜像到清理收尾,日常 90% 的操作都在以下命令中。建议收藏,用时直接翻。

概述

Docker 的命令体系看似庞杂,但本质上围绕四个核心对象展开:镜像(Image)→ 容器(Container)→ 网络(Network)→ 数据卷(Volume)。

[!tip] 记忆框架 理解这个生命周期,所有命令就不需要死记了:

flowchart LR
    A["拉取镜像"] --> B["构建镜像"]
    B --> C["运行容器"]
    C --> D["调试/监控"]
    D --> E["停止/删除"]
    E --> F["清理回收"]
    F --> A

    style A fill:#e3f2fd
    style B fill:#fff3e0
    style C fill:#e8f5e9
    style D fill:#f3e5f5
    style E fill:#fce4ec
    style F fill:#efebe9

正文

一、镜像管理(Image)

[!info] 镜像 = 只读模板 镜像是容器的"蓝图"。同一个镜像可以运行多个容器实例,它们互不影响。

# 拉取镜像
docker pull nginx:latest          # 拉取最新标签
docker pull redis:7-alpine        # 拉取精简版(alpine 体积更小)
docker pull node:20-slim

# 查看所有镜像
docker images                     # 或 docker image ls

# 搜索镜像
docker search nginx               # 搜索官方和社区镜像

# 给镜像打标签
docker tag my-app:latest myrepo/my-app:v1.0

# 删除镜像
docker rmi nginx                  # 删除单个
docker rmi $(docker images -q)    # 删除所有镜像(谨慎!)

# 构建镜像
docker build -t my-app:v1.0 .     # 当前目录构建(默认用 Dockerfile)
docker build -t my-app:v1.0 -f Dockerfile.prod .  # 指定 Dockerfile

[!tip] 镜像分层缓存 docker build 从上到下逐行执行,每一行都会生成一层缓存。把不变的部分放前面(安装依赖),变化的部分放后面(复制代码),充分利用缓存加速。


二、容器管理(Container)

[!abstract] 容器 = 镜像的运行实例 容器是轻量级、隔离的进程。删除容器 = 停止进程 + 释放资源,容器内部写入的数据默认会丢失(除非挂载了 Volume)。

# 运行容器
docker run -d -p 8080:80 --name web nginx
# -d       后台运行(detached)
# -p 8080:80  宿主机端口:容器端口
# --name   容器名称(方便后续操作)

# 前台运行(查看日志用)
docker run -it --rm nginx bash
# -i  交互式  -t 终端  --rm 退出后自动删除

# 查看所有容器(含已停止的)
docker ps -a                      # 或 docker container ls -a

# 查看运行中的容器
docker ps

# 启动/停止/重启容器
docker start web
docker stop web                   # 优雅停止(发 SIGTERM,等 10s 后 SIGKILL)
docker restart web
docker kill web                   # 强制停止(发 SIGKILL)

# 进入运行中的容器
docker exec -it web bash          # 在运行中的容器里执行命令
docker exec -it web sh            # 有些精简镜像没有 bash,用 sh

# 删除容器
docker rm web                     # 删除已停止的容器
docker rm -f web                  # 强制删除运行中的容器

# 查看容器日志
docker logs web
docker logs -f web                # 实时跟踪日志(类似 tail -f)
docker logs --tail 100 web        # 只看最后 100 行

docker run 常用参数速查:

参数 作用
-d 后台运行
-p host:container 端口映射
-v host:container 挂载卷
-e KEY=VALUE 设置环境变量
--name 容器名称
--network 指定网络
--restart=always 容器崩溃/开机自动重启
--rm 退出后自动删除(临时调试用)
-it 交互式终端
--gpus all 启用 GPU(NVIDIA)

三、网络管理(Network)

[!question] 为什么容器能互相"看见"? 答:Docker 为每个容器分配独立 IP,同一网络下的容器可以通过容器名(自动 DNS 解析)互相通信。

# 查看所有网络
docker network ls

# 创建自定义网络
docker network create my-network

# 容器加入指定网络
docker run -d --name web1 --network my-network nginx
docker run -d --name db1 --network my-network mysql

# 容器间通过名称互相访问(自动 DNS 解析)
docker exec web1 ping db1         # 在同一网络下可直接 ping 容器名

# 删除网络
docker network rm my-network

[!note] 为什么需要自定义网络? Docker 默认的 bridge 网络不支持容器名 DNS 解析。自定义网络可以让容器通过名字互相通信。


四、数据卷(Volume)

[!danger] 容器是易失的(ephemeral) 删除容器 = 容器内数据消失!必须用 -v 把数据持久化到 Volume 或宿主机目录。

# 查看所有卷
docker volume ls

# 创建卷
docker volume create my-data

# 挂载卷到容器
docker run -d -v my-data:/data --name app nginx

# 挂载宿主机目录到容器(bind mount)
docker run -d -v /host/path:/container/path nginx

# 只读挂载
docker run -d -v my-data:/data:ro nginx

# 查看卷详情
docker volume inspect my-data

五、日志与调试

# 进入容器
docker exec -it <容器名> bash

# 查看容器资源占用
docker stats

# 查看容器详情(JSON 格式)
docker inspect web

# 查看容器进程
docker top web

# 拷贝文件进出容器
docker cp container.log web:/tmp/
docker cp web:/tmp/remote.log ./local.log

# 查看镜像构建历史
docker history my-app:v1.0

六、清理命令(重要!)

[!warning] 磁盘占用会持续增长 停止的容器、未使用的镜像、悬空卷会悄悄吃掉磁盘空间。定期清理是好习惯。

# 删除所有已停止的容器
docker container prune

# 删除所有未使用的镜像
docker image prune -a

# 删除所有未使用的卷
docker volume prune

# 一键清理(容器+镜像+卷+网络,谨慎使用)
docker system prune -a

# 查看磁盘占用
docker system df

七、常用完整命令场景

7.1 运行 Nginx

docker run -d \
  -p 80:80 \
  -v ./nginx.conf:/etc/nginx/nginx.conf:ro \
  -v ./html:/usr/share/nginx/html \
  --name my-nginx \
  --restart=always \
  nginx:alpine

7.2 运行 MySQL

docker run -d \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=root123 \
  -e MYSQL_DATABASE=mydb \
  -v mysql-data:/var/lib/mysql \
  --name my-mysql \
  --restart=always \
  mysql:8.0

7.3 运行 Redis

docker run -d \
  -p 6379:6379 \
  -v redis-data:/data \
  --name my-redis \
  --restart=always \
  redis:7-alpine redis-server --appendonly yes

7.4 运行 Node 开发环境

docker run -it \
  -p 3000:3000 \
  -v $(pwd):/app \
  -w /app \
  node:20 \
  bash
# -v $(pwd):/app   挂载项目目录,修改代码实时生效
# -w /app          设置工作目录

八、进阶:Docker 网络模式

Docker 提供四种网络模式:

模式 特点 适用场景
bridge(默认) 容器有独立 IP 大多数场景
host 共享宿主机网络,性能最好 高性能需求
none 无网络(完全隔离) 安全隔离
container 共享另一个容器的网络命名空间 特殊协作
# bridge(默认)
docker run -d --network bridge nginx

# host
docker run -d --network host nginx

# none
docker run -d --network none nginx

# container(共享 web 容器的网络)
docker run -d --network container:web nginx

# 推荐:自定义 bridge 网络
docker network create my-net
docker run -d --network my-net --name app nginx

九、进阶:日志驱动

# 查看容器的日志配置
docker inspect web | grep LogConfig
驱动类型 说明
json-file 默认,日志写入文件
local 循环写入,控制大小
syslog 发送到 syslog
journald 发送到 systemd journal
none 不记录日志
# docker-compose 中限制日志大小
services:
  api:
    logging:
      driver: json-file
      options:
        max-size: "10m"    # 单个日志文件最大 10MB
        max-file: "3"      # 最多保留 3 个文件

十、进阶:资源限制

[!tip] 为什么需要限制资源? 防止某个容器吃光 CPU/内存导致宿主机崩溃,这是多容器环境的必修课。

# 限制 CPU 和内存
docker run -d \
  --cpus="1.5" \
  --memory="512m" \
  --memory-swap="1g" \
  --pids-limit=100 \
  nginx
# --cpus           限制 1.5 个 CPU 核心
# --memory         限制 512MB 内存
# --memory-swap    允许使用的 swap 总量
# --pids-limit     最多 100 个进程(防 fork 炸弹)

十一、进阶:Docker Swarm(简易集群)

[!info] Swarm vs Kubernetes Swarm 适合单节点或小团队快速上手。大规模生产环境建议直接用 Kubernetes。

# 初始化集群(单节点)
docker swarm init

# 查看节点
docker node ls

# 创建服务(Swarm 管理方式)
docker service create --name web -p 80:80 --replicas 3 nginx

# 扩容
docker service scale web=5

# 查看服务
docker service ls

# 零停机滚动更新
docker service update --image nginx:1.25 web

# 删除服务
docker service rm web

# 退出集群
docker swarm leave

# 多节点集群
docker swarm init --advertise-addr <IP>
docker swarm join-token manager   # 获取管理节点令牌
docker swarm join-token worker    # 获取工作节点令牌

快速速查表

操作 命令
启动 Docker 服务 systemctl start docker
查看版本 docker --version
查看信息 docker info
登录镜像仓库 docker login
推送镜像 docker push my-app:v1.0
导出镜像 docker save -o my-app.tar my-app:v1.0
导入镜像 docker load -i my-app.tar
查看容器日志 docker logs -f <容器名>
进入容器 docker exec -it <容器名> bash
停止所有容器 docker stop $(docker ps -q)
删除所有容器 docker rm -f $(docker ps -aq)
查看磁盘占用 docker system df
全面清理 docker system prune -a

关联笔记