mihomo(原clash)核心在docker部署教程

纯白色冰淇淋 2025-11-13 20:58 1

简介



  • mihomo 核心 (原 clash.meta) 官方文档: https://wiki.metacubex.one/startup/

  • 常用客户端里, 缺少 linux 服务器的 docker 部署的使用方案

  • 本篇教程在 ubuntu 下的 docker 环境下实现 mihomo 核心代理和自动订阅更新


项目地址


https://github.com/pure-white-ice-cream/mihomo-sub


快速部署


services:
mihomo:
image: purewhiteicecream/mihomo-sub:latest
container_name: mihomo-sub
volumes:
- /opt/mihomo-sub:/root/.config/mihomo
environment:
- "TZ=Asia/Shanghai"
- "sub_url=https://这里换成你的订阅地址"
ports:
- "7890:7890"
- "9090:9090"

分步解决, 原理同上面的项目


docker compose


services:
# mihomo 核心
mihomo:
image: metacubex/mihomo:v1.19.15
container_name: mihomo
restart: always
environment:
- "TZ=Asia/Shanghai"
ports:
- "7890:7890"
- "9090:9090"
# 挂载卷根据自己喜好位置选择
volumes:
- "/opt/mihomo:/root/.config/mihomo"

# 订阅转换工具
subconverter:
image: tindy2013/subconverter:0.9.0
container_name: subconverter
restart: always
environment:
- "TZ=Asia/Shanghai"
ports:
- "25500:25500"

WEB 面板



  • 下载最新面板: https://github.com/MetaCubeX/metacubexd/releases

  • 将下载到的文件解压复制到 /root/.config/mihomo/ui 路径下, 保证存在 /root/.config/mihomo/ui/index.html 文件


定期更新订阅脚本


#!/bin/bash

# 这里写你的订阅连接, 转换成https://www.urlencoder.org/中的格式
url=""

function end {
log+="\n"
printf "%b" "$log" >> $LOG_FILE
exit 0
}

CONFIG_DIR="/opt/mihomo"
CONFIG_FILE="$CONFIG_DIR/config.yaml"
LOG_FILE="$CONFIG_DIR/log.txt"

output="" # 保存生成的 config 内容
log="" # 保存日志内容

output+="mixed-port: 7890\n"
output+="external-ui: /root/.config/mihomo/ui\n"

# 订阅文件更新
log+="[$(date -R)] \n\t订阅文件更新...\n\t"
sub_response=$(curl -s --max-time 15 -w "%{http_code}" -o /tmp/mihomo_temp.yml "http://127.0.0.1:25500/sub?target=clash&url=$url")
sub_exit_code=$?

if [ "$sub_exit_code" -ne 0 ]; then
log+="Error❌️: 网络错误,退出码: $sub_exit_code\n\t"
end
elif [ "$sub_response" -ne 200 ]; then
log+="Error❌️: 订阅文件更新失败,响应码: $sub_response\n\t"
end
fi

output+="$(awk 'NR>=3' /tmp/mihomo_temp.yml)""\n"
printf "%b" "$output" > $CONFIG_FILE
log+="订阅文件更新成功 ✅\n\t"

# 配置重新加载
log+="配置重新加载...\n\t"
reload_response=$(curl -s --max-time 15 -w "%{http_code}" -X PUT "http://127.0.0.1:9090/configs?force=true" -H "Content-Type: application/json" -d '{"path":"","payload":""}')
reload_exit_code=$?

if [ "$reload_exit_code" -ne 0 ]; then
log+="Error❌️: 网络错误,退出码: $reload_exit_code\n\t"
end
elif [ "$reload_response" -ne 204 ]; then
log+="Error❌️: 配置重新加载失败,响应码: $reload_response\n\t"
end
fi

log+="配置重新加载完成 ✅\n\t"
end

将脚本加入定时服务



  • 编辑定时任务: crontab -e


# 参考写法, 文件路径改成自己脚本的路径
# m h dom mon dow command
5 * * * * bash /opt/mihomo/sub.sh

title: mihomo核心在docker部署教程


date: 2025/11/04 12:00:00

原作者: 纯白色冰淇淋

