【Docker】部署clash+yacd组合进行上网冲浪
Docker 节省人的生命。Clash燃烧人的生命。鲸鱼真好。猫猫真好。
AUTHOR / MAGICNUE
TYPE / CODING RECORD
【适用性警告】:这篇文章的宿主机是Debian12为基础的CasaOS。
Docker节省人的生命。Clash燃烧人的生命。鲸鱼真好。猫猫真好。
![]() |
用Docker部署Clash和控制面板是一种快捷的部署方式。如果部署在局域网内启用Allow lan的话,那么局域网内就只需要这一台代理设备了。
安装Clash与Clash_webui(YACD)
首先需要确保Docker的服务正常:docker info
dreamacro的clash是一个不错的方案。用docker pull 拉取镜像。
docker pull dreamacro/clash
如果服务器在境内,则需要拥有代理才能部署代理……怪哉。 因为网络原因无法拉取镜像的话,可以用在另外一台可以拉取镜像的设备上save导出镜像,然后在本机中用load 加载本地的镜像文件。
haishanh/yacd是一个不错的图形化面板,调整clash会方便一些。
docker pull haishanh/yacd
用这个命令查询,确保这两个镜像都已被下载。
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中的内容。确保已经有以下内容:
port: 7890
socks-port: 7891
allow-lan: true
mode: Rule
log-level: info
external-controller: 0.0.0.0:9090
#此处必须是0.0.0.0 才可以通过局域网访问,也就是说要想通过web管理,必须填0.0.0.0
secert: 123456
#在这里设置管理密码。这不是必要的。
运行Dockercompose来启动Clash。
name: energetic_dushyanth
services:
main_app:
cpu_shares: 10
command: []
container_name: Clash
deploy:
resources:
limits:
memory: 256M
image: dreamacro/clash:latest
labels:
icon: https://icon.casaos.io/main/all/clash.png
ports:
- target: 7890
published: "7890"
protocol: ""
- target: 7891
published: "7891"
protocol: ""
- target: 9090
published: "9090"
protocol: ""
restart: unless-stopped
volumes:
- type: bind
source: /DATA/AppData/clash
target: /root/.config/clash
devices: []
cap_add: []
environment: []
network_mode: bridge
privileged: false
x-casaos:
author: self
category: self
hostname: ""
icon: https://icon.casaos.io/main/all/clash.png
index: /
port_map: ""
scheme: http
store_app_id: energetic_dushyanth
title:
custom: Clash
- 启动clash_ui,运行
name: 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添加
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
这样可以简单地解决没有办法拉取镜像的问题,代价则是国内的镜像源版本常常落后,并且有部分镜像是不允许下载的。
- 方案二 当然,在这里部署Clash的目的就是为Docker解决遇到拉取镜像异常的问题。我们需要: 创建 dockerd 相关的 systemd 目录,这个目录下的配置将覆盖 dockerd 的默认配置
$ sudo mkdir -p /etc/systemd/system/docker.service.d
新建配置文件
/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 变量:
[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中看到自己的代理情况:
Kernel Version: 6.1.0-12-amd64
Operating System: Debian GNU/Linux 12 (bookworm)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 8GiB
Name: debian
ID: -
Docker Root Dir: /var/lib/docker
Debug Mode: false
HTTP Proxy: http://172.17.0.1:7890
HTTPS Proxy: http://172.17.0.1:7890
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
问题排查
- 如果出现端口被占用的情况(例如,因被占用导致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池
