mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-24 18:55:31 +00:00
Remove blank lines after code block markers
This commit is contained in:
@@ -10,7 +10,6 @@ flowchart LR
|
||||
Write --> Delete[容器删除]
|
||||
Delete -->|数据都在容器 writable 层| Lost[DATA LOST! ❌]
|
||||
```
|
||||
|
||||
数据卷 (Volume) 解决了这个问题,它的生命周期独立于容器。
|
||||
|
||||
---
|
||||
@@ -42,7 +41,6 @@ graph TD
|
||||
Lifecycle[生命周期 = 容器生命周期] -.-> Container
|
||||
Delete[容器删除] -->|导致| DataLost[数据丢失 ❌]
|
||||
```
|
||||
|
||||
#### 数据卷:推荐
|
||||
|
||||
```mermaid
|
||||
@@ -58,7 +56,6 @@ graph TD
|
||||
AppDir == 挂载 ==> Volume
|
||||
Delete[容器删除] -.->|不会影响| Volume
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 8.1.4 数据卷基本操作
|
||||
@@ -68,7 +65,6 @@ graph TD
|
||||
```bash
|
||||
$ docker volume create my-vol
|
||||
```
|
||||
|
||||
#### 列出所有数据卷
|
||||
|
||||
```bash
|
||||
@@ -78,7 +74,6 @@ local my-vol
|
||||
local postgres_data
|
||||
local redis_data
|
||||
```
|
||||
|
||||
#### 查看数据卷详情
|
||||
|
||||
```bash
|
||||
@@ -95,7 +90,6 @@ $ docker volume inspect my-vol
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
**关键字段**:
|
||||
|
||||
- `Mountpoint`:数据卷在宿主机上的实际存储位置
|
||||
@@ -113,7 +107,6 @@ $ docker run -d \
|
||||
--mount source=my-vol,target=/usr/share/nginx/html \
|
||||
nginx
|
||||
```
|
||||
|
||||
**参数说明**:
|
||||
|
||||
| 参数 | 说明 |
|
||||
@@ -130,7 +123,6 @@ $ docker run -d \
|
||||
-v my-vol:/usr/share/nginx/html \
|
||||
nginx
|
||||
```
|
||||
|
||||
**格式**:`-v 数据卷名:容器路径[:选项]`
|
||||
|
||||
#### 两种方式对比
|
||||
@@ -147,7 +139,6 @@ $ docker run -d \
|
||||
#### 只读挂载
|
||||
|
||||
```bash
|
||||
|
||||
## --mount 方式
|
||||
|
||||
$ docker run -d \
|
||||
@@ -160,7 +151,6 @@ $ docker run -d \
|
||||
-v my-vol:/data:ro \
|
||||
nginx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 8.1.6 使用场景示例
|
||||
@@ -168,7 +158,6 @@ $ docker run -d \
|
||||
#### 场景一:数据库持久化
|
||||
|
||||
```bash
|
||||
|
||||
## 创建数据卷
|
||||
|
||||
$ docker volume create postgres_data
|
||||
@@ -193,11 +182,9 @@ $ docker run -d \
|
||||
-v postgres_data:/var/lib/postgresql/data \
|
||||
postgres:16
|
||||
```
|
||||
|
||||
#### 场景二:多容器共享数据
|
||||
|
||||
```bash
|
||||
|
||||
## 创建共享数据卷
|
||||
|
||||
$ docker volume create shared-data
|
||||
@@ -214,11 +201,9 @@ $ docker run --rm \
|
||||
-v shared-data:/data \
|
||||
alpine cat /data/log.txt
|
||||
```
|
||||
|
||||
#### 场景三:配置文件持久化
|
||||
|
||||
```bash
|
||||
|
||||
## 将 nginx 配置存储在数据卷中
|
||||
|
||||
$ docker run -d \
|
||||
@@ -227,7 +212,6 @@ $ docker run -d \
|
||||
-p 80:80 \
|
||||
nginx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 8.1.7 数据卷管理
|
||||
@@ -235,7 +219,6 @@ $ docker run -d \
|
||||
#### 删除数据卷
|
||||
|
||||
```bash
|
||||
|
||||
## 删除指定数据卷
|
||||
|
||||
$ docker volume rm my-vol
|
||||
@@ -244,11 +227,9 @@ $ docker volume rm my-vol
|
||||
|
||||
$ docker rm -v container_name
|
||||
```
|
||||
|
||||
#### 清理未使用的数据卷
|
||||
|
||||
```bash
|
||||
|
||||
## 查看未被任何容器使用的数据卷
|
||||
|
||||
$ docker volume ls -f dangling=true
|
||||
@@ -261,7 +242,6 @@ $ docker volume prune
|
||||
|
||||
$ docker volume prune -f
|
||||
```
|
||||
|
||||
> ⚠️ **注意**:数据卷不会自动垃圾回收。长期运行的系统应定期清理无用数据卷。
|
||||
|
||||
---
|
||||
@@ -271,7 +251,6 @@ $ docker volume prune -f
|
||||
#### 备份数据卷
|
||||
|
||||
```bash
|
||||
|
||||
## 使用临时容器挂载数据卷,打包备份
|
||||
|
||||
$ docker run --rm \
|
||||
@@ -279,7 +258,6 @@ $ docker run --rm \
|
||||
-v $(pwd):/backup \
|
||||
alpine tar czf /backup/my-vol-backup.tar.gz -C /source .
|
||||
```
|
||||
|
||||
**原理**:
|
||||
|
||||
1. 创建临时容器
|
||||
@@ -290,7 +268,6 @@ $ docker run --rm \
|
||||
#### 恢复数据卷
|
||||
|
||||
```bash
|
||||
|
||||
## 创建新数据卷
|
||||
|
||||
$ docker volume create my-vol-restored
|
||||
@@ -302,7 +279,6 @@ $ docker run --rm \
|
||||
-v $(pwd):/backup:ro \
|
||||
alpine tar xzf /backup/my-vol-backup.tar.gz -C /target
|
||||
```
|
||||
|
||||
#### 备份脚本示例
|
||||
|
||||
```bash
|
||||
@@ -321,7 +297,6 @@ docker run --rm \
|
||||
|
||||
echo "Backed up ${VOLUME_NAME} to ${BACKUP_DIR}/${VOLUME_NAME}_${TIMESTAMP}.tar.gz"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 8.1.9 数据卷 vs 绑定挂载
|
||||
@@ -337,7 +312,6 @@ Docker 有两种主要的数据持久化方式:
|
||||
| **备份** | 需要工具 | 直接访问文件 |
|
||||
|
||||
```bash
|
||||
|
||||
## 数据卷
|
||||
|
||||
$ docker run -v mydata:/app/data nginx
|
||||
@@ -346,7 +320,6 @@ $ docker run -v mydata:/app/data nginx
|
||||
|
||||
$ docker run -v /host/path:/app/data nginx
|
||||
```
|
||||
|
||||
详见[绑定挂载](8.2_bind-mounts.md)章节。
|
||||
|
||||
---
|
||||
@@ -358,11 +331,9 @@ $ docker run -v /host/path:/app/data nginx
|
||||
```bash
|
||||
$ docker inspect container_name --format '{{json .Mounts}}' | jq
|
||||
```
|
||||
|
||||
#### Q:数据卷的数据在哪里?
|
||||
|
||||
```bash
|
||||
|
||||
## 查看数据卷详情
|
||||
|
||||
$ docker volume inspect my-vol
|
||||
@@ -371,7 +342,6 @@ $ docker volume inspect my-vol
|
||||
|
||||
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data"
|
||||
```
|
||||
|
||||
> ⚠️ **注意**:不建议直接修改 Mountpoint 中的文件,应通过容器操作。
|
||||
|
||||
#### Q:如何在不同机器间迁移数据卷?
|
||||
|
||||
@@ -16,7 +16,6 @@ flowchart LR
|
||||
|
||||
Dir1 <-->|Bind Mount| Dir2
|
||||
```
|
||||
|
||||
目录结构(同一份文件):
|
||||
```text
|
||||
/home/user/code/ (或 /usr/share/nginx/html/)
|
||||
@@ -24,7 +23,6 @@ flowchart LR
|
||||
├── style.css
|
||||
└── app.js
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 8.2.2 Bind Mount vs Volume
|
||||
@@ -60,7 +58,6 @@ $ docker run -d \
|
||||
--mount type=bind,source=/宿主机路径,target=/容器路径 \
|
||||
nginx
|
||||
```
|
||||
|
||||
#### 使用 -v:简写
|
||||
|
||||
```bash
|
||||
@@ -68,7 +65,6 @@ $ docker run -d \
|
||||
-v /宿主机路径:/容器路径 \
|
||||
nginx
|
||||
```
|
||||
|
||||
#### 两种语法对比
|
||||
|
||||
| 特性 | --mount | -v |
|
||||
@@ -86,7 +82,6 @@ $ docker run -d \
|
||||
#### 场景一:开发环境代码同步
|
||||
|
||||
```bash
|
||||
|
||||
## 将本地代码目录挂载到容器
|
||||
|
||||
$ docker run -d \
|
||||
@@ -102,40 +97,33 @@ $ echo "Hello" > src/index.html
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
#### 场景二:配置文件挂载
|
||||
|
||||
```bash
|
||||
|
||||
## 挂载自定义 nginx 配置
|
||||
|
||||
$ docker run -d \
|
||||
--mount type=bind,source=/path/to/nginx.conf,target=/etc/nginx/nginx.conf,readonly \
|
||||
nginx
|
||||
```
|
||||
|
||||
#### 场景三:日志收集
|
||||
|
||||
```bash
|
||||
|
||||
## 将容器日志输出到宿主机目录
|
||||
|
||||
$ docker run -d \
|
||||
--mount type=bind,source=/var/log/myapp,target=/app/logs \
|
||||
myapp
|
||||
```
|
||||
|
||||
#### 场景四:共享 SSH 密钥
|
||||
|
||||
```bash
|
||||
|
||||
## 挂载 SSH 密钥(只读)
|
||||
|
||||
$ docker run --rm -it \
|
||||
--mount type=bind,source=$HOME/.ssh,target=/root/.ssh,readonly \
|
||||
alpine ssh user@remote
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 8.2.5 只读挂载
|
||||
@@ -143,7 +131,6 @@ $ docker run --rm -it \
|
||||
防止容器修改宿主机文件:
|
||||
|
||||
```bash
|
||||
|
||||
## --mount 语法
|
||||
|
||||
$ docker run -d \
|
||||
@@ -156,20 +143,17 @@ $ docker run -d \
|
||||
-v /config:/app/config:ro \
|
||||
myapp
|
||||
```
|
||||
|
||||
容器内尝试写入会报错:
|
||||
|
||||
```bash
|
||||
$ touch /app/config/new.txt
|
||||
touch: /app/config/new.txt: Read-only file system
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 8.2.6 挂载单个文件
|
||||
|
||||
```bash
|
||||
|
||||
## 挂载 bash 历史记录
|
||||
|
||||
$ docker run --rm -it \
|
||||
@@ -182,7 +166,6 @@ $ docker run -d \
|
||||
--mount type=bind,source=/path/to/my.cnf,target=/etc/mysql/my.cnf \
|
||||
mysql
|
||||
```
|
||||
|
||||
> ⚠️ **注意**:挂载单个文件时,如果宿主机上的文件被编辑器替换 (而非原地修改),容器内仍是旧文件的 inode。建议重启容器或挂载目录。
|
||||
|
||||
---
|
||||
@@ -192,7 +175,6 @@ $ docker run -d \
|
||||
```bash
|
||||
$ docker inspect mycontainer --format '{{json .Mounts}}' | jq
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```json
|
||||
@@ -207,7 +189,6 @@ $ docker inspect mycontainer --format '{{json .Mounts}}' | jq
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `Type` | 挂载类型 (bind)|
|
||||
@@ -227,7 +208,6 @@ $ docker run --mount type=bind,source=/not/exist,target=/app nginx
|
||||
docker: Error response from daemon: invalid mount config for type "bind":
|
||||
bind source path does not exist: /not/exist
|
||||
```
|
||||
|
||||
**解决**:确保源路径存在,或改用 `-v` (会自动创建)
|
||||
|
||||
#### Q:权限问题
|
||||
@@ -235,7 +215,6 @@ bind source path does not exist: /not/exist
|
||||
容器内用户可能无权访问挂载的文件:
|
||||
|
||||
```bash
|
||||
|
||||
## 方法1:确保宿主机文件权限允许容器用户访问
|
||||
|
||||
$ chmod -R 755 /path/to/data
|
||||
@@ -248,18 +227,15 @@ $ docker run -u root ...
|
||||
|
||||
$ docker run -u $(id -u):$(id -g) ...
|
||||
```
|
||||
|
||||
#### Q:macOS/Windows 性能问题
|
||||
|
||||
在 Docker Desktop 上,Bind Mount 性能较差 (需要跨文件系统同步):
|
||||
|
||||
```bash
|
||||
|
||||
## 使用 :cached 或 :delegated 提高性能(macOS)
|
||||
|
||||
$ docker run -v /host/path:/container/path:cached myapp
|
||||
```
|
||||
|
||||
| 选项 | 说明 |
|
||||
|------|------|
|
||||
| `:cached` | 宿主机权威,容器读取可能延迟 |
|
||||
@@ -273,31 +249,25 @@ $ docker run -v /host/path:/container/path:cached myapp
|
||||
#### 1. 开发环境使用 Bind Mount
|
||||
|
||||
```bash
|
||||
|
||||
## 代码热更新
|
||||
|
||||
$ docker run -v $(pwd):/app -p 3000:3000 node npm run dev
|
||||
```
|
||||
|
||||
#### 2. 生产环境使用 Volume
|
||||
|
||||
```bash
|
||||
|
||||
## 数据持久化
|
||||
|
||||
$ docker run -v mysql_data:/var/lib/mysql mysql
|
||||
```
|
||||
|
||||
#### 3. 配置文件使用只读挂载
|
||||
|
||||
```bash
|
||||
$ docker run -v /config/nginx.conf:/etc/nginx/nginx.conf:ro nginx
|
||||
```
|
||||
|
||||
#### 4. 注意路径安全
|
||||
|
||||
```bash
|
||||
|
||||
## ❌ 危险:挂载根目录或敏感目录
|
||||
|
||||
$ docker run -v /:/host ...
|
||||
@@ -306,5 +276,4 @@ $ docker run -v /:/host ...
|
||||
|
||||
$ docker run -v /app/data:/data ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -15,13 +15,11 @@
|
||||
```bash
|
||||
$ docker run --mount type=tmpfs,destination=/run,tmpfs-size=67108864,tmpfs-mode=1770 nginx
|
||||
```
|
||||
|
||||
也可以使用 `--tmpfs` 简写语法:
|
||||
|
||||
```bash
|
||||
$ docker run --tmpfs /run:size=64m nginx
|
||||
```
|
||||
|
||||
> **注意**:`--tmpfs` 支持的选项有限,主要为 `size` 和 `mode`。如果需要更精细的控制(如 `noexec`、`nosuid`),推荐使用 `--mount` 语法并通过 `tmpfs-mode` 参数设置权限。
|
||||
|
||||
### 8.3.3 注意事项
|
||||
|
||||
Reference in New Issue
Block a user