最新回复 (19)
  • 大帅哥 11-13 21:18
    1

    感谢大佬教程

  • 纯白色冰淇淋 楼主 11-14 14:41
    2

    新增内容, 做了个一键部署的镜像


    项目地址


    https://github.com/pure-white-ice-cream/mihomo-sub


    快速部署


    services:
    mihomo:
    image: purewhiteicecream/mihomo-sub:latest
    container_name: mihomo-sub
    volumes:
    - /opt/mihomo-sub:/root/.config/mihomo
    environment:
    - "TZ=Asia/Shanghai"
    - "sub_url=https://这里换成你的订阅地址"
    ports:
    - "7890:7890"
    - "9090:9090"
  • 辟支独觉 11-15 10:31
    3

    这个是用docker部署透明网关吗?

  • naive 11-15 10:34
    4

    这个配置文件不是应该自带自动更新吗

  • 纯白色冰淇淋 楼主 11-15 13:38
    5

    mihomo 官方文档中不支持订阅更新链接这一参数: https://wiki.metacubex.one/config/


    另外一提, 这个镜像是拥有订阅转换功能的

  • 纯白色冰淇淋 楼主 11-15 13:41
    6

    不是, 这个镜像部署之后提供 mix 代理端口, 其他设备需要将系统代理或者应用代理显式指定到这个端口,


    另外, 这个镜像还提供控制面板的端口, 浏览器可以访问

  • ChenLiang 11-15 23:56
    7

    ui按照你的来不行呀



  • 纯白色冰淇淋 楼主 11-16 00:09
    8

    访问路径是 http://xxx.xxx.xxx.xxx/ui 没输入 /ui 回直接调用核心的 api

  • naomi233 11-19 16:14
    9

    用proxy-provider,订阅定时更新,可以不用写脚本

  • 纯白色冰淇淋 楼主 11-19 16:37
    10

    感谢


    目前只在官方相关材料里找到这两个相关的描述, 找不到更详细的资料了, 目前尚未实践, 不知道网上有没有详细教程


    # Mihomo 格式的节点或支持 *ray 的分享格式
    proxy-providers:
    provider1:
    type: http # http 的 path 可空置,默认储存路径为 homedir 的 proxies 文件夹,文件名为 url 的 md5
    url: "url"
    interval: 3600
    path: ./provider1.yaml # 默认只允许存储在 mihomo 的 Home Dir,如果想存储到其他位置,请通过设置 SAFE_PATHS 环境变量指定额外的安全路径。该环境变量的语法同本操作系统的PATH环境变量解析规则(即Windows下以分号分割,其他系统下以冒号分割)
    proxy: DIRECT
    # size-limit: 10240 # 限制下载文件最大为10kb,默认为0即不限制文件大小
    header:
    User-Agent:
    - "Clash/v1.18.0"
    - "mihomo/1.18.3"
    # Accept:
    # - 'application/vnd.github.v3.raw'
    # Authorization:
    # - 'token 1231231'
    health-check:
    enable: true
    interval: 600
    # lazy: true
    url: https://cp.cloudflare.com/generate_204
    # expected-status: 204 # 当健康检查返回状态码与期望值不符时,认为节点不可用
    override: # 覆写节点加载时的一些配置项
    skip-cert-verify: true
    udp: true
    # down: "50 Mbps"
    # up: "10 Mbps"
    # dialer-proxy: proxy
    # interface-name: tailscale0
    # routing-mark: 233
    # ip-version: ipv4-prefer
    # additional-prefix: "[provider1]"
    # additional-suffix: "test"
    # # 名字替换,支持正则表达式
    # proxy-name:
    # - pattern: "test"
    # target: "TEST"
    # - pattern: "IPLC-(.*?)倍"
    # target: "iplc x $1"


    proxy-providers 文件内容


    === “yaml” {.yaml linenums="1"} proxies: - name: "ss1" type: ss server: server port: 443 cipher: chacha20-ietf-poly1305 password: "password" - name: "ss2" type: ss server: server port: 443 cipher: chacha20-ietf-poly1305 password: "password"


    === “uri” {.yaml linenums="1"} ss://YWVzLTI1Ni1nY206bWV0YUAxMjcuMC4wLjE6NDQz#home vmess://eyJhZGQiOiIxMjcuMC4wLjEiLCJhaWQiOiIwIiwiYWxwbiI6IiIsImZwIjoiIiwiaG9zdCI6IiIsImlkIjoiMTIyMzQ1Njc4OSIsIm5ldCI6InRjcCIsInBhdGgiOiIiLCJwb3J0IjoiNDQzIiwicHMiOiJ2bWVzcyIsInNjeSI6ImF1dG8iLCJzbmkiOiIiLCJ0bHMiOiIiLCJ0eXBlIjoibm9uZSIsInYiOiIyIn0=


    === “base64” {.text linenums="1"} c3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2YldWMFlVQXhNamN1TUM0d0xqRTZORFF6I2hvbWUKdm1lc3M6Ly9leUpoWkdRaU9pSXhNamN1TUM0d0xqRWlMQ0poYVdRaU9pSXdJaXdpWVd4d2JpSTZJaUlzSW1ad0lqb2lJaXdpYUc5emRDSTZJaUlzSW1sa0lqb2lNVEl5TXpRMU5qYzRPU0lzSW01bGRDSTZJblJqY0NJc0luQmhkR2dpT2lJaUxDSndiM0owSWpvaU5EUXpJaXdpY0hNaU9pSjJiV1Z6Y3lJc0luTmplU0k2SW1GMWRHOGlMQ0p6Ym1raU9pSWlMQ0owYkhNaU9pSWlMQ0owZVhCbElqb2libTl1WlNJc0luWWlPaUl5SW4wPQ==


    !!! note base64 的 uri 通常为提供商提供给 v2ray/xray 的订阅链接内容


    `YAML`/`uri`/`base64`不可写在同一文件,`uri`/`base64`不需要`proxies:`字段,直接书写即可
  • 梨叔叔 11-19 16:39
    11

    佬 我一直没想明白,docker里面的镜像部署这个有啥用,是能把这个网络共享吗?

  • 竹叶 11-19 16:43
    12

    能不能实现配置文件,节点列表,规则列表分离,在 github 上看到一个分流规则完善的项目,想规则跟着这个项目的更新,节点另外跟着机场更新 GitHub - Aethersailor/Custom_OpenClash_Rules: 分流完善的 OpenClash 订阅转换模板,搭配保姆级 OpenClash 设置教程,无需套娃其他插件即可实现完美分流、DNS无污染无泄漏,且快速的国内外上网体验,配套自动化域名规则提交机器人


    还有一个问题,目前这个 docker 不支持 ARM,希望能支持 ARM64

  • huohuo 11-19 16:43
    13

    我是开7890端口代理,给其他容器用,或者局域网代理

  • yeluo001 11-19 16:44
    14

    相当于路由器代理插件的作用,可以通过将设备dns和网关指向docker的代理ip实现科学上网,也可以直接在局域网使用http-proxy等方式直接让设备或docker容器使用本代理

  • 纯白色冰淇淋 楼主 11-19 16:45
    15

    [运行这个镜像的机器ip:7890] 这个端口可以提供代理服务


    别的应用, 系统, 可以用这个端口, 比如 windows , 比如 linux , 或者 docker 自己, 用来拉镜像

  • 梨叔叔 11-19 16:46
    16

    我是开7890端口代理,给其他容器用,或者局域网代理



    了解了 佬

  • 梨叔叔 11-19 16:47
    17

    相当于路由器代理插件的作用,可以通过将设备dns和网关指向docker的代理ip实现科学上网,也可以直接在局域网使用http-proxy等方式直接让设备或docker容器使用本代理



    佬 我懂了

  • 梨叔叔 11-19 16:47
    18

    [运行这个镜像的机器ip:7890] 这个端口可以提供代理服务


    别的应用, 系统, 可以用这个端口, 比如 windows , 比如 linux , 或者 docker 自己, 用来拉镜像



    好滴好滴 这回懂了

  • 纯白色冰淇淋 楼主 11-19 16:56
    19

    规则分离应该不难, 可以把规则地址参数留出来给 compose,

    yaml 文件分离这块我始终没在 mihomo 文档上看到相关内容, 所以目前不知道怎么分离

    mihomo 也有 ARM64 所以应该也可以支持,


    我争取后续有空的时候慢慢做

* 帖子来源Linux.do
返回