Rocky Linux 10 部署 Mihomo (Clash) 代理容器完整指南
Rocky Linux 10 部署 Mihomo (Clash) 代理容器完整步骤:
- Compose 文件单独放在
/root/docker-compose-mihomo.yaml - Mihomo 配置和节点数据放在
/opt/mihomo/data。
| 用途 | 路径或地址 |
|---|---|
| Compose 文件 | /root/docker-compose-mihomo.yaml |
| Mihomo 配置 | /opt/mihomo/data/config.yaml |
| 节点文件目录 | /opt/mihomo/data/providers |
| Docker 共享网络 | proxy-net |
| 业务容器使用的代理 | http://mihomo:7890 |
以下命令在你的 Rocky Linux 10 服务器上执行。已有的 Docker、镜像、网络和有效订阅配置可以直接复用。
先进入 root shell:
sudo -i
检查 Docker 和 Compose。
docker version docker compose versiondocker version应同时显示 Client 和 Server 信息。已经安装的跳过下面安装命令。 未安装时,可以采用 Docker RHEL 仓库的兼容安装方式;Docker 官方安装文档包含 RHEL 10。Docker 安装说明
dnf install -y dnf-plugins-core dnf config-manager --add-repo \ https://download.docker.com/linux/rhel/docker-ce.repo dnf install -y \ docker-ce \ docker-ce-cli \ containerd.io \ docker-buildx-plugin \ docker-compose-plugin systemctl enable --now docker docker version docker compose version下载 Mihomo 和测试镜像。
docker pull metacubex/mihomo:latest docker pull curlimages/curl:latest使用项目发布的
metacubex/mihomo镜像。如果服务器无法下载镜像,可以离线导入。
在另一台能够下载镜像、CPU 架构与服务器相同的机器上执行:
docker pull metacubex/mihomo:latest docker pull curlimages/curl:latest docker save -o mihomo-bootstrap.tar \ metacubex/mihomo:latest \ curlimages/curl:latest将文件复制到 Rocky Linux 服务器,在文件所在目录执行:
docker load -i mihomo-bootstrap.tar创建数据目录和共享网络。
mkdir -p /opt/mihomo/data/providers chmod 700 /opt/mihomo/data首次部署时创建网络:
docker network create --driver bridge proxy-net如果提示网络已经存在,检查后复用:
docker network inspect proxy-net需要使用代理的容器都加入这个自定义 bridge 网络,即可通过服务名
mihomo访问代理。Docker bridge 网络说明创建 Mihomo 配置。
如果已有可用的
/opt/mihomo/data/config.yaml,保留现有节点和订阅配置,核对监听端口等设置即可。首次配置时编辑:
vi /opt/mihomo/data/config.yaml填入以下完整内容,将
REPLACE_WITH_YOUR_SUBSCRIPTION_URL替换为自己的订阅地址:mixed-port: 7890 allow-lan: true bind-address: "0.0.0.0" mode: rule log-level: info ipv6: false tun: enable: false dns: enable: false proxy-providers: subscription: type: http url: "REPLACE_WITH_YOUR_SUBSCRIPTION_URL" path: ./providers/subscription.yaml interval: 3600 proxy: DIRECT health-check: enable: true url: https://www.gstatic.com/generate_204 interval: 300 proxy-groups: - name: PROXY type: url-test use: - subscription url: https://www.gstatic.com/generate_204 interval: 300 tolerance: 50 rules: - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve - MATCH,PROXY保存后执行:
chmod 600 /opt/mihomo/data/config.yaml配置含义:
设置 作用 mixed-port: 7890同一端口提供 HTTP 和 SOCKS5 代理 allow-lan: true接受其他容器连接 bind-address: "0.0.0.0"监听容器内所有 IPv4 接口 tun.enable: false使用显式代理 interval: 3600每小时更新订阅 type: url-test自动测速选择节点 最后一条 MATCH,PROXY其余交给 Mihomo 的请求使用代理节点 订阅地址应返回节点数据,推荐使用包含顶层
proxies:的 Clash/Mihomo YAML 格式。订阅配置说明如果订阅地址首次无法直连下载: 在能够访问订阅的机器上下载节点 YAML,复制到:
/opt/mihomo/data/providers/subscription.yaml然后把上面整个
proxy-providers部分替换为:proxy-providers: subscription: type: file path: ./providers/subscription.yaml health-check: enable: true url: https://www.gstatic.com/generate_204 interval: 300本地文件方式需要自行更新节点文件,其余配置保持一致。
创建
/root/docker-compose-mihomo.yaml。执行下面命令生成文件:
cat > /root/docker-compose-mihomo.yaml <<'YAML' name: mihomo-proxy services: mihomo: image: metacubex/mihomo:latest container_name: mihomo restart: unless-stopped command: - "-d" - "/root/.config/mihomo" volumes: - /opt/mihomo/data:/root/.config/mihomo:z networks: - proxy-net logging: driver: json-file options: max-size: "10m" max-file: "3" networks: proxy-net: external: true YAML chmod 600 /root/docker-compose-mihomo.yaml这里的挂载源使用绝对路径
/opt/mihomo/data,因此 Compose 文件放在/root下,也能正确读取配置。:z用于 SELinux 标签,允许校验容器和运行容器共享访问这个项目目录。Docker SELinux 挂载说明如果已经按上一版部署,项目名仍为
mihomo-proxy,后续统一使用这个新文件管理原项目即可。校验、启动并测试代理。
先检查 Compose:
docker compose -f /root/docker-compose-mihomo.yaml config -q没有输出且正常退出,表示 Compose 配置检查通过。
再检查 Mihomo 配置:
docker compose -f /root/docker-compose-mihomo.yaml \ run --rm --no-deps --pull never mihomo \ -t -d /root/.config/mihomo检查通过后启动:
docker compose -f /root/docker-compose-mihomo.yaml \ up -d --pull never mihomo这里使用
--pull never,直接运行第 2 步准备好的本地镜像,避免启动时再次尝试访问镜像仓库。Compose 启动参数查看状态和日志:
docker compose -f /root/docker-compose-mihomo.yaml psdocker compose -f /root/docker-compose-mihomo.yaml \ logs --tail=100 mihomo然后从另一个容器实际测试:
docker run --rm --pull=never \ --network proxy-net \ curlimages/curl:latest \ --noproxy "" \ --proxy http://mihomo:7890 \ --max-time 30 \ --fail --silent --show-error \ --output /dev/null \ --write-out 'HTTP %{http_code}\n' \ https://www.gstatic.com/generate_204正常预期:
HTTP 204再查看日志,确认对应请求经过了
PROXY及其中某个节点:docker compose -f /root/docker-compose-mihomo.yaml \ logs --tail=50 mihomo容器显示运行中只代表进程启动,实际请求测试成功才能确认代理可用。
配置其他业务容器使用代理。
修改的是业务容器自己的 Compose 文件;Mihomo 继续由
/root/docker-compose-mihomo.yaml单独管理。假设业务服务名为
app,在原业务配置中合并以下内容,保留原有镜像、数据卷、端口和其他配置:services: app: # 保留已有 image、volumes、ports 等配置 environment: HTTP_PROXY: "http://mihomo:7890" HTTPS_PROXY: "http://mihomo:7890" http_proxy: "http://mihomo:7890" https_proxy: "http://mihomo:7890" NO_PROXY: "localhost,127.0.0.1,::1,db,redis" no_proxy: "localhost,127.0.0.1,::1,db,redis" networks: - default - proxy-net networks: default: {} proxy-net: external: true其中:
default代表业务原先的默认网络。如果使用其他命名网络,保留原网络并追加proxy-net。db、redis是内部服务名示例,把需要直连的实际服务名加入NO_PROXY。HTTPS_PROXY也写http://mihomo:7890,表示通过 HTTP 代理建立 HTTPS 隧道。
在业务项目目录执行,
app替换为实际服务名:docker compose up -d --no-deps --force-recreate app环境变量需要通过重新创建容器来更新;单纯重启不会加入新的变量。容器内程序也需要支持这些代理变量,否则应在程序自身设置里指定代理。Docker 容器代理说明
其他需要代理的服务,重复追加网络和环境变量即可。
如果已有容器是通过
docker run创建的,可先接入网络:docker network connect proxy-net 你的容器名这一步只建立连接。之后还需在应用中填写代理地址,或保留原数据卷和启动参数重新创建容器,加入代理环境变量。
日常维护和排查。
查看实时日志:
docker compose -f /root/docker-compose-mihomo.yaml \ logs -f --tail=100 mihomo修改
/opt/mihomo/data/config.yaml后先校验:docker compose -f /root/docker-compose-mihomo.yaml \ run --rm --no-deps --pull never mihomo \ -t -d /root/.config/mihomo校验通过后重启:
docker compose -f /root/docker-compose-mihomo.yaml \ restart mihomo如果修改的是 Compose 文件,使用以下命令应用:
docker compose -f /root/docker-compose-mihomo.yaml \ up -d --pull never mihomo更新镜像:
docker compose -f /root/docker-compose-mihomo.yaml \ pull mihomo拉取成功后执行:
docker compose -f /root/docker-compose-mihomo.yaml \ up -d --pull never mihomo服务器无法下载镜像时,仍可使用第 2 步的离线导入方式。长期运行可以把
latest换成验证过的固定版本或 digest。问题 优先检查 找不到配置文件 挂载源是否为绝对路径 /opt/mihomo/dataCould not resolve proxy: mihomo业务容器是否加入 proxy-net连接 mihomo:7890被拒绝Mihomo 状态、监听地址和端口 没有节点、订阅下载超时 订阅地址、返回格式,或改用本地节点文件 读取配置出现 permission denied文件权限、挂载后的 :z测试成功但业务不走代理 应用是否支持代理变量、容器是否已重新创建 数据库等内部服务访问异常 原业务网络是否保留、服务名是否加入 NO_PROXY可选:让 Docker 拉取镜像也使用代理。
仅需业务容器内部使用代理时,第 8 步后就已完成。
如果还需要
docker pull、docker compose pull使用代理,再执行本步。Docker daemon 有独立的代理设置,不会因此给 Rocky Linux 的其他程序配置代理。Docker daemon 代理说明编辑指定的 Compose 文件:
vi /root/docker-compose-mihomo.yaml在
services.mihomo下增加与volumes同级的配置:ports: - "127.0.0.1:7890:7890"应用端口映射:
docker compose -f /root/docker-compose-mihomo.yaml \ up -d --pull never mihomo编辑 Docker daemon 配置:
mkdir -p /etc/docker vi /etc/docker/daemon.json新文件可以填写下面完整内容;已有文件则把
proxies合并到原 JSON 顶层,保留原有设置:{ "proxies": { "http-proxy": "http://127.0.0.1:7890", "https-proxy": "http://127.0.0.1:7890", "no-proxy": "localhost,127.0.0.1,::1" } }私有镜像仓库如果需要直连,把其域名加入
no-proxy。校验配置:
dockerd --validate --config-file=/etc/docker/daemon.json检查通过后,在可以接受容器短暂中断的时间重启 Docker:
systemctl restart docker确认 Mihomo 已恢复运行,然后测试拉取:
docker compose -f /root/docker-compose-mihomo.yaml psdocker pull alpine:latest此时,业务容器继续使用
http://mihomo:7890,Docker daemon 使用http://127.0.0.1:7890。


