Docker 如何使用 Socks5 代理?
2024-09-03 by dongnan
开始之前
自 2024-06-06 开始,国内的 Docker Hub
镜像加速器相继停止服务,需要为 Docker daemon
配置代理或自建镜像加速服务。
因为有一台在HK的服务器可以访问 Docker Hub
,所以这里选择采用 自建socks5
服务器并为Docker
配置代理的方案。
环境描述
代理服务器
OS: Ubuntu Server 22.04 LTS
Docker: 24.0.7
Docker-compose: 1.29.2
Docker客户端
OS: Ubuntu Server 20.04 LTS
Docker: 19.03.15
部署服务端
服务端选择的是 go-socks5-proxy
,它是使用 golang 语言开发的 socks5
服务端程序,代码简单且易用。
解决无法使用 docker
官方仓库的难题,另外作者提供了开箱即用的 Docker 镜像。
Docker-compose 编排文件
version: '3'
services:
socks5:
restart: always
image: serjs/go-socks5-proxy
#env_file: .env
environment:
- TZ=Asia/Chongqing
ports:
- "8080:1080"
可以在 .env
文件设置环境变量:
PROXY_USER # 用户名,默认空
PROXY_PASSWORD # 密码,默认空
PROXY_PORT # 监听端口,默认 1080
注意:根据实际情况决定是否使用认证,这里服务器的防火墙规则设置了来源ip地址访问限制,所以没有加认证的环境变量。
创建容器
$ docker-compose up -d
容器日志
$ docker logs socks5_socks5_1 | head
2024/08/09 10:33:16 Start listening proxy service on port 1080
监听端口表示容器创建成功!
测试服务
$ curl -I --socks5 http://mirrors.xxx.com:8080 https://docker.io/library/busybox
HTTP/1.1 301 Moved Permanently
content-length: 0
location: https://www.docker.com/library/busybox
成功访问 Docker Hub ,接下来为 Docker daemon
配置 socks5
代理。
Docker配置代理
创建脚本
$ vim set_docker_proxy.sh
根据实际情况,替换成自己的代理服务器地址
#!/bin/bash
# HTTP_PROXY与HTTPS_PROXY 替换成自己的代理服务器
# NO_PROXY 替换成不需要使用代理的地址
proxys='Environment="HTTP_PROXY=socks5://mirrors.xxx.com:8080" "HTTPS_PROXY=socks5://mirrors.xxx.com:8080" "NO_PROXY=localhost,127.0.0.1,192.168.0.0/16"'
# 创建一个配置文件
mkdir -p /etc/systemd/system/docker.service.d/
echo "[Service]" > /etc/systemd/system/docker.service.d/docker-proxy.conf
echo ${proxys} >> /etc/systemd/system/docker.service.d/docker-proxy.conf
# 重启服务
systemctl daemon-reload
systemctl restart docker
# 验证
systemctl show --property=Environment docker
执行脚本
$ bash -x set_docker_proxy.sh
验证
# 检查 docker 代理信息
$ docker info | grep -i proxy
WARNING: No swap limit support
HTTP Proxy: socks5://mirrors.xxx.com:8080
HTTPS Proxy: socks5://mirrors.xxx.com:8080
No Proxy: localhost,127.0.0.1,192.168.0.0/16
使用
试试下载 nginx
镜像
$ docker pull nginx:alpine
alpine: Pulling from library/nginx
46b060cc2620: Pull complete
省略...
fb923a41dc10: Pull complete
Digest: sha256:208b70eefac13ee9be00e486f79c695b15cef861c680527171a27d253d834be9
Status: Downloaded newer image for nginx:alpine
docker.io/library/nginx:alpine
经过九牛二虎之力后终于可以下载镜像了。。。
其它
如果是自建镜像加速服务方案,可以使用 Harbor 仓库的镜像代理功能。
-
当需要一个公有镜像但是本地没有的时候,可以通过如下方式访问:
docker pull ${harbor_server_name}/${proxy_project}/google/pause:latest
-
如果是官方镜像加上默认的库名称 library 即可:
docker pull ${harbor_server_name}/${proxy_project}/library/nginx:latest