1775206638

This commit is contained in:
Docker7530
2026-04-03 16:57:21 +08:00
parent 30063feba4
commit ab41c81a53
71 changed files with 836 additions and 155 deletions
-9
View File
@@ -1,9 +0,0 @@
![](../attachment/Pasted%20image%2020260329165253.png)
![](../attachment/Pasted%20image%2020260329165301.png)
![](../attachment/Pasted%20image%2020260329165321.png)
```
MPLkv5dlbyKh_q0DdvH5ECxaUHVr5BVg0Ogf5AOH
```
-3
View File
@@ -1,3 +0,0 @@
![](../attachment/Pasted%20image%2020260329170137.png)
2026-01-13 21:46
View File
@@ -1,123 +0,0 @@
# 🐳 Docker 核心知识与实战笔记
## 一、 Docker 核心工作流与常用命令速查表
### 1. 自定义镜像与分享工作流
- **流程**:下载镜像 -> 启动容器 -> 修改页面/配置 -> 保存镜像 (`commit`) -> 导出镜像 (`save`) -> 分享/加载 (`load`)
- `docker commit`:将修改后的容器提交为新的本地镜像。
- `docker save`:将镜像保存为 tar 归档文件(用于离线传输)。
- `docker load`:从 tar 归档文件中加载镜像。
### 2. 常用命令分类速查 (Cheat Sheet)
| 分类 | 命令示例 | 功能说明 |
| :--- | :--- | :--- |
| **镜像 (Image)** | `docker search` | 检索 Docker Hub 上的镜像 |
| | `docker pull` | 下载镜像到本地 |
| | `docker images` | 列出本地所有镜像 |
| | `docker rmi` | 删除本地镜像 |
| **容器 (Container)**| `docker run` | 创建并运行一个新容器 |
| | `docker ps` | 查看当前正在运行的容器 (`-a` 查看所有) |
| | `docker stop` / `start`| 停止 / 启动 容器 |
| | `docker restart` | 重启容器 |
| | `docker stats` | 查看容器资源实时使用状态 |
| | `docker logs` | 查看容器内部日志(排错必备) |
| | `docker exec` | 进入正在运行的容器内部执行命令 |
| | `docker rm` | 删除已停止的容器 |
| **分享与管理** | `docker login` | 登录 Docker 镜像仓库 |
| | `docker tag` | 给镜像打标签(重命名,准备推送) |
| | `docker push` | 将镜像推送到远程仓库 |
---
## 二、 数据持久化:目录挂载 vs 卷映射
Docker 提供了两种主要的数据持久化方式,通过 `-v` 参数实现:
### 1. 目录挂载 (Bind Mounts)
将宿主机的**绝对路径**直接挂载到容器内。
- **语法**`-v /宿主机绝对路径:/容器内路径`
- **示例**`-v /app/nghtml:/usr/share/nginx/html`
- **特点**:路径完全由用户掌控,适合挂载需要频繁修改的代码或配置文件。
### 2. 卷映射 (Named Volumes)
由 Docker 自动管理宿主机的存储目录,只需提供一个“卷名”。
- **语法**`-v 卷名:/容器内路径`
- **示例**`-v ngconf:/etc/nginx`
- **底层路径**:Docker 默认会将命名卷存放在宿主机的 `/var/lib/docker/volumes/<volume-name>/_data` 目录下。
- **特点**:Docker 统一管理,不用担心宿主机路径权限问题,适合持久化数据库数据等。
### 3. Volume 常用管理命令
- `docker volume ls`:列出所有由 Docker 管理的卷。
- `docker volume create <卷名>`:提前创建一个数据卷。
- `docker volume inspect <卷名>`:查看卷的详细信息(包含具体的 `Mountpoint` 宿主机物理路径)。
> ⚠️ **排错注意**:在挂载配置文件(如 nginx.conf)时,如果宿主机对应路径下没有该文件,直接挂载会导致容器内部找不到配置文件而启动失败(如截图中 `Exited (1)` 且日志报错 `open() "/etc/nginx/nginx.conf" failed`)。
---
## 三、 容器网络机制与自定义网络
### 1. 默认网络 (`docker0`) 的局限性
- Docker 会为每个容器分配一个唯一的内网 IP。
- **痛点**:由于容器重启等原因,**容器的 IP 是动态变化的**。默认的 `docker0` 桥接网络**不支持通过容器名(域名)进行内部互相解析**。
### 2. 解决方案:创建自定义网络
- **核心优势**:在自定义网络(如命名为 `mynet`)中,**容器名就是稳定的域名**。即使 IP 变了,容器之间依然可以通过容器名互相访问。
### 3. 实战案例:Redis 主从同步集群(通过容器名通信)
使用自定义网络,让从节点通过主节点的**容器名**进行连接,实现读写分离。
- **Master (主节点 - redis01)**:
- 宿主机端口: `6379`
- 环境变量: `REDIS_REPLICATION_MODE=master`, `REDIS_PASSWORD=123456`
- **Slave (从节点 - redis02)**:
- 宿主机端口: `6380`
- 环境变量:
- `REDIS_REPLICATION_MODE=slave`
- `REDIS_MASTER_HOST=redis01` (**重点:直接使用主节点的容器名**)
- `REDIS_MASTER_PORT_NUMBER=6379` (主节点内部端口)
- `REDIS_MASTER_PASSWORD=123456`
- `REDIS_PASSWORD=123456`
---
## 四、 Docker Compose 容器编排
当项目包含多个容器(如 App + MySQL + Redis)时,单个单个 `run` 非常繁琐,此时需要使用 Docker Compose。
### 1. 核心概念
通过一个 `compose.yaml` (或 `docker-compose.yml`) 声明式文件,一键管理整个项目的多个服务。
### 2. 常用操作命令
- `docker compose up -d`:**上线**(解析 yaml,创建网络/数据卷,后台启动所有容器)。
- `docker compose down`:**下线**(停止并删除 yaml 中定义的所有容器、网络)。
- `docker compose start [服务名1 服务名2]`:单独启动定义好的服务。
- `docker compose stop [服务名1 服务名2]`:单独停止服务。
- *(扩展)* `docker compose scale <服务名>=<数量>`:对某个服务进行扩缩容(注:新版语法多推荐使用 `up --scale`)。
### 3. `compose.yaml` 顶级元素构成
编写 yaml 文件时,主要包含以下几个顶级块(Top-level elements):
- `name`:项目名称
- `services`:**【核心】** 定义各个服务(如 web, db, cache),每个服务包含镜像、端口映射、环境变量等。
- `networks`:定义项目使用的自定义网络。
- `volumes`:定义项目使用的数据卷。
- `configs`:定义配置信息。
- `secrets`:定义敏感信息(如密码密钥)。
**官方参考文档查阅地址**
`https://docs.docker.com/compose/compose-file/` (编写 yaml 遇到属性不会写时,随时查阅 Reference 官方文档)。
+121
View File
@@ -0,0 +1,121 @@
```
# ========== 1. 请求数统计 ==========
curl -X POST http://localhost:7530/api/mcp-tools \
-H "Content-Type: application/json" \
-d '{
"name": "get_request_count",
"description": "查询请求数统计数据,返回各时间点的请求数列表",
"backendUrl": "http://dev.p.cdn.10086.cn:8080/mcp/requestCount",
"backendMethod": "GET",
"backendTimeout": 10000,
"forwardHeaders": ["Authorization", "X-User-Id"],
"responseDescription": "返回 JSONerrCode=0 为成功,data 为数据列表,示例:{\"errCode\":0,\"data\":[{\"name\":\"2026-03-27 10:00\",\"value\":12345}],\"unit\":\"\"}",
"parameters": [
{"name": "cpId", "type": "string", "description": "企业ID(空默认全部)", "required": false, "sortOrder": 0},
{"name": "domainNames", "type": "string", "description": "域名列表,逗号分隔(空默认全部)", "required": false, "sortOrder": 1},
{"name": "product", "type": "string", "description": "产品类型(空默认全部,下载加速:0,视音频点播加速:1,网页加速:2,直播加速:5,超低时延直播:7,全站四层加速:8,全站七层加速:9", "required": false, "sortOrder": 2},
{"name": "granular", "type": "string", "description": "时间粒度(5分钟:01小时:11天:2", "required": false, "sortOrder": 3},
{"name": "providers", "type": "string", "description": "加速厂商列表,逗号分隔(空默认全部,华为平面:1,中兴平面:2,HCDN:3,自研1.0:4,自研RTMP:5,自研2.0:8,国际平面:9,合作服务商1:10,合作服务商211", "required": false, "sortOrder": 4},
{"name": "affectAreas", "type": "string", "description": "加速区域列表,逗号分隔(空默认全部,例如安徽、北京、福建)", "required": false, "sortOrder": 5},
{"name": "isps", "type": "string", "description": "运营商列表,逗号分隔(空默认全部,移动:1,电信:2,联通:3,多线:4,国际:5,其他:0", "required": false, "sortOrder": 6},
{"name": "startTime", "type": "string", "description": "开始时间,格式 yyyy-MM-dd HH:mm", "required": false, "sortOrder": 7},
{"name": "endTime", "type": "string", "description": "结束时间,格式 yyyy-MM-dd HH:mm", "required": false, "sortOrder": 8}
]
}'
# ========== 2. 命中请求数统计 ==========
curl -X POST http://localhost:7530/api/mcp-tools \
-H "Content-Type: application/json" \
-d '{
"name": "get_hit_req_count",
"description": "查询命中请求数统计数据,返回各时间点的命中请求数列表",
"backendUrl": "http://dev.p.cdn.10086.cn:8080/mcp/hitReqCount",
"backendMethod": "GET",
"backendTimeout": 10000,
"forwardHeaders": ["Authorization", "X-User-Id"],
"responseDescription": "返回 JSONerrCode=0 为成功,data 为数据列表,示例:{\"errCode\":0,\"data\":[{\"name\":\"2026-03-27 10:00\",\"value\":10000}],\"unit\":\"\"}",
"parameters": [
{"name": "cpId", "type": "string", "description": "企业ID(空默认全部)", "required": false, "sortOrder": 0},
{"name": "domainNames", "type": "string", "description": "域名列表,逗号分隔(空默认全部)", "required": false, "sortOrder": 1},
{"name": "product", "type": "string", "description": "产品类型(空默认全部)", "required": false, "sortOrder": 2},
{"name": "granular", "type": "string", "description": "时间粒度(5分钟:01小时:11天:2", "required": false, "sortOrder": 3},
{"name": "providers", "type": "string", "description": "加速厂商列表,逗号分隔(空默认全部)", "required": false, "sortOrder": 4},
{"name": "affectAreas", "type": "string", "description": "加速区域列表,逗号分隔(空默认全部)", "required": false, "sortOrder": 5},
{"name": "isps", "type": "string", "description": "运营商列表,逗号分隔(空默认全部)", "required": false, "sortOrder": 6},
{"name": "startTime", "type": "string", "description": "开始时间,格式 yyyy-MM-dd HH:mm", "required": false, "sortOrder": 7},
{"name": "endTime", "type": "string", "description": "结束时间,格式 yyyy-MM-dd HH:mm", "required": false, "sortOrder": 8}
]
}'
# ========== 3. 命中率计算(一次性接口) ==========
curl -X POST http://localhost:7530/api/mcp-tools \
-H "Content-Type: application/json" \
-d '{
"name": "get_hit_ratio",
"description": "计算命中率,命中率 = 命中请求数 / 总请求数,返回各时间点的命中率百分比(2位小数)",
"backendUrl": "http://dev.p.cdn.10086.cn:8080/mcp/hitRatio",
"backendMethod": "GET",
"backendTimeout": 10000,
"forwardHeaders": ["Authorization", "X-User-Id"],
"responseDescription": "返回 JSONerrCode=0 为成功,data 为数据列表,unit 为 %,示例:{\"errCode\":0,\"data\":[{\"name\":\"2026-03-27 10:00\",\"value\":85.23}],\"unit\":\"%\"}",
"parameters": [
{"name": "cpId", "type": "string", "description": "企业ID(空默认全部)", "required": false, "sortOrder": 0},
{"name": "domainNames", "type": "string", "description": "域名列表,逗号分隔(空默认全部)", "required": false, "sortOrder": 1},
{"name": "product", "type": "string", "description": "产品类型(空默认全部)", "required": false, "sortOrder": 2},
{"name": "granular", "type": "string", "description": "时间粒度(5分钟:01小时:11天:2", "required": false, "sortOrder": 3},
{"name": "providers", "type": "string", "description": "加速厂商列表,逗号分隔(空默认全部)", "required": false, "sortOrder": 4},
{"name": "affectAreas", "type": "string", "description": "加速区域列表,逗号分隔(空默认全部)", "required": false, "sortOrder": 5},
{"name": "isps", "type": "string", "description": "运营商列表,逗号分隔(空默认全部)", "required": false, "sortOrder": 6},
{"name": "startTime", "type": "string", "description": "开始时间,格式 yyyy-MM-dd HH:mm", "required": false, "sortOrder": 7},
{"name": "endTime", "type": "string", "description": "结束时间,格式 yyyy-MM-dd HH:mm", "required": false, "sortOrder": 8}
]
}'
# ========== 4. 命中率工具(分步计算用:先调requestCount,再调hitReqCount,最后调此工具计算) ==========
curl -X POST http://localhost:7530/api/mcp-tools \
-H "Content-Type: application/json" \
-d '{
"name": "calculate_hit_ratio",
"description": "根据请求数和命中请求数计算命中率,返回百分比(2位小数)。适用于先调用 get_request_count 和 get_hit_req_count 获取原始数据后,再调用此工具计算命中率",
"backendUrl": "http://dev.p.cdn.10086.cn:8080/mcp/hitRatio/calculate",
"backendMethod": "GET",
"backendTimeout": 5000,
"forwardHeaders": ["Authorization", "X-User-Id"],
"responseDescription": "返回 JSONerrCode=0 为成功,示例:{\"errCode\":0,\"data\":[{\"name\":\"hitRatio\",\"value\":85.23}],\"unit\":\"%\"}",
"parameters": [
{"name": "requestCount", "type": "integer", "description": "总请求数", "required": true, "sortOrder": 0},
{"name": "hitReqCount", "type": "integer", "description": "命中请求数", "required": true, "sortOrder": 1}
]
}'
# ========== 5. 获取企业列表 ==========
curl -X POST http://localhost:7530/api/mcp-tools \
-H "Content-Type: application/json" \
-d '{
"name": "get_enterprise_list",
"description": "获取当前用户所属的企业列表,返回 enterpriseId 和 enterpriseName,供统计接口选择企业参数用",
"backendUrl": "http://dev.p.cdn.10086.cn:8080/mcp/enterprises",
"backendMethod": "GET",
"backendTimeout": 5000,
"forwardHeaders": ["Authorization", "X-User-Id"],
"responseDescription": "返回 JSON 列表,每个元素含 enterpriseId 和 enterpriseName,示例:[{\"enterpriseId\":\"abc123\",\"enterpriseName\":\"测试企业\"}]",
"parameters": []
}'
# ========== 6. 获取域名列表 ==========
curl -X POST http://localhost:7530/api/mcp-tools \
-H "Content-Type: application/json" \
-d '{
"name": "get_domain_list",
"description": "根据企业ID获取该企业下已生效的域名列表,供统计接口选择域名参数用",
"backendUrl": "http://dev.p.cdn.10086.cn:8080/mcp/domains",
"backendMethod": "GET",
"backendTimeout": 5000,
"forwardHeaders": ["Authorization", "X-User-Id"],
"responseDescription": "返回 JSON 列表,每个元素为域名字符串,示例:[\"www.example.com\",\"img.example.com\"]",
"parameters": [
{"name": "tenantId", "type": "string", "description": "企业IDtenantId,即 enterpriseId", "required": true, "sortOrder": 0}
]
}'
```
+1
View File
@@ -0,0 +1 @@
![](../attachment/Pasted%20image%2020260402090513.png)
-37
View File
@@ -1,37 +0,0 @@
```
services:
n8n:
image: ${N8N_IMAGE}
container_name: rebuild-n8n
restart: unless-stopped
ports:
- "127.0.0.1:5678:5678"
environment:
TZ: ${TZ}
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
N8N_HOST: ${N8N_HOST}
N8N_PORT: 5678
N8N_PROTOCOL: https
WEBHOOK_URL: ${WEBHOOK_URL}
N8N_EDITOR_BASE_URL: ${N8N_EDITOR_BASE_URL}
N8N_PROXY_HOPS: 1
N8N_DEFAULT_LOCALE: zh
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
N8N_RUNNERS_ENABLED: "true"
volumes:
- /opt/docker/data/n8n:/home/node/.n8n
```
```
N8N_IMAGE=ghcr.io/aliveranme/n8n:2.12.2
N8N_HOST=n8n.excalicode.org
WEBHOOK_URL=https://n8n.excalicode.org/
N8N_EDITOR_BASE_URL=https://n8n.excalicode.org/
TZ=Asia/Shanghai
GENERIC_TIMEZONE=Asia/Shanghai
N8N_ENCRYPTION_KEY=3moa87LB!RMDuf
```
-20
View File
@@ -1,20 +0,0 @@
```
telegrambots 相关源码路径:D:\MyCode\Study\TelegramBots
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-longpolling</artifactId>
<version>${telegrambots.version}</version>
</dependency>
因为我是 Spring Boot 项目,那这里是不是用官方推荐的 telegrambots-springboot-longpolling-starter 更方便呢?
现在请帮我实现一个最基础的机器人的功能:
1. 双向机器人的功能,当有人给这个机器人发消息的时候,可以通知到我。可以参考下比较成熟的双项机器人实现的手段。
2. 给我提供一个前台页面,让我可以在上面发布通知,使得所有使用我这个机器人的用户都能收到消息
```
```
7786028912:AAGxQ1jmD4a7j6k-KGsSainVpsFGplSXp-0
```