docker-代理

docker-代理

区分3种场景

  1. 拉取镜像时的代理
  2. 深入到容器内部的应用的代理
  3. docker build 时的代理

一、镜像拉取代理

因为镜像的拉取和管理都是 docker daemon 进行的, 所以需要配置和重启 daemon

  1. 方法一: 镜像站模式 /etc/docker/daemon.json
{
    "registry-mirrors": ["https://docker.1ms.run"]
}

使用方式:

docker image pull mysql:5.7.40
  1. 方法二: 镜像站模式-直连
docker pull docker.1ms.run/library/mysql:5.7.40

一些镜像站列表

https://tools.opsnote.top/registry-mirrors/

便捷脚本

#!/bin/bash
# pull_proxy_docker_images.sh
# 语法: pull_proxy_docker_images.sh mysql:5.7.40

image_name=$1

proxy_addr='docker.1ms.run'
proxy_image=${proxy_addr}/library/$image_name


# 判断镜像名是否包含 '/'
if [[ "$image_name" == */* ]]; then
    proxy_image=${proxy_addr}/$image_name
else
    proxy_image=${proxy_addr}/library/$image_name
fi

docker pull ${proxy_image}
docker tag ${proxy_image} ${image_name}
docker rmi ${proxy_image}
  1. 方法三: socks5代理
# /usr/lib/systemd/system/docker.service
#or
# /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
# 指定目标地址
Environment="HTTP_PROXY=http://127.0.0.1:15777"
Environment="HTTPS_PROXY=http://127.0.0.1:15777"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.5.0/24,docker-registry.example.com"
systemctl daemon-reload
systemctl restart docker
systemctl show --property=Environment docker
  1. 方法四: vpn透明代理

修改网关至 vpn 节点

二、容器内部的应用代理

~/.docker/config.json

支持参数: httpProxy,httpsProxy,ftpProxy,noProxy,allProxy

{
 "proxies":
 {
  // 针对所有启动的容器
   "default":
   {
     "httpProxy": "http://10.2.1.2:8118",
     "httpsProxy": "http://10.2.1.2:8118",
     "noProxy": "*.test.example.com,.example2.com,127.0.0.0/8,10.10.1.232"
   },

  // 针对某个容器的高优先级配置
  "tcp://docker-daemon1.example.com": {
     "noProxy": "*.internal.example.net"
   }


 }
}

命令行启动时针对单个容器

docker run --env HTTP_PROXY="http://proxy.example.com:3128" redis

三、构建镜像时的代理

即 docker build 时

构建时使用 --build-arg 标志, 而在运行容器时使用 --env 标志来配置代理

注意构建镜像时如果使用环境变量设置代理会将配置嵌入到镜像中

docker build \
    --build-arg HTTP_PROXY="http://proxy.example.com:3128" \
    --build-arg HTTPS_PROXY="https://proxy.example.com:3129" .
最后更新于