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

2023-08-31 14:05:17 +08:00
 leverestfish

网络小白来求助一下:代理是在本机的 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 镜像

感谢!

2237 次点击
所在节点    程序员
18 条回复
yangyaofei
2023-08-31 14:15:30 +08:00
这个里面有 https://docs.docker.com/network/proxy/

其实最简单的方法是直接 cfw 开启 tun 模式,就好了
ShineyWang
2023-08-31 14:23:42 +08:00
httpproxy=127.0.0.1:7890
这里的 127.0.0.1 改成本机的局域网 IP(这个 IP 才能让 docker 内的容器直接访问)
设置后可以通过 CURL google 测试连接
Achilless
2023-08-31 14:30:36 +08:00
简单点,clash 开 tunnel 模式就完了
leverestfish
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
2023-08-31 14:38:12 +08:00
@yangyaofei #1 tun 模式开启之后还需要其他相应操作吗
token10086
2023-08-31 14:40:04 +08:00
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
2023-08-31 14:43:41 +08:00
关键字:host.docker.internal ,docker 内部访问这个网址即访问 docker 宿主机地址
leverestfish
2023-08-31 14:44:21 +08:00
@Achilless #3 @yangyaofei #1 确实可以了! nb !
leverestfish
2023-08-31 14:44:58 +08:00
@token10086 #6 四楼试过了,不行
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
2023-08-31 15:29:09 +08:00
@leverestfish #5 开了 TUN 了之后就都能用了, docker 的文档里面的那个只能是 container 里面用代理, 但是 pull 镜像的时候没用, 所以还是 TUN 最无脑. 还有如果不用 tun 用 export 代理从 localhost 替换成 host.docker.internal 就好了, 有对应的文档.
leverestfish
2023-08-31 15:34:40 +08:00
@ShineyWang #10 破案了!就是因为忘记开 allow LAN 了,感谢!!
julyclyde
2023-08-31 19:22:39 +08:00
从/etc/systemd/system/docker.service.d/ 可以看出,你不太分得清容器内和容器服务这俩东西
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
2023-08-31 19:36:33 +08:00
@hzfyjgw 应该是小写吧?
以及,这里的环境变量是给 containerd 用的( pull image )而不是给容器内运行环境用的吧
juicer
2023-08-31 19:46:16 +08:00
我用的是 1 楼链接里的方法,对于没有安装 clash 的主机很有用。
cxtrinityy
2023-08-31 19:59:44 +08:00
最简单的就是代理 listen 在本机 docker ip 的端口即可让 docker 内的应用使用
stcode
2023-08-31 20:26:56 +08:00
我在 debian11 用 exprot 添加代理,代理是局域网机器,docker 可以访问.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/969751

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX