This repository has been archived on 2026-05-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
all-in-kingsoft/gyh/docker/Docker常用命令.md
T

434 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags:
- docker
- devops
- containerization
- reference
create time: 2026-04-28 14:40
---
# Docker 常用命令
> 按「容器生命周期」组织的命令速查手册。从拉取镜像到清理收尾,日常 90% 的操作都在以下命令中。建议收藏,用时直接翻。
## 概述
Docker 的命令体系看似庞杂,但本质上围绕四个核心对象展开:**镜像(Image)→ 容器(Container)→ 网络(Network)→ 数据卷(Volume)**。
> [!tip] 记忆框架
> 理解这个生命周期,所有命令就不需要死记了:
```mermaid
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] 镜像 = 只读模板
> 镜像是容器的"蓝图"。同一个镜像可以运行多个容器实例,它们互不影响。
```bash
# 拉取镜像
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)。
```bash
# 运行容器
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 解析)互相通信。
```bash
# 查看所有网络
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 或宿主机目录。
```bash
# 查看所有卷
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
```
---
### 五、日志与调试
```bash
# 进入容器
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] 磁盘占用会持续增长
> 停止的容器、未使用的镜像、悬空卷会悄悄吃掉磁盘空间。定期清理是好习惯。
```bash
# 删除所有已停止的容器
docker container prune
# 删除所有未使用的镜像
docker image prune -a
# 删除所有未使用的卷
docker volume prune
# 一键清理(容器+镜像+卷+网络,谨慎使用)
docker system prune -a
# 查看磁盘占用
docker system df
```
---
### 七、常用完整命令场景
#### 7.1 运行 Nginx
```bash
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
```bash
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
```bash
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 开发环境
```bash
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` | 共享另一个容器的网络命名空间 | 特殊协作 |
```bash
# 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
```
---
### 九、进阶:日志驱动
```bash
# 查看容器的日志配置
docker inspect web | grep LogConfig
```
| 驱动类型 | 说明 |
|----------|------|
| `json-file` | 默认,日志写入文件 |
| `local` | 循环写入,控制大小 |
| `syslog` | 发送到 syslog |
| `journald` | 发送到 systemd journal |
| `none` | 不记录日志 |
```yaml
# docker-compose 中限制日志大小
services:
api:
logging:
driver: json-file
options:
max-size: "10m" # 单个日志文件最大 10MB
max-file: "3" # 最多保留 3 个文件
```
---
### 十、进阶:资源限制
> [!tip] 为什么需要限制资源?
> 防止某个容器吃光 CPU/内存导致宿主机崩溃,这是多容器环境的必修课。
```bash
# 限制 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。
```bash
# 初始化集群(单节点)
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` |
---
## 关联笔记
- [[Dockerfile编写指南]] — 编写高效的 Dockerfile
- [[docker-compose]] — 用 Compose 编排多容器应用