Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: 在windows使用WSL2的docker时,代理设置建议 #874

Closed
Lustrewilkin opened this issue Jun 16, 2023 · 3 comments
Closed

[Bug]: 在windows使用WSL2的docker时,代理设置建议 #874

Lustrewilkin opened this issue Jun 16, 2023 · 3 comments

Comments

@Lustrewilkin
Copy link

Installation Method | 安装方法与平台

Docker(Windows/Mac)

Version | 版本

Latest | 最新版

OS | 操作系统

Windows

Describe the bug | 简述

相关材料:https://learn.microsoft.com/zh-cn/windows/wsl/networking

简述:
现在新的 windows 使用的虚拟机机制是 WSL 2 ,他的网络工作与 WSL 不同,因此使用 docker + WSL 的设置代理也不同。

解决方案:
在win主机使用命令行工具,输入 ipconfig ,复制自己的 ipv4 ,使得有如下形式的代理:
协议 + 主机ip + 端口
可能无法通过 check_proxy 检查,但不影响使用

原理叙述:
WSL2 有一个带有其自己独一无二的 IP 地址的虚拟化以太网适配器。这意味着他和主机不在同一个网络中,而是自成一体。
一个证据是当你在主机输入 ipconfig时,能看到 WSL 有一个单独的网络配置和 ip 地址。

由于不在一个网络中,无论是自环ip(127.0.0.1)还是(localhost)都只能指向 WSL2 自己的虚拟机 ip 地址而不是主机的,代理也随之失效。
因此,通过(局域网)主机 ip 访问主机的端口(记得放行防火墙),这样就可以走主机的代理了。

讨论:

  • 这意味着主机 IP 改变,设置就会失效
    • 一个合理的方法是每次都检测主机 IP 而不是用 127.0.0.1 设置主机 IP,避免虚拟机网络问题。
    • 配置时只需要提供端口即可

以下一个可能的解决方案

  1. 在 image 有 Dockerfile 的目录中,创建一个名为 auto-proxy.sh 的文件
#!/bin/bash
# get host IP from /etc/resolv.conf
HOST_IP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
# get container IP from hostname
CONTAINER_IP=$(hostname -I | awk '{print $1}')
# set proxy environment variables
export http_proxy="http://$HOST_IP:8080"
export https_proxy="http://$HOST_IP:8080"
export no_proxy="$CONTAINER_IP,$HOST_IP"
  1. 在 Dockerfile 中添加命令
# copy auto-proxy.sh to the image
COPY auto-proxy.sh /root/auto-proxy.sh
# make it executable
RUN chmod +x /root/auto-proxy.sh
# run it on startup
RUN echo "source /root/auto-proxy.sh" >> /root/.bashrc
  • 这个方法只适用于在 WSL2 容器中运行 Docker 的情况,如果你在其他环境中运行 Docker,你可能需要修改 auto-proxy.sh 中的获取主机 IP 的方式。

Screen Shot | 有帮助的截图

image

Terminal Traceback & Material to Help Reproduce Bugs | 终端traceback(如有) + 帮助我们复现的测试材料样本(如有)

No response

@binary-husky
Copy link
Owner

谢谢反馈

@Lustrewilkin
Copy link
Author

Lustrewilkin commented Jun 16, 2023

在wiki中引用了 https://github.com/binary-husky/gpt_academic/wiki/%E4%BD%BF%E7%94%A8WSL2%EF%BC%88Windows-Subsystem-for-Linux-%E5%AD%90%E7%B3%BB%E7%BB%9F%EF%BC%89%E9%83%A8%E7%BD%B2

再次回顾您关于WSL2的安装,可能相关表述存在问题。
image

实际上是每次要获得主机 ip,如果写在config中,main.py在子系统中运行,应该是获得了WSL-Ubuntu自己的IP,您可能需要修改表述,或建议大家用miniconda之类的方法避免网络设置

最后,docker desktop在使用WSL2的情况下,具有代理功能,如图所示,但我还没使用过,不知道可行性
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants