抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

【适用性警告】:这篇文章的宿主机是Debian12为基础的CasaOS。

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

1703941302313

用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
2
3
4
5
6
7
8
9
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。

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
36
37
38
39
40
41
42
43
44
45
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,运行
    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
    36
    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添加

    1
    2
    3
    {
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    }

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

  2. 方案二
    当然,在这里部署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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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池

评论