vault backup: 2026-04-28 21:55:18

This commit is contained in:
2026-04-28 21:55:18 +08:00
parent 793bc530aa
commit 0620da28ad
4 changed files with 616 additions and 596 deletions
+131 -60
View File
@@ -1,10 +1,48 @@
---
tags:
- docker
- devops
- containerization
- reference
create time: 2026-04-28 14:40
---
# Docker 常用命令
> 按「生命周期」组织,从拉取镜像到清理收尾,日常 90% 的操作都在以下命令中。
> 按「容器生命周期」组织的命令速查手册。从拉取镜像到清理收尾,日常 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)
## 正文
### 一、镜像管理(Image)
> [!info] 镜像 = 只读模板
> 镜像是容器的"蓝图"。同一个镜像可以运行多个容器实例,它们互不影响。
```bash
# 拉取镜像
@@ -23,18 +61,22 @@ docker tag my-app:latest myrepo/my-app:v1.0
# 删除镜像
docker rmi nginx # 删除单个
docker rmi $(docker images -q) # 删除所有镜像(谨慎)
docker rmi $(docker images -q) # 删除所有镜像(谨慎!)
# 构建镜像
docker build -t my-app:v1.0 . # 当前目录构建(默认用 Dockerfile)
docker build -t my-app:v1.0 -f Dockerfile.prod . # 指定 Dockerfile
```
**镜像分层缓存:** `docker build` 从上到下逐行执行,每一行都会生成一层缓存。把**不变的部分放前面**(安装依赖),**变化的部分放后面**(复制代码),充分利用缓存加速。
> [!tip] 镜像分层缓存
> `docker build` 从上到下逐行执行,每一行都会生成一层缓存。把**不变的部分放前面**(安装依赖),**变化的部分放后面**(复制代码),充分利用缓存加速。
---
## 二、容器管理(Container)
### 二、容器管理(Container)
> [!abstract] 容器 = 镜像的运行实例
> 容器是轻量级、隔离的进程。删除容器 = 停止进程 + 释放资源,容器内部写入的数据默认会丢失(除非挂载了 Volume)。
```bash
# 运行容器
@@ -90,7 +132,10 @@ docker logs --tail 100 web # 只看最后 100 行
---
## 三、网络管理(Network)
### 三、网络管理(Network)
> [!question] 为什么容器能互相"看见"?
> 答:Docker 为每个容器分配独立 IP,同一网络下的容器可以通过**容器名**(自动 DNS 解析)互相通信。
```bash
# 查看所有网络
@@ -110,11 +155,15 @@ docker exec web1 ping db1 # 在同一网络下可直接 ping 容器名
docker network rm my-network
```
> **为什么需要自定义网络?** Docker 默认的 `bridge` 网络不支持容器名 DNS 解析。自定义网络(`docker network create`)可以让容器通过**名字**互相通信。
> [!note] 为什么需要自定义网络?
> Docker 默认的 `bridge` 网络不支持容器名 DNS 解析。自定义网络可以让容器通过**名字**互相通信。
---
## 四、数据卷(Volume)
### 四、数据卷(Volume)
> [!danger] 容器是易失的(ephemeral)
> 删除容器 = 容器内数据消失!必须用 `-v` 把数据持久化到 Volume 或宿主机目录。
```bash
# 查看所有卷
@@ -136,11 +185,9 @@ docker run -d -v my-data:/data:ro nginx
docker volume inspect my-data
```
> **数据持久化原则:** 容器是** ephemeral(易失的)**——删除容器,容器内的数据就没了。必须用 `-v` 把数据存到宿主机或 Docker Volume 中。
---
## 五、日志与调试
### 五、日志与调试
```bash
# 进入容器
@@ -149,7 +196,7 @@ docker exec -it <容器名> bash
# 查看容器资源占用
docker stats
# 查看容器详情
# 查看容器详情(JSON 格式)
docker inspect web
# 查看容器进程
@@ -159,13 +206,16 @@ docker top web
docker cp container.log web:/tmp/
docker cp web:/tmp/remote.log ./local.log
# 查看容器创建命令
docker history my-app:v1.0 # 查看镜像构建历史
# 查看镜像构建历史
docker history my-app:v1.0
```
---
## 六、清理命令(重要!)
### 六、清理命令(重要!)
> [!warning] 磁盘占用会持续增长
> 停止的容器、未使用的镜像、悬空卷会悄悄吃掉磁盘空间。定期清理是好习惯。
```bash
# 删除所有已停止的容器
@@ -186,9 +236,9 @@ docker system df
---
## 七、常用完整命令场景
### 七、常用完整命令场景
### 7.1 运行 Nginx
#### 7.1 运行 Nginx
```bash
docker run -d \
@@ -200,7 +250,7 @@ docker run -d \
nginx:alpine
```
### 7.2 运行 MySQL
#### 7.2 运行 MySQL
```bash
docker run -d \
@@ -213,18 +263,18 @@ docker run -d \
mysql:8.0
```
### 7.3 运行 Redis
#### 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
--restart=always
```
### 7.4 运行 Node 开发环境
#### 7.4 运行 Node 开发环境
```bash
docker run -it \
@@ -239,41 +289,53 @@ docker run -it \
---
## 七、进阶:Docker 网络模式
### 八、进阶:Docker 网络模式
Docker 提供四种网络模式:
| 模式 | 特点 | 适用场景 |
|------|------|----------|
| `bridge`(默认) | 容器有独立 IP | 大多数场景 |
| `host` | 共享宿主机网络,性能最好 | 高性能需求 |
| `none` | 无网络(完全隔离) | 安全隔离 |
| `container` | 共享另一个容器的网络命名空间 | 特殊协作 |
```bash
# Docker 提供四种网络模式
# 1. bridge(默认)— 桥接网络,容器有独立 IP
# bridge(默认)
docker run -d --network bridge nginx
# 2. host — 共享宿主机网络,性能最好但端口会冲突
# host
docker run -d --network host nginx
# 3. none — 无网络(隔离)
# none
docker run -d --network none nginx
# 4. container — 共享另一个容器的网络命名空间
# container(共享 web 容器的网络)
docker run -d --network container:web nginx
# 推荐使用自定义 bridge 网络(前面已讲过)
# 推荐:自定义 bridge 网络
docker network create my-net
docker run -d --network my-net --name app nginx
```
## 八、进阶:Docker 日志驱动
---
### 九、进阶:日志驱动
```bash
# 查看容器的日志配置
docker inspect web | grep LogConfig
```
# 日志驱动类型
# json-file — 默认,日志写入文件
# local — 循环写入,控制大小
# syslog — 发送到 syslog
# journald — 发送到 systemd journal
# none — 不记录日志
| 驱动类型 | 说明 |
|----------|------|
| `json-file` | 默认,日志写入文件 |
| `local` | 循环写入,控制大小 |
| `syslog` | 发送到 syslog |
| `journald` | 发送到 systemd journal |
| `none` | 不记录日志 |
```yaml
# docker-compose 中限制日志大小
services:
api:
@@ -284,31 +346,33 @@ services:
max-file: "3" # 最多保留 3 个文件
```
## 九、进阶:Docker 资源限制
---
### 十、进阶:资源限制
> [!tip] 为什么需要限制资源?
> 防止某个容器吃光 CPU/内存导致宿主机崩溃,这是多容器环境的必修课。
```bash
# 限制 CPU 和内存
docker run -d \
--cpus="1.5" \ # 限制 1.5 个 CPU 核心
--memory="512m" \ # 限制 512MB 内存
--memory-swap="1g" \ # 允许使用的 swap 总量
--pids-limit=100 \ # 最多 100 个进程(防 fork 炸弹)
--cpus="1.5" \
--memory="512m" \
--memory-swap="1g" \
--pids-limit=100 \
nginx
# docker-compose 中配置
services:
api:
deploy:
resources:
limits:
cpus: '1.5'
memory: 512M
reservations:
cpus: '0.5'
memory: 128M
# --cpus 限制 1.5 个 CPU 核心
# --memory 限制 512MB 内存
# --memory-swap 允许使用的 swap 总量
# --pids-limit 最多 100 个进程(防 fork 炸弹)
```
## 十、进阶:Docker Swarm(简易集群)
---
### 十一、进阶:Docker Swarm(简易集群)
> [!info] Swarm vs Kubernetes
> Swarm 适合单节点或小团队快速上手。大规模生产环境建议直接用 Kubernetes。
```bash
# 初始化集群(单节点)
@@ -326,7 +390,7 @@ docker service scale web=5
# 查看服务
docker service ls
# 更新服务(零停机滚动更新)
# 零停机滚动更新
docker service update --image nginx:1.25 web
# 删除服务
@@ -335,15 +399,15 @@ docker service rm web
# 退出集群
docker swarm leave
# 初始化集群 + 管理节点令牌 + 工作节点令牌
# 多节点集群
docker swarm init --advertise-addr <IP>
docker swarm join-token manager # 添加管理节点
docker swarm join-token worker # 添加工作节点
docker swarm join-token manager # 获取管理节点令牌
docker swarm join-token worker # 获取工作节点令牌
```
> Swarm 适合轻量级部署。大规模生产环境建议用 Kubernetes。
---
## 十一、快速速查表
## 快速速查表
| 操作 | 命令 |
|------|------|
@@ -360,3 +424,10 @@ docker swarm join-token worker # 添加工作节点
| 删除所有容器 | `docker rm -f $(docker ps -aq)` |
| 查看磁盘占用 | `docker system df` |
| 全面清理 | `docker system prune -a` |
---
## 关联笔记
- [[Dockerfile编写指南]] — 编写高效的 Dockerfile
- [[docker-compose]] — 用 Compose 编排多容器应用