//MAGICBOOK / 魔法书POSTS / 2023-12-30-DOCKER-CLASH-YACD
74 POSTS66 TAGS3 CATEGORIES
CodingSTATUS / PUBLISHED

【Docker】部署clash+yacd组合进行上网冲浪

Docker 节省人的生命。Clash燃烧人的生命。鲸鱼真好。猫猫真好。

FILE / 20231230-55
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代理

  1. 方案一 对于国内加速镜像,直接设置镜像地址就好了: 编辑/etc/docker/daemon.json添加
{
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

这样可以简单地解决没有办法拉取镜像的问题,代价则是国内的镜像源版本常常落后,并且有部分镜像是不允许下载的。

  1. 方案二 当然,在这里部署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池