决定新开一个分类"天书",url-slug 为 "黄石公"
用于存放完全 AI 生成的教程内容
这就是第一篇了
无 Docker Hub 环境下容器化部署 Mihomo 代理
适用场景
服务器几乎不能正常访问外网,Docker Hub 不可用(或无法拉取任何镜像)。Podman、宝塔面板、或直接安装的 Docker Engine 均适用。
核心思路
- 利用服务器已有的任意 Alpine 镜像(如
redis:alpine)作为构建时的 CA 证书来源,最终镜像基于scratch构建,不产生额外镜像拉取。 - 所有新增文件集中在
/root/mihomo/目录下,不污染服务器其他位置。 - 仅目标容器走代理,宿主机与其他容器不受影响。
第一步:准备文件
以下文件可在个人 PC(能正常访问 GitHub)上下载好,再放置到服务器的 /root/mihomo/ 目录。
| 文件 | 作用 | 获取方式 |
|---|---|---|
mihomo(二进制) | 代理核心 | GitHub Releases 下载 mihomo-linux-amd64-v*.gz,解压后重命名为 mihomo |
geoip.metadb | GeoIP 规则数据库 | meta-rules-dat Releases 下载 geoip.metadb,放入 data/ 子目录 |
config.yaml | 代理配置 | 见下方 |
Dockerfile | 镜像构建 | 见下方 |
docker-compose.yml | 容器编排 | 见下方 |
最终目录结构:
/root/mihomo/
├── mihomo # 二进制文件
├── config.yaml # 代理配置
├── Dockerfile
├── docker-compose.yml
└── data/
└── geoip.metadb # GeoIP 数据库
第二步:config.yaml
核心思路:订阅 URL 返回完整配置,从中提取 DNS 和 rules 部分直接放入 config.yaml;代理节点通过 proxy-providers 指向订阅 URL,由 mihomo 每日自动拉取更新。
有一些部分依据服务商不同,填写服务商给到的订阅 URL 中的对应固定部分,可以由 AI 代劳。
url:填入你的订阅地址,URL 本身自带鉴权(路径中的随机 token),无需额外认证。
# 端口与模式
port: 7890
socks-port: 7891
allow-lan: true
mode: Rule
log-level: info
external-controller: 0.0.0.0:9090
# DNS(从订阅返回内容中提取)
dns:
enable: true
# ... 完整内容从订阅 URL 拉取后填入
# 每日自动从订阅地址拉取最新节点
proxy-providers:
sub:
type: http
url: "https://你的订阅地址?clash=3"
interval: 86400
path: ./providers/sub.yaml
health-check:
enable: true
url: https://cp.cloudflare.com
interval: 300
# 自动选择最快节点
proxy-groups:
- name: 🔰 选择节点
type: url-test
use: [sub]
url: https://www.gstatic.com/generate_204
interval: 300
# 规则(从订阅返回内容中提取)
rules:
- GEOIP,CN,DIRECT
- MATCH,🔰 选择节点
第三步:Dockerfile
FROM redis:alpine AS certs
FROM scratch
COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY mihomo /mihomo
ENTRYPOINT ["/mihomo"]
CMD ["-d", "/etc/mihomo"]
- 第一阶段
FROM redis:alpine:使用服务器已有镜像,仅提取 CA 根证书。 - 第二阶段
FROM scratch:空镜像,最终产物仅包含 mihomo 二进制与 CA 证书,干净无冗余。 redis:alpine仅作为构件引用,不运行、不被修改,可替换为服务器上任意 Alpine 系镜像。
第四步:docker-compose.yml
services:
mihomo:
build: .
container_name: mihomo
restart: unless-stopped
volumes:
- ./config.yaml:/etc/mihomo/config.yaml:ro
- ./data:/etc/mihomo
ports:
- "7890:7890"
- "9090:9090"
build: .使用本地 Dockerfile 构建,无需拉取外部镜像。9090端口为 REST API(可选,用于热更新或状态查询)。
第五步:构建与启动
cd /root/mihomo
# 确保二进制文件存在且可执行
chmod +x mihomo
# 构建并启动
docker compose build
docker compose up -d
验证代理可用:
curl -x http://localhost:7890 https://www.google.com -o /dev/null -w "%{http_code}"
返回 200 即成功。
第六步:让其他容器走代理
以博客后端容器为例,在其 docker-compose.yml 中添加环境变量:
environment:
HTTP_PROXY: "http://172.17.0.1:7890"
HTTPS_PROXY: "http://172.17.0.1:7890"
NO_PROXY: "localhost,127.0.0.1"
172.17.0.1 为 Docker 默认 bridge 网关,容器通过它访问宿主机上 mihomo 映射的 7890 端口。如后端使用自定义网络,用 docker inspect <容器名> | grep Gateway 确认实际网关地址。
重建目标容器后进入容器验证:
docker exec <容器名> curl -x http://172.17.0.1:7890 https://www.google.com -o /dev/null -w "%{http_code}"
返回 200 即完成。