windowBR
文章8
标签8
分类2

文章分类

文章归档

在 docker 中使用 mihomo

在 docker 中使用 mihomo

须知

本文默认您已经安装好了 docker 并了解 docker 的一些基本概念

本文会提供 GUI 与命令行的方式进行说明,其中 GUI 部分使用的是飞牛OS内置的 docker 管理应用

所有步骤均为终端和 GUI 方式二选一进行操作,不要两个都执行一遍

编写 config.yaml

新建一个文件夹命名为 mihomo,在其中新建文本文档 config.yaml

具体填入的内容可参考上一篇博文

docker compose 懒人配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '3'

services:
metacubexd:
container_name: metacubexd
image: ghcr.io/metacubex/metacubexd
restart: always
ports:
- '9097:80'

mihomo:
container_name: mihomo
image: docker.io/metacubex/mihomo:Latest
restart: always
pid: host
ipc: host
network_mode: host
cap_add:
- ALL
volumes:
- <config.yaml所在目录>:/root/.config/mihomo
- /dev/net/tun:/dev/net/tun

请自行修改config.yaml所在路径,修改后不含尖括号。

终端

选择一个空目录作为项目目录,在其中新建 docker-compose.yml 文件并填入上方配置内容。

确保工作目录在项目目录内,并运行以下命令以启动和停止

1
2
3
4
# 启动
sudo docker-compose up -d
# 关闭
sudo docker-compose stop

飞牛OS

Docker → Compose → 新建项目 → 名称随意,选择一个空文件夹作为项目路径 → 创建 docker-compose.yml → 填入上方配置 → 完成 → 启动


无论你使用的是终端还是 GUI

接下来你都可以跳过下方分步设置直接到下一步

分步配置

拉取并运行 mihomo

终端

自行替换 <config.yaml所在目录>,替换完成后不含尖括号

1
2
3
4
5
6
7
sudo docker run -d \
--name mihomo \
-v <config.yaml所在目录>:/root/.config/mihomo \
--network host \
--device=/dev/net/tun \
--cap-add=NET_ADMIN \
metacubex/mihomo
飞牛OS

通过 GUI 直接运行镜像将无法启用 TUN 模式,如果你有这个需要,建议参考懒人配置进行使用

1. 在镜像仓库搜索 mihomo 并下载

image-20241102202630668

2. 运行容器

运行刚刚拉取的容器,将存储的本地文件夹更改为 config.yaml 所在的文件夹,网络模式改为 host(fnOS 的这个网络设置需要先取消勾选 bridge 再选 host,如果有使用 fnOS 发现选不上 host 的注意一下是不是这个问题),更改完成后即可运行

image-20241102203048779

补充

你有可能会运行容器失败并在容器日志中出现如下报错:

1
level=fatal msg="Parse config error: rules[512] [GEOIP,CN,DIRECT] error: can't download MMDB: context deadline exceeded"

你也肯定能看出来这是因为无法下载 MMDB 导致的,那么解决方法也很明了了,直接去下载一个就行

可以前往该仓库下载 geoip.metadb,并将其上传到与 config.yaml 相同的目录内再重新运行容器即可

拉取 metacubexd 镜像并运行

metacubexd 仓库地址:https://github.com/MetaCubeX/metacubexd

终端 docker run
1
sudo docker run -d --restart always -p 9097:80 --name metacubexd ghcr.io/metacubex/metacubexd
GUI & docker compose

因为并非官方 docker 仓库,建议直接使用终端方案,若一定想使用 GUI 则建议使用 compose

点击 Compose,选择新增项目,项目名称随意,新建一个空文件夹并路径选择该处,建议项目名称与路径名称均为 metacubexd,选择创建docker-compose.yml,将以下内容填入

1
2
3
4
5
6
7
8
9
version: '3'

services:
metacubexd:
container_name: metacubexd
image: ghcr.io/metacubex/metacubexd
restart: always
ports:
- '9097:80'

image-20241102213343775

完成后构建并运行即可


以上两种方案你都可以将 9097 更换为自己喜欢的端口,注意别和其他的端口冲突就行

打开 webUI 并开始使用

在浏览器中输入 设备IP:9097 即可访问 metacubexd 的界面,后端地址填写 http://设备IP:9090 ,密钥留空即可,如图所示,点击添加便可访问

image-20241102210855009


至此完成,在需要使用网络代理的地方在代理选项填入 设备IP:7890 即可使用

Q&A

Q1:“在需要使用网络代理的地方填入”是指填入哪

A:包括但不限于:各系统的系统代理(如 Windows 设置中的代理设置,手机 WiFi 的代理设置)、Linux 中环境变量的 http_proxy 等代理字段、各软件内部的代理设置等。

  1. 对于 系统代理,以 Windows 举例,并非所有软件都会走系统代理,这种时候你需要查看应用内是否能设置代理;若没有相关选项且应用本身不走系统代理则你需要考虑其他方案,不过这些就不在这边教程的范畴内了。
  2. 如果你希望接管 docker 宿主设备本身 的所有流量,你可以参考我的教程启用 TUN 模式
  3. 如果你希望作为路由设备使用,比如你提到的网关指向的用法,你可以配置 透明代理,这同样不在这篇教程的范畴中,但我会推荐你在路由设备中使用 ShellCrash 或者 OpenClash(仅限 OpenWRT 下使用),但详细的使用方法请自行探究。
Q2:运行容器失败并在容器日志中出现如下报错:
1
level=fatal msg="Parse config error: rules[512] [GEOIP,CN,DIRECT] error: can't download MMDB: context deadline exceeded"

A:你也肯定能看出来这是因为无法下载 MMDB 导致的,那么解决方法也很明了了,直接去下载一个就行。可以前往该仓库下载 geoip.metadb,并将其上传到与 config.yaml 相同的目录内再重新运行容器即可

Q3:我使用了其他地方寻找的 config.yaml 模板,最后一步点击添加连接后端时报错 Failed to fetch

A:检查 config.yaml 内的 external-controller 字段,连接后端时以填入该处指示的端口

Q4:我使用了你之前的文章的 config.yaml 模板,依然出现上一个问题

A:检查是否将 mihomo 容器的网络模式更改为 host,若没有请去更改

还有其他问题的欢迎留言

相关链接

mihomo 仓库: https://github.com/MetaCubeX/mihomo

mihomo 文档: https://wiki.metacubex.one/

metacubexd 仓库: https://github.com/MetaCubeX/metacubexd

本文作者:windowBR
本文链接:http://blog.windowbr.top/2024/11/02/mihomo-docker/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可