【适用性警告】:这篇文章的宿主机是Debian12为基础的CasaOS。
Docker节省人的生命。Clash燃烧人的生命。鲸鱼真好。猫猫真好。
用Docker部署Clash和控制面板是一种快捷的部署方式。如果部署在局域网内启用Allow lan的话,那么局域网内就只需要这一台代理设备了。
安装Clash与Clash_webui(YACD)
首先需要确保Docker的服务正常:docker info
dreamacro的clash是一个不错的方案。用docker pull 拉取镜像。
1 | docker pull dreamacro/clash |
如果服务器在境内,则需要拥有代理才能部署代理……怪哉。
因为网络原因无法拉取镜像的话,可以用在另外一台可以拉取镜像的设备上save导出镜像,然后在本机中用load 加载本地的镜像文件。
haishanh/yacd是一个不错的图形化面板,调整clash会方便一些。
1 | docker pull haishanh/yacd |
用这个命令查询,确保这两个镜像都已被下载。
1 | docker images | grep -E 'clash|yacd' |
部署Clash与Clash_webui(YACD)
接下来需要为Clash和YACD留出使用的端口。
- Clash需要保留7890、7891、9090端口。前两者是代理端口,后者是控制Clash用的端口。
- YACD本身使用80端口,我们可以将其映射到一个没那么重要的端口,例如5244。
确保以上端口未被占用。
为Clash留出一个应用数据文件夹。我们需要:
- config.yaml。这是代理配置。
在文件夹中新建一份空的文本文件,命名为这个。
如果有Windows上的clash的话,点击右键、Edit,把其中的内容复制一份,粘贴到这个文件中。
然后把config.yaml放到appdata/clash中。 - country.mmdb。全球IP库,可以实现各个国家的IP信息解析和地理定位,没有这个文件Clash是无法运行的。
在Github中下载到:GitHub - P3TERX/GeoLite.mmdb
然后把country.mmdb放到appdata/clash中。
接下来稍微修改config.yaml中的内容。确保已经有以下内容:
1 | port: 7890 |
运行Dockercompose来启动Clash。
1 | name: energetic_dushyanth |
- 启动clash_ui,运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36name: passionate_lajos
services:
run:
cpu_shares: 90
command: []
container_name: yacd
deploy:
resources:
limits:
memory: 512M
image: haishanh/yacd
labels:
icon: https://icon.casaos.io/main/all/yacd.png
ports:
- target: 80
published: "1234"
protocol: tcp
restart: unless-stopped
volumes: []
devices: []
cap_add: []
environment: []
network_mode: bridge
privileged: false
x-casaos:
author: self
category: self
hostname: ""
icon: https://icon.casaos.io/main/all/yacd.png
index: /
port_map: "1234"
scheme: http
store_app_id: passionate_lajos
title:
custom: yacd
在控制台上查看这两个容器的运行状态有没有报错。
随后,可以在<ip>:1234
上输入<ip:9090>
上选择节点了。
如果一切正常,本地应用就可以通过端口进行代理了。
注意:配置不会自动更新订阅,需要手动配置脚本来实现定时更新。
配置Docker代理
方案一
对于国内加速镜像,直接设置镜像地址就好了:
编辑/etc/docker/daemon.json添加1
2
3{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}这样可以简单地解决没有办法拉取镜像的问题,代价则是国内的镜像源版本常常落后,并且有部分镜像是不允许下载的。
方案二
当然,在这里部署Clash的目的就是为Docker解决遇到拉取镜像异常的问题。我们需要:
创建 dockerd 相关的 systemd 目录,这个目录下的配置将覆盖 dockerd 的默认配置1
$ sudo mkdir -p /etc/systemd/system/docker.service.d
新建配置文件
1
2
3
4/etc/systemd/system/docker.service.d/http-proxy.conf,这个文件中将包含环境变量
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80"
Environment="HTTPS_PROXY=https://proxy.example.com:443"如果你自己建了私有的镜像仓库,需要 dockerd 绕过代理服务器直连,那么配置 NO_PROXY 变量:
1
2
3
4[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80"
Environment="HTTPS_PROXY=https://proxy.example.com:443"
Environment="NO_PROXY=your-registry.com,10.10.10.10,*.example.com"多个 NO_PROXY 变量的值用逗号分隔,而且可以使用通配符(*),极端情况下,如果 NO_PROXY=*,那么所有请求都将不通过代理服务器。
如果一切正常,你就能够在Docker info
中看到自己的代理情况:
1 | Kernel Version: 6.1.0-12-amd64 |
问题排查
- 如果出现端口被占用的情况(例如,因被占用导致docker容器无法启动,输入
netstat -pultn
查询tcp端口的占用情况。 - 如果出现
Cant initiat Country.mmdb
之类的问题,要确保mmdb文件正常并且可以被识别到。 - 如果没有办法正常代理,就试着先把网络模式设置为host暴露所有端口,试试能否正常代理。成功的话再限制网络。
安全
在配置完成后,关闭yacd与隧道以确保安全。
参考:
服务器部署 clash + Yacd
我的服务器系列:clash-docker使用并实现订阅链接自动更新 - 霖的个人开发笔记
Linux 通过 Clash 来网上冲浪 - vicat’s blog
群晖Docker安装和运行Clash并自动更新订阅 – Gary的个人技术记录
如何优雅的给 Docker 配置网络代理 - 腾讯云开发者社区-腾讯云
docker 设置代理,以及国内加速镜像设置-次世代BUG池