mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-11 20:31:18 +00:00
style: apply global formatting fixes (struct, spacing, zhlint)
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# 第八章 数据与网络管理
|
||||
# 第八章数据与网络管理
|
||||
|
||||
本章将介绍 Docker 中的数据管理与网络配置。
|
||||
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
## 挂载主机目录
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 什么是绑定挂载
|
||||
|
||||
Bind Mount(绑定挂载)将**宿主机的目录或文件**直接挂载到容器中。容器可以读写宿主机的文件系统。
|
||||
Bind Mount (绑定挂载) 将**宿主机的目录或文件**直接挂载到容器中。容器可以读写宿主机的文件系统。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
@@ -32,6 +34,10 @@ flowchart LR
|
||||
| **适用场景** | 开发环境、配置文件 | 生产数据持久化 |
|
||||
| **备份** | 直接访问文件 | 需要通过 Docker |
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 选择建议
|
||||
|
||||
| 需求 | 推荐方案 |
|
||||
@@ -47,7 +53,9 @@ flowchart LR
|
||||
|
||||
### 基本语法
|
||||
|
||||
#### 使用 --mount(推荐)
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 使用 --mount (推荐)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -57,7 +65,7 @@ $ docker run -d \
|
||||
nginx
|
||||
```
|
||||
|
||||
#### 使用 -v(简写)
|
||||
#### 使用 -v (简写)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -79,6 +87,8 @@ $ docker run -d \
|
||||
|
||||
### 使用场景
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 场景一:开发环境代码同步
|
||||
|
||||
运行以下命令:
|
||||
@@ -182,7 +192,7 @@ $ docker run -d \
|
||||
mysql
|
||||
```
|
||||
|
||||
> ⚠️ **注意**:挂载单个文件时,如果宿主机上的文件被编辑器替换(而非原地修改),容器内仍是旧文件的 inode。建议重启容器或挂载目录。
|
||||
> ⚠️ **注意**:挂载单个文件时,如果宿主机上的文件被编辑器替换 (而非原地修改),容器内仍是旧文件的 inode。建议重启容器或挂载目录。
|
||||
|
||||
---
|
||||
|
||||
@@ -221,7 +231,9 @@ $ docker inspect mycontainer --format '{{json .Mounts}}' | jq
|
||||
|
||||
### 常见问题
|
||||
|
||||
#### Q: 路径不存在报错
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:路径不存在报错
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -231,9 +243,9 @@ docker: Error response from daemon: invalid mount config for type "bind":
|
||||
bind source path does not exist: /not/exist
|
||||
```
|
||||
|
||||
**解决**:确保源路径存在,或改用 `-v`(会自动创建)
|
||||
**解决**:确保源路径存在,或改用 `-v` (会自动创建)
|
||||
|
||||
#### Q: 权限问题
|
||||
#### Q:权限问题
|
||||
|
||||
容器内用户可能无权访问挂载的文件:
|
||||
|
||||
@@ -251,9 +263,9 @@ $ docker run -u root ...
|
||||
$ docker run -u $(id -u):$(id -g) ...
|
||||
```
|
||||
|
||||
#### Q: macOS/Windows 性能问题
|
||||
#### Q:macOS/Windows 性能问题
|
||||
|
||||
在 Docker Desktop 上,Bind Mount 性能较差(需要跨文件系统同步):
|
||||
在 Docker Desktop 上,Bind Mount 性能较差 (需要跨文件系统同步):
|
||||
|
||||
```bash
|
||||
## 使用 :cached 或 :delegated 提高性能(macOS)
|
||||
@@ -271,7 +283,9 @@ $ docker run -v /host/path:/container/path:cached myapp
|
||||
|
||||
### 最佳实践
|
||||
|
||||
#### 1. 开发环境使用 Bind Mount
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1。开发环境使用 Bind Mount
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -281,7 +295,7 @@ $ docker run -v /host/path:/container/path:cached myapp
|
||||
$ docker run -v $(pwd):/app -p 3000:3000 node npm run dev
|
||||
```
|
||||
|
||||
#### 2. 生产环境使用 Volume
|
||||
#### 2。生产环境使用 Volume
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -291,7 +305,7 @@ $ docker run -v $(pwd):/app -p 3000:3000 node npm run dev
|
||||
$ docker run -v mysql_data:/var/lib/mysql mysql
|
||||
```
|
||||
|
||||
#### 3. 配置文件使用只读挂载
|
||||
#### 3。配置文件使用只读挂载
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -299,7 +313,7 @@ $ docker run -v mysql_data:/var/lib/mysql mysql
|
||||
$ docker run -v /config/nginx.conf:/etc/nginx/nginx.conf:ro nginx
|
||||
```
|
||||
|
||||
#### 4. 注意路径安全
|
||||
#### 4。注意路径安全
|
||||
|
||||
运行以下命令:
|
||||
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
|
||||
### 基本用法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```bash
|
||||
$ docker run --tmpfs /run:rw,noexec,nosuid,size=64m nginx
|
||||
```
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
## 数据卷
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 为什么需要数据卷
|
||||
|
||||
容器的存储层有一个关键问题:**容器删除后,数据就没了**。
|
||||
@@ -11,7 +13,7 @@ flowchart LR
|
||||
Delete -->|数据都在容器 writable 层| Lost[DATA LOST! ❌]
|
||||
```
|
||||
|
||||
数据卷(Volume)解决了这个问题,它的生命周期独立于容器。
|
||||
数据卷 (Volume) 解决了这个问题,它的生命周期独立于容器。
|
||||
|
||||
---
|
||||
|
||||
@@ -29,7 +31,11 @@ flowchart LR
|
||||
|
||||
### 数据卷 vs 容器存储层
|
||||
|
||||
#### 容器存储层(不推荐存储重要数据)
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 容器存储层 (不推荐存储重要数据)
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
@@ -43,7 +49,9 @@ graph TD
|
||||
Delete[容器删除] -->|导致| DataLost[数据丢失 ❌]
|
||||
```
|
||||
|
||||
#### 数据卷(推荐)
|
||||
#### 数据卷 (推荐)
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
@@ -63,6 +71,8 @@ graph TD
|
||||
|
||||
### 数据卷基本操作
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 创建数据卷
|
||||
|
||||
运行以下命令:
|
||||
@@ -104,13 +114,15 @@ $ docker volume inspect my-vol
|
||||
|
||||
**关键字段**:
|
||||
- `Mountpoint`:数据卷在宿主机上的实际存储位置
|
||||
- `Driver`:存储驱动(默认 local,也可以用第三方驱动)
|
||||
- `Driver`:存储驱动 (默认 local,也可以用第三方驱动)
|
||||
|
||||
---
|
||||
|
||||
### 挂载数据卷
|
||||
|
||||
#### 方式一:--mount(推荐)
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 方式一:--mount (推荐)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -129,7 +141,7 @@ $ docker run -d \
|
||||
| `target` | 容器内挂载路径 |
|
||||
| `readonly` | 可选,只读挂载 |
|
||||
|
||||
#### 方式二:-v(简写)
|
||||
#### 方式二:-v (简写)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -172,6 +184,8 @@ $ docker run -d \
|
||||
|
||||
### 使用场景示例
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 场景一:数据库持久化
|
||||
|
||||
运行以下命令:
|
||||
@@ -242,6 +256,8 @@ $ docker run -d \
|
||||
|
||||
### 数据卷管理
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 删除数据卷
|
||||
|
||||
运行以下命令:
|
||||
@@ -280,6 +296,8 @@ $ docker volume prune -f
|
||||
|
||||
### 数据卷备份与恢复
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 备份数据卷
|
||||
|
||||
运行以下命令:
|
||||
@@ -360,13 +378,15 @@ $ docker run -v mydata:/app/data nginx
|
||||
$ docker run -v /host/path:/app/data nginx
|
||||
```
|
||||
|
||||
详见 [绑定挂载](bind-mounts.md) 章节。
|
||||
详见[绑定挂载](bind-mounts.md)章节。
|
||||
|
||||
---
|
||||
|
||||
### 常见问题
|
||||
|
||||
#### Q: 如何知道容器使用了哪些数据卷?
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:如何知道容器使用了哪些数据卷?
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -374,7 +394,7 @@ $ docker run -v /host/path:/app/data nginx
|
||||
$ docker inspect container_name --format '{{json .Mounts}}' | jq
|
||||
```
|
||||
|
||||
#### Q: 数据卷的数据在哪里?
|
||||
#### Q:数据卷的数据在哪里?
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -390,7 +410,7 @@ $ docker volume inspect my-vol
|
||||
|
||||
> ⚠️ **注意**:不建议直接修改 Mountpoint 中的文件,应通过容器操作。
|
||||
|
||||
#### Q: 如何在不同机器间迁移数据卷?
|
||||
#### Q:如何在不同机器间迁移数据卷?
|
||||
|
||||
1. 在源机器备份:`docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar czf /backup/data.tar.gz -C /data .`
|
||||
2. 传输 tar.gz 文件
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
# 网络配置
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
## Docker 网络概述
|
||||
|
||||
Docker 容器需要网络来:
|
||||
- 与外部世界通信(访问互联网、被外部访问)
|
||||
- 与外部世界通信 (访问互联网、被外部访问)
|
||||
- 容器之间相互通信
|
||||
- 与宿主机通信
|
||||
|
||||
@@ -47,6 +49,8 @@ graph TD
|
||||
|
||||
### 数据流向
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph Comm1 ["容器间通信"]
|
||||
@@ -89,7 +93,9 @@ ghi789... none null local
|
||||
|
||||
---
|
||||
|
||||
## 用户自定义网络(推荐)
|
||||
## 用户自定义网络 (推荐)
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 为什么要用自定义网络
|
||||
|
||||
@@ -148,6 +154,8 @@ flowchart LR
|
||||
|
||||
## 容器互联
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 同一网络内的容器
|
||||
|
||||
同一自定义网络内的容器可以直接通信:
|
||||
@@ -238,6 +246,8 @@ $ docker port mycontainer
|
||||
|
||||
### 端口映射示意图
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Req["外部请求 http://宿主机IP:8080"] --> Host["宿主机:8080"]
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
## 配置 DNS
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 容器的 DNS 机制
|
||||
|
||||
Docker 容器的 DNS 配置有两种情况:
|
||||
|
||||
1. **默认 Bridge 网络**:继承宿主机的 DNS 配置(`/etc/resolv.conf`)。
|
||||
2. **自定义网络**(推荐):使用 Docker 嵌入式 DNS 服务器 (Embedded DNS),支持通过**容器名**进行服务发现。
|
||||
1. **默认 Bridge 网络**:继承宿主机的 DNS 配置 (`/etc/resolv.conf`)。
|
||||
2. **自定义网络** (推荐):使用 Docker 嵌入式 DNS 服务器 (Embedded DNS),支持通过**容器名**进行服务发现。
|
||||
|
||||
---
|
||||
|
||||
### 嵌入式 DNS
|
||||
|
||||
这是 Docker 网络最强大的功能之一。在自定义网络中,容器可以通过"名字"找到彼此,而不需要知道对方的 IP(因为 IP 可能会变)。
|
||||
这是 Docker 网络最强大的功能之一。在自定义网络中,容器可以通过 “名字” 找到彼此,而不需要知道对方的 IP (因为 IP 可能会变)。
|
||||
|
||||
```bash
|
||||
## 1. 创建自定义网络
|
||||
@@ -30,13 +32,13 @@ PING web (172.18.0.2): 56 data bytes
|
||||
```
|
||||
|
||||
**原理**:
|
||||
Docker 守护进程在 `127.0.0.11` 运行了一个 DNS 服务器。容器内的 DNS 请求会被转发到这里。如果是容器名,解析为容器 IP;如果是外部域名(如 google.com),转发给上游 DNS。
|
||||
Docker 守护进程在 `127.0.0.11` 运行了一个 DNS 服务器。容器内的 DNS 请求会被转发到这里。如果是容器名,解析为容器 IP;如果是外部域名 (如 google.com),转发给上游 DNS。
|
||||
|
||||
---
|
||||
|
||||
### 配置 DNS 参数
|
||||
|
||||
如果你需要手动配置容器的 DNS(例如使用内网 DNS 服务器),可以在 `docker run` 中使用以下参数:
|
||||
如果你需要手动配置容器的 DNS (例如使用内网 DNS 服务器),可以在 `docker run` 中使用以下参数:
|
||||
|
||||
#### 1. --dns
|
||||
|
||||
@@ -67,7 +69,7 @@ $ docker run -h myweb nginx
|
||||
|
||||
### 全局 DNS 配置
|
||||
|
||||
如果希望所有容器都使用特定的 DNS 服务器(而不是继承宿主机),可以修改 `/etc/docker/daemon.json`:
|
||||
如果希望所有容器都使用特定的 DNS 服务器 (而不是继承宿主机),可以修改 `/etc/docker/daemon.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -84,17 +86,19 @@ $ docker run -h myweb nginx
|
||||
|
||||
### 常见问题
|
||||
|
||||
#### Q: 容器无法解析域名
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:容器无法解析域名
|
||||
|
||||
**现象**:`ping www.baidu.com` 失败,但 `ping 8.8.8.8` 成功。**解决**:
|
||||
1. 宿主机的 `/etc/resolv.conf` 可能有问题(例如使用了本地回环地址 127.0.0.53,特别是 Ubuntu 系统)。Docker 可能会尝试修复,但有时会失败。
|
||||
1. 宿主机的 `/etc/resolv.conf` 可能有问题 (例如使用了本地回环地址 127.0.0.53,特别是 Ubuntu 系统)。Docker 可能会尝试修复,但有时会失败。
|
||||
2. 尝试手动指定 DNS:`docker run --dns 8.8.8.8 ...`
|
||||
3. 检查防火墙是否拦截了 UDP 53 端口。
|
||||
|
||||
#### Q: 无法通过容器名通信
|
||||
#### Q:无法通过容器名通信
|
||||
|
||||
**现象**:`ping db` 提示 `bad address 'db'`。**原因**:
|
||||
- 你可能在使用**默认的 bridge 网络**。默认 bridge 网络**不支持**通过容器名进行 DNS 解析(这是一个历史遗留设计)。
|
||||
- 你可能在使用**默认的 bridge 网络**。默认 bridge 网络**不支持**通过容器名进行 DNS 解析 (这是一个历史遗留设计)。
|
||||
- **解决**:使用自定义网络 (`docker network create ...`)。
|
||||
|
||||
---
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
## 外部访问容器
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 为什么要映射端口
|
||||
|
||||
容器运行在自己的隔离网络环境中(通常是 Bridge 模式)。这意味着:
|
||||
- **容器之间**:可以通过 IP 或容器名(自定义网络)互通。
|
||||
容器运行在自己的隔离网络环境中 (通常是 Bridge 模式)。这意味着:
|
||||
- **容器之间**:可以通过 IP 或容器名 (自定义网络) 互通。
|
||||
- **宿主机访问容器**:可以通过容器 IP 访问。
|
||||
- **外部网络访问容器**:❌ 默认无法直接访问。
|
||||
|
||||
为了让外部(如你的浏览器、其他局域网机器)访问容器内的服务,我们需要将容器的端口**映射**到宿主机的端口。
|
||||
为了让外部 (如你的浏览器、其他局域网机器) 访问容器内的服务,我们需要将容器的端口**映射**到宿主机的端口。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
@@ -20,7 +22,9 @@ flowchart TD
|
||||
|
||||
### 端口映射方式
|
||||
|
||||
#### 1. 指定映射
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1。指定映射
|
||||
|
||||
Docker 提供了多种方式来指定端口映射,最常用的是 `-p` 参数。
|
||||
|
||||
@@ -44,12 +48,12 @@ $ docker run -d -p 8080:80 nginx
|
||||
| `hostPort:containerPort` | 绑定所有 IP (0.0.0.0) 的特定端口 | `-p 8080:80` (默认) |
|
||||
| `containerPort` | 绑定所有 IP 的随机端口 | `-p 80` |
|
||||
|
||||
#### 2. 随机映射
|
||||
#### 2。随机映射
|
||||
|
||||
如果您不关心宿主机使用哪个端口,可以使用随机映射功能。
|
||||
|
||||
|
||||
使用 `-P` (大写) 参数,Docker 会随机映射 Dockerfile 中 `EXPOSE` 指令暴露的所有端口到宿主机的高端口(49000-49900)。
|
||||
使用 `-P` (大写) 参数,Docker 会随机映射 Dockerfile 中 `EXPOSE` 指令暴露的所有端口到宿主机的高端口 (49000-49900)。
|
||||
|
||||
```bash
|
||||
$ docker run -d -P nginx
|
||||
@@ -69,6 +73,8 @@ abc123456 0.0.0.0:49153->80/tcp
|
||||
|
||||
### 查看端口映射
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### docker port
|
||||
|
||||
我们可以使用 `docker port` 命令来查看当前容器的端口映射规则。
|
||||
@@ -96,14 +102,16 @@ abc123456 nginx 0.0.0.0:8080->80/tcp web
|
||||
|
||||
### 最佳实践与安全
|
||||
|
||||
#### 1. 限制监听 IP
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1。限制监听 IP
|
||||
|
||||
为了保证服务的安全性,我们应该谨慎选择绑定的 IP 地址。
|
||||
|
||||
|
||||
默认情况下,`-p 8080:80` 会监听 `0.0.0.0:8080`,这意味着任何人只要能连接你的宿主机 IP,就能访问该服务。
|
||||
|
||||
如果不希望对外暴露(例如数据库服务),应绑定到 `127.0.0.1`:
|
||||
如果不希望对外暴露 (例如数据库服务),应绑定到 `127.0.0.1`:
|
||||
|
||||
```bash
|
||||
## 仅允许本机访问
|
||||
@@ -111,7 +119,7 @@ abc123456 nginx 0.0.0.0:8080->80/tcp web
|
||||
$ docker run -d -p 127.0.0.1:3306:3306 mysql
|
||||
```
|
||||
|
||||
#### 2. 避免端口冲突
|
||||
#### 2。避免端口冲突
|
||||
|
||||
如果宿主机 8080 已经被占用了,容器将无法启动。
|
||||
|
||||
@@ -119,9 +127,9 @@ $ docker run -d -p 127.0.0.1:3306:3306 mysql
|
||||
- 更换宿主机端口:`-p 8081:80`
|
||||
- 让 Docker 自动分配:`-p 80`
|
||||
|
||||
#### 3. UDP 映射
|
||||
#### 3。UDP 映射
|
||||
|
||||
默认是 TCP 协议。如果要映射 UDP 服务(如 DNS, Syslog):
|
||||
默认是 TCP 协议。如果要映射 UDP 服务 (如 DNS,Syslog):
|
||||
|
||||
```bash
|
||||
$ docker run -d -p 53:53/udp dns-server
|
||||
@@ -131,7 +139,7 @@ $ docker run -d -p 53:53/udp dns-server
|
||||
|
||||
### 实现原理
|
||||
|
||||
Docker 使用 `docker-proxy` 进程(用户态)或 `iptables` DNAT 规则(内核态)来实现端口转发。
|
||||
Docker 使用 `docker-proxy` 进程 (用户态) 或 `iptables` DNAT 规则 (内核态) 来实现端口转发。
|
||||
|
||||
当流量到达宿主机端口时,iptables 规则将其目标地址修改为容器 IP 并转发:
|
||||
|
||||
@@ -141,6 +149,6 @@ Docker 使用 `docker-proxy` 进程(用户态)或 `iptables` DNAT 规则(
|
||||
iptables -t nat -A DOCKER -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
|
||||
```
|
||||
|
||||
这也是为什么你在容器内部看到的访问来源 IP 通常是网关 IP(如 172.17.0.1),而不是真实的外部 Client IP(除非使用 host 网络模式)。
|
||||
这也是为什么你在容器内部看到的访问来源 IP 通常是网关 IP (如 172.17.0.1),而不是真实的外部 Client IP (除非使用 host 网络模式)。
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user