跳转至

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
    

参考文档

回到页面顶部