Linux和Docker使用代理上网

公设

代理服务的通信协议、域名及端口为http://127.0.0.1:7890http://proxy.example.com:8080,下文根据具体情况修改。

搭建代理服务

TODO

在系统中使用[1]

临时配置

在需要代理的终端中运行

export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890

注:很多教程用http_proxyhttps_proxy,但是实测有些程序区分大小写并且只识别HTTP_PROXYHTTPS_PROXY,还有文章报告[3]有些程序只识别http_proxyhttps_proxy,所以推荐都写。

永久配置

将上述命令加入shell配置文件,如.bashrc.zshrc,再次不再赘述。

特定软件的设置

  • apt

    apt配置文件/etc/apt/apt.conf加入:

    apt.conf
    1
    Acquire::http::Proxy "http://127.0.0.1:7890"
  • git

    运行

    git config --global http.proxy 'socks5://127.0.0.1:1080' 
    git config --global https.proxy 'socks5://127.0.0.1:1080'

本节皆没测过,也许能用

在Docker中使用

Docker进程(Docker命令中)[2]

docker命令由守护进程dockerd执行,因此需要配置其管理者systemd

/etc/systemd/system/docker.service.d/proxy.conf(不存在则创建)输入

proxy.conf
1
2
3
4
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

no_proxy相关介绍可以查阅[3]。

设置完成后要重启systemddockerd

sudo systemctl daemon-reload
sudo systemctl restart docker

容器中代理

方法一:Docker配置[2]

~/.docker/config.json文件中写入:

config.json
1
2
3
4
5
6
7
8
9
{
"proxies": {
"default": {
"httpProxy": "http://proxy.example.com:8080",
"httpsProxy": "http://proxy.example.com:8080",
"noProxy": "localhost,127.0.0.1,.example.com"
}
}
}

注意:该方法对所有容器生效,且需要Docker版本在17.07以上。

方法二:配置环境变量

参考在Linux系统中配置的方法,通过配置容器容器环境变量实现。例如启动容器时使用-e参数,送入httpProxyhttpsProxy环境变量。具体方法参阅相关资料。

注意:该方法仅对当前容器有效。

构建容器过程中代理

构建容器时也启动了一个容器,但是不应当配置镜像的环境变量以避免后效。因此使用--build-arg配置仅在构建时有效的环境变量。

例如:

docker build -t your/image:tag \
    --build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
    --build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
    --build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
    .

参考资料

  1. Linux 让终端走代理的几种方法 - 知乎
  2. 如何优雅的给 Docker 配置网络代理 - 腾讯云开发者社区-腾讯云
  3. We need to talk: Can we standardize NO_PROXY? | GitLab