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