V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
leverestfish
V2EX  ›  程序员

[求助] docker 容器如何使用本机容器外的 http_proxy

  •  
  •   leverestfish · 2023-08-31 14:05:17 +08:00 · 2164 次点击
    这是一个创建于 445 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网络小白来求助一下:代理是在本机的 7890 端口,请问如何在同一个机器的 docker 容器内通过代理来访问网络?

    直接 export http\_proxy=127.0.0.1:7890; ... 显然是不行的

    按照官网文档尝试了使用/etc/systemd/system/docker.service.d/http-proxy.conf 好像并不管用

    也按照这个stack overflow的方法试了一下,可以 ping 通 172.17.0.2 ( ifconfig 显示的 ip ),但是并不能使用 7890 端口

    备注:系统是 ubuntu (代理用的是 cfw ),docker 是 centos 镜像

    感谢!

    第 1 条附言  ·  2023-08-31 15:36:26 +08:00

    成功解决了,感谢各位大佬!总结一下:

    方案1:CFW直接开启tunnel模式

    方案2:container里面export <宿主机局域网ip>:7890即可,需要打开cfw的allow LAN功能

    18 条回复    2023-08-31 20:26:56 +08:00
    yangyaofei
        1
    yangyaofei  
       2023-08-31 14:15:30 +08:00   ❤️ 1
    这个里面有 https://docs.docker.com/network/proxy/

    其实最简单的方法是直接 cfw 开启 tun 模式,就好了
    ShineyWang
        2
    ShineyWang  
       2023-08-31 14:23:42 +08:00   ❤️ 1
    httpproxy=127.0.0.1:7890
    这里的 127.0.0.1 改成本机的局域网 IP(这个 IP 才能让 docker 内的容器直接访问)
    设置后可以通过 CURL google 测试连接
    Achilless
        3
    Achilless  
       2023-08-31 14:30:36 +08:00   ❤️ 1
    简单点,clash 开 tunnel 模式就完了
    leverestfish
        4
    leverestfish  
    OP
       2023-08-31 14:37:50 +08:00
    @ShineyWang #2 我用 ip addr show docker0 命令看到宿主机的局域网 ip 是 172.17.0.1 ,但是我在 docker 里面加载代理之后 curl 会得到 Failed to connect to 172.17.0.1 port 7890: Connection refused ,确认过本机 127.0.0.1:7890 直接 curl google 是没有问题的,好奇怪,难道是启动 docker 容器的时候要加什么参数吗…… 参考了这个教程 https://jingsam.github.io/2018/10/16/host-in-docker.html
    leverestfish
        5
    leverestfish  
    OP
       2023-08-31 14:38:12 +08:00
    @yangyaofei #1 tun 模式开启之后还需要其他相应操作吗
    token10086
        6
    token10086  
       2023-08-31 14:40:04 +08:00   ❤️ 1
    mac export https_proxy=http://host.docker.internal:1081;export http_proxy=http://host.docker.internal:1081;export all_proxy=socks5://host.docker.internal:1081

    linux 替换成 172.17.0.1
    cc666
        7
    cc666  
       2023-08-31 14:43:41 +08:00   ❤️ 2
    关键字:host.docker.internal ,docker 内部访问这个网址即访问 docker 宿主机地址
    leverestfish
        8
    leverestfish  
    OP
       2023-08-31 14:44:21 +08:00
    @Achilless #3 @yangyaofei #1 确实可以了! nb !
    leverestfish
        9
    leverestfish  
    OP
       2023-08-31 14:44:58 +08:00
    @token10086 #6 四楼试过了,不行
    ShineyWang
        10
    ShineyWang  
       2023-08-31 14:52:18 +08:00
    @leverestfish #4 在我的环境中
    本机(开启 Clash 的 windows),docker(linux)以及 docker 启动的 container 是三个系统;分别有三个 IP
    docker 主机一般不需要代理,假如部分 image 拉取过慢可以开代理

    一般是 container 需要代理,这个代理可以通过 docker start 的时候注入环境变量来开启
    启动参数一般加-e HTTPS_PROXY="http://dockernew.local:7890" -e HTTP_PROXY="http://dockernew.local:7890"就可以

    加了参数后可以到 container 里面 curl 判断实际情况

    假如不通,需要测试 clash 的配置有没有问题,clash 有没有开启 allow lan ;IP 对不对
    yangyaofei
        11
    yangyaofei  
       2023-08-31 15:29:09 +08:00
    @leverestfish #5 开了 TUN 了之后就都能用了, docker 的文档里面的那个只能是 container 里面用代理, 但是 pull 镜像的时候没用, 所以还是 TUN 最无脑. 还有如果不用 tun 用 export 代理从 localhost 替换成 host.docker.internal 就好了, 有对应的文档.
    leverestfish
        12
    leverestfish  
    OP
       2023-08-31 15:34:40 +08:00
    @ShineyWang #10 破案了!就是因为忘记开 allow LAN 了,感谢!!
    julyclyde
        13
    julyclyde  
       2023-08-31 19:22:39 +08:00
    从/etc/systemd/system/docker.service.d/ 可以看出,你不太分得清容器内和容器服务这俩东西
    hzfyjgw
        14
    hzfyjgw  
       2023-08-31 19:29:30 +08:00
    root@xxxx:~# cat /etc/systemd/system/containerd.service.d/http-proxy.conf
    [Service]
    Environment="HTTP_PROXY=http://192.168.x.xx:7890" "HTTPS_PROXY=http://192.168.x.xx:7890"
    julyclyde
        15
    julyclyde  
       2023-08-31 19:36:33 +08:00
    @hzfyjgw 应该是小写吧?
    以及,这里的环境变量是给 containerd 用的( pull image )而不是给容器内运行环境用的吧
    juicer
        16
    juicer  
       2023-08-31 19:46:16 +08:00 via iPad
    我用的是 1 楼链接里的方法,对于没有安装 clash 的主机很有用。
    cxtrinityy
        17
    cxtrinityy  
       2023-08-31 19:59:44 +08:00 via Android
    最简单的就是代理 listen 在本机 docker ip 的端口即可让 docker 内的应用使用
    stcode
        18
    stcode  
       2023-08-31 20:26:56 +08:00
    我在 debian11 用 exprot 添加代理,代理是局域网机器,docker 可以访问.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5892 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:40 · PVG 10:40 · LAX 18:40 · JFK 21:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.