V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要把任何和邀请码有关的内容发到 NAS 节点。

邀请码相关的内容请使用 /go/in 节点。

如果没有发送到 /go/in,那么会被移动到 /go/pointless 同时账号会被降权。如果持续触发这样的移动,会导致账号被禁用。
tengxunkuku
V2EX  ›  NAS

怎样才能让我的 docker 走代理

  •  
  •   tengxunkuku · 2022-08-23 13:48:46 +08:00 · 24805 次点击
    这是一个创建于 821 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天在拉取 ghcr 镜像的时候发现速度特别慢,观察 clashlog 发现 docker 拉取一直没有走代理,搜索相关教程发现群晖的系统是深度魔改的,与通用教程不同。
    系统:黑裙 DSM7.0
    代理方式:docker 运行 clash
    需求:docker 本身走代理
    42 条回复    2024-10-11 19:33:17 +08:00
    isbase
        1
    isbase  
       2022-08-23 13:51:55 +08:00
    局域网内网关直接翻墙,或者加个旁路由,将群晖的网关改成旁路由
    isbase
        2
    isbase  
       2022-08-23 13:53:04 +08:00
    一些关键字:R2S 软路由、OpenWRT 、Surge 网关模式
    hsfzxjy
        3
    hsfzxjy  
       2022-08-23 14:11:59 +08:00
    改 docker daemon 的启动参数
    kaedeair
        4
    kaedeair  
       2022-08-23 14:16:15 +08:00   ❤️ 1
    你的问题是拉取镜像慢还是让 docker 走代理?
    如果是让 docker 走代理可以:
    1.通过 iptables 设置转发规则,从 docker 出来的流量转发到 clash 上
    2.启动 docker 时加载环境变量 关键字:群晖 docker daemon http proxy 配置
    3.比较暴力的方法就是楼上提到的,交给路由器处理
    如果是拉取镜像慢可以:
    1.更改 docker hub 使其指向访问快镜像源
    2.在另一台电脑下好镜像,再到群辉上导入
    ltkun
        5
    ltkun  
       2022-08-23 14:21:28 +08:00 via Android
    直接配置国内 docker 源
    DefoliationM
        6
    DefoliationM  
       2022-08-23 14:28:35 +08:00
    换用 podman,

    ```bash
    http_proxy=http://xxxx:8080 https_proxy=http://xxxx:8080 podman pull docker.io/xxx:latest
    ```
    2022study
        7
    2022study  
       2022-08-23 14:31:20 +08:00
    建议命令行操作 ,直接用 export all_proxy=socks5:地址:port 设置命令行代理,然后 docker pull 镜像,取消用 unset all_proxy
    zliea
        8
    zliea  
       2022-08-23 15:05:45 +08:00
    cloudsigma2022
        9
    cloudsigma2022  
       2022-08-23 15:11:56 +08:00
    别的不清楚,如果你用的是 tcp 透明代理。加一条 output

    ```
    # us for output
    iptables -t nat -I GFW -d yourvpsip -j RETURN
    iptables -t nat -I OUTPUT -p tcp -m multiport --dports 80,443 -j GFW

    ```
    cloudsigma2022
        10
    cloudsigma2022  
       2022-08-23 15:12:45 +08:00
    你的宿主 output 走 gfw ,那么 docker 就会默认也走 gfw
    littlewing
        11
    littlewing  
       2022-08-23 15:14:33 +08:00
    代理方式:docker 运行 clash

    说明你是用的旁路透明网关的方式,那不应该不走代理啊
    chenjiangui998
        12
    chenjiangui998  
       2022-08-23 15:39:33 +08:00
    clash tun 模式就行
    n3yKZn7vykSRL0xz
        13
    n3yKZn7vykSRL0xz  
       2022-08-23 15:40:39 +08:00 via Android   ❤️ 1
    dxppp
        14
    dxppp  
       2022-08-23 16:12:30 +08:00
    IU 引起了我的注意
    lamesbond
        15
    lamesbond  
       2022-08-23 16:39:14 +08:00
    如果是拉取镜像走代理的话,https://blog.csdn.net/styshoo/article/details/55657714
    地址配成代理的地址,我是用 windows 上装的 netch 挂梯子
    40EaE5uJO3Xt1VVa
        16
    40EaE5uJO3Xt1VVa  
       2022-08-23 16:59:43 +08:00
    编译一份 ProxyChains ,编辑一下默认配置文件

    prxychains docker xxx
    BugCry
        17
    BugCry  
       2022-08-23 17:00:55 +08:00   ❤️ 3
    拖个镜像没那么复杂
    docker pull ghcr.io/github/super-linter:latest
    替换为
    docker pull ghcr.nju.edu.cn/github/super-linter:latest
    40EaE5uJO3Xt1VVa
        18
    40EaE5uJO3Xt1VVa  
       2022-08-23 17:01:04 +08:00
    刚留意是 docker 运行的代理,代理 是不是映射到外面的端口上了,

    这样套娃我还没试过,楼主试试给个反馈
    fitme
        20
    fitme  
       2022-08-23 18:18:51 +08:00
    方式有点多
    tengxunkuku
        21
    tengxunkuku  
    OP
       2022-08-23 19:11:46 +08:00
    总结:
    原代理方式,docker 运行 clash ,暴露端口,群晖设置系统代理 127.0.0.1:7890 ,终端可以直接代理,但不知道为什么 docker 没走代理。
    折腾了一下午,尝试了以下几种方式,由于种种原因失败
    1.群晖安装 openwrt ,更改网关后无法 ping 通百度
    2.docker daemon 配置文件,DSM 与通用 linux 不同,不知道在哪
    3.iptables+redsocks 流量转发,需要安装编译环境和相关工具,我不想把群晖里装太多东西
    4.群晖开的 windows 虚拟机,CFW 无法作为网关。
    5.群晖创建 tun ,映射到 docker clash 作为透明代理,按教程走了一遍,失败
    临时解决办法,更改 ClashX Pro 作为网关。许多在 linux 里很简单的方法到了 DSM 就会很复杂,先这样,以后有时间了再研究,感谢大家的回复。
    TMaize
        22
    TMaize  
       2022-08-23 20:17:09 +08:00   ❤️ 1
    可以试下这个 https://dockerproxy.com/docs 。我有时候 pull 不来下会用这个替换下源地址,然后再改下 tag
    shelken
        23
    shelken  
       2022-08-23 22:57:50 +08:00 via iPhone
    群晖的网络设置可以设置代理的,这里的代理设置可以对群晖的 docker 管理端生效(就是 web 页面 docker )。如果你是 ssh 连接直接命令的话,直接 export http proxy 或者 socks5 。
    xwchenhui
        24
    xwchenhui  
       2022-08-23 23:02:20 +08:00
    分享一个比较完美的方案,不过比较复杂:

    1 、要有个能 passwall 的旁路
    2 、群晖开双网口,一个接主路由(默认网关),一个接旁路由
    3 、docker 创建 macvlan 网络,一个网关用主路由的,一个网关用旁路的
    4 、需要 passwall 的容器指定旁路的 macvlan 网络

    这样基本上就比较灵活了,哪些要直接出去的(比如下载工具),哪些要走旁路的可以自己搭配
    YamatoRyou
        25
    YamatoRyou  
       2022-08-24 10:33:33 +08:00
    分享一个我目前正在用的群晖 Docker 容器使用代理的方案:
    1. 要走代理的容器添加环境变量:
    HTTP_PROXY=http://127.0.0.1:****
    HTTPS_PROXY=http://127.0.0.1:****

    2. 另起一个 Privoxy 容器 (网络模式设置为 hosts), 配置文件注明要开放的端口及要经过代理访问的域名. 接着让上一个容器连接到 Privoxy 指定的端口.

    这个方案我用来让 Synapse 容器连接推送网关, 存在一个缺点: http:// 开头的地址始终不能经过代理, https:// 开头的正常. 原因不明.
    YamatoRyou
        26
    YamatoRyou  
       2022-08-24 10:36:59 +08:00
    @YamatoRyou 看走眼了, 以为是楼主要让容器走代理. 请无视.
    mu2er
        27
    mu2er  
       2022-08-24 11:33:14 +08:00 via iPhone
    我是群晖虚拟机上安装 openwrt ,运行 clash ,作为旁路由使用,需要科学上网的 Apple TV 等设备按需设置网关跟 dns 地址到旁路由。
    试过群晖控制面板里设置 http 代理,好像这么直接设置 docker 容器并不能走代理连接。
    可以在群晖的网络设置里修改网关地址跟 dns 为旁路由,这么整整个群晖都可以科学上网了。
    tengxunkuku
        28
    tengxunkuku  
    OP
       2022-08-24 17:36:04 +08:00
    简单方法:为 systemd 设置环境变量,DSM 中 dockerd 的父进程为 /sbin/init ,而 init 为 systemd 的一个符号链接,因此为 systemd 设置环境变量依然对 docker 起作用。参考 https://cloud.tencent.com/developer/article/1627708
    horizon
        29
    horizon  
       2023-02-01 19:03:27 +08:00
    我也遇到了这个问题。。蛋疼。
    horizon
        30
    horizon  
       2023-02-01 19:09:34 +08:00
    @tengxunkuku 老哥,我发现没有 docker.service 这个,你怎么解决的
    temberature
        31
    temberature  
       2023-11-06 18:12:24 +08:00
    Apol1oBelvedere
        32
    Apol1oBelvedere  
       215 天前
    @BugCry 如果某个 image 在 hub.docker.com 里存在而不在 https://repo.nju.edu.cn/#browse/browse:docker-hub 里面那该怎么快速拖下来呢?
    charley008
        33
    charley008  
       195 天前   ❤️ 2
    @horizon
    @tengxunkuku
    dsm7.2
    docker 本身走代理
    mkdir -p /etc/systemd/system/pkg-ContainerManager-dockerd.service.d
    touch /etc/systemd/system/pkg-ContainerManager-dockerd.service.d/http-proxy.conf
    vim http-proxy.conf

    [Service]
    Environment="HTTP_PROXY=http://192.168.1.3:1088"
    Environment="HTTPS_PROXY=http://192.168.1.3:1088"
    Environment="NO_PROXY=localhost,127.0.0.1"

    systemctl daemon-reload
    systemctl restart pkg-ContainerManager-dockerd.service
    systemctl show --property=Environment pkg-ContainerManager-dockerd.service 验证
    horizon
        34
    horizon  
       195 天前
    @charley008 #33
    感谢,不过我现在用 https://dockerproxy.com/ 了。。
    liujl
        35
    liujl  
       167 天前
    xiaotianhu
        36
    xiaotianhu  
       137 天前
    我是群晖 7.1 ,没有 ContainerManager ,Mac 上开 clash 允许 Lan 访问,配置下代理:

    目录:/usr/local/lib/systemd/system
    vim pkg-Docker-dockerd.service
    systemctl daemon-reload
    systemctl restart pkg-Docker-dockerd

    ```
    [Service]
    Environment="HTTP_PROXY=http://192.168.1.10:7890"
    Environment="HTTPS_PROXY=http://192.168.1.10:7890"
    Environment="NO_PROXY=localhost,127.0.0.1"
    ```

    测试成功
    hjx900
        37
    hjx900  
       130 天前
    @xiaotianhu 感谢你的分享,试了好多其他版本的都不对,你这个就一次成功了
    sugarlovestudy
        38
    sugarlovestudy  
       124 天前
    @xiaotianhu pkg-Docker-dockerd.service 文件里面只需要放下面的代码就可以了吗? 为什么我的一直报错欸.
    pkg-Docker-docker.service lacks both ExecStart= and ExecStop= setting. Refusing.
    sugarlovestudy
        39
    sugarlovestudy  
       124 天前
    @hjx900 你好,请问你是怎么操作的呀。 我的报错了,service 启动不起来
    sugarlovestudy
        40
    sugarlovestudy  
       123 天前   ❤️ 1
    我的群晖版本是 DSM 7.1.1-42962 Update 6. 根据本帖和 https://www.v2ex.com/t/981481?p=1#r_14833577 大佬们的方法, 尝试均失败, 因此摸索出了针对我这个版本的方法. 失败的原因应该是群晖不同版本`docker.service`的名字以及路径都不一样.
    1. 「设置代理软件 - 使其能代理局域网其他设备」
    2. `/usr/local/lib/systemd/system`, 修改`pkg-Docker-dockerd.service`
    添加如下内容
    ```
    [Service]
    Environment="HTTP_PROXY=http://192.168.1.3:1088"
    Environment="HTTPS_PROXY=http://192.168.1.3:1088"
    Environment="NO_PROXY=localhost,127.0.0.1"
    ```
    3. 接着重启 docker.
    停止 docker :` /var/packages/Docker/scripts/start-stop-status stop `
    启动 docker :` /var/packages/Docker/scripts/start-stop-status start`

    测试该方法设置之后,在群晖的网页管理界面和 ssh 端都可以正常的拉取镜像. 谢谢各位大佬的分享
    hjx900
        41
    hjx900  
       122 天前
    @sugarlovestudy 对的,就是版本不同文件名字路径不同。。也不知道为啥群晖要这么设置。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2925 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 83ms · UTC 14:40 · PVG 22:40 · LAX 06:40 · JFK 09:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.