如何让 docker 容器使用宿主机的 socks5 代理?

2020-02-17 03:51:24 +08:00
 drperry

如题,宿主机为 ubuntu,运行着 socks5 代理,而且通过安装 proxychain 实现了在宿主机终端里的代理。但是如果直接用 proxychains docker run xxxxx 并不能使 docker 容器里实现代理。

我现在的需求就是:docker 容器通过宿主机的 socks5 代理实现全局代理,包括容器里的终端也要代理

3247 次点击
所在节点    程序员
13 条回复
nvkou
2020-02-17 04:28:11 +08:00
听起来像 docker 的网络模式选择问题。默认的桥接模式不好实现,试试直接使用宿主机网络模式
https://docs.docker.com/network/host/
twl007
2020-02-17 05:04:58 +08:00
换成 http 代理不行么 然后添加对应的环境变量就是了 一般代理软件都支持 http 盒 socket 吧

如果你实在想用 socket 可以尝试把目录挂在进去试试
CallMeReznov
2020-02-17 05:05:55 +08:00
难道不是直接填写宿主机的 socket 端口就行了?
ysc3839
2020-02-17 06:15:12 +08:00
因为 docker 里面运行的程序是独立的进程吧? docker run 只是去启动而已,你要在 docker 里面使用 proxychains。
codehz
2020-02-17 08:39:54 +08:00
Docker 的进程不是由 docker 命令创建的(而是一个 rpc 过去由 daemon 创建),所以对着 docker 命令用 proxychains 没有作用。。。。
当然也不是说对着 containerd 用 proxychains 就有作用了
所以最好的方法还是直接开个 http 代理然后设置环境变量
optional
2020-02-17 08:45:14 +08:00
设一个环境变量 all_proxy 可以解决一些问题
mabutou
2020-02-17 09:05:24 +08:00
官网文档:Configure Docker to use a proxy server
https://docs.docker.com/network/proxy/
whatsmyip
2020-02-17 10:27:43 +08:00
socks 转全局不能简单实现,网络模式选 host 的话,直接跟本地使用一样,用 127.0.0.1 就可以,其他模式,我一般写 host 的局域网 ip 地址,缺点就是 ip 变了要改,不知道还有没有其他更合适的写法。
shellus
2020-02-17 10:48:51 +08:00
一个比较好的办法是使用一个 openwrt 容器来运行一个透明代理,然后要走代理的容器的网络接到这个 openwrt 的 lan 口
conn4575
2020-02-17 12:10:32 +08:00
同意楼上的,最好买个软路由,然后在上面折腾翻墙,本机即使你搞定了 docker 代理问题,你以后还会遇到 curl 如何翻墙、wget 如何翻墙 git 如何翻墙等一系列问题,直接在路由器上折腾虽然初期可能跟花时间,但是一劳永逸
rome7054
2020-02-17 12:18:52 +08:00
ubuntu 不知道,只知道 vrayx 是可以设置局域网能共享的,socks5 或者 http 都行。
那么假设你有个可访问的 socks5 代理了,下面是我常用的脚本:
➜ proxy ls
reset_docker_proxy.sh set_docker_proxy.sh
➜ proxy cat set_docker_proxy.sh
#!/bin/bash

#please modify your proxy

#proxys='Environment="HTTP_PROXY=socks5://10.254.0.16:1081" "HTTPS_PROXY=socks5://10.254.0.16:1081" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"'


proxys='Environment="HTTP_PROXY=socks5://172.10.30.67:1081" "HTTPS_PROXY=socks5://172.10.30.67:1081" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"'


#other_proxy_example='Environment="HTTP_PROXY=http://172.10.30.22:1081" "HTTPS_PROXY=http://172.10.30.22:1081" "NO_PROXY=localhost,127.0.0.1"'

mkdir -p /etc/systemd/system/docker.service.d/
echo "add proxy to /etc/systemd/system/docker.service.d/docker-proxy.conf"
echo "[Service]" >> /etc/systemd/system/docker.service.d/docker-proxy.conf
echo $proxys >> /etc/systemd/system/docker.service.d/docker-proxy.conf

echo "restarting docker"
systemctl daemon-reload
systemctl restart docker

echo "your docker Environment: "
systemctl show --property=Environment docker
echo "set proxy successful, remember to recovery later"


➜ proxy cat reset_docker_proxy.sh
#!/bin/bash

echo "remove proxy config file"
rm /etc/systemd/system/docker.service.d/docker-proxy.conf

echo "restarting docker"
systemctl daemon-reload
systemctl restart docker

echo "now your docker Environment is:"
systemctl show --property=Environment docker
echo "remove proxy successful"
➜ proxy
locoz
2020-02-17 12:40:27 +08:00
直接 iptables 全局转发到 v2ray,然后 v2ray 再针对需要加速的进行转发就行了
Kobayashi
2020-02-17 16:39:25 +08:00
直接 Mellow,利用 TUN 拦截所有流量自动代理分流。
https://github.com/mellow-io/mellow

规则也是现成的
https://github.com/laggardkernel/proxifier-rules

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

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

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

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

© 2021 V2EX