得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

docker 配置代理

在 linux 的 Docker 中配置代理通常需要区分不同的应用场景,因为 Docker 的不同组件(下载镜像、容器内抓取数据、编译打包)读取代理配置的位置是不同的。

以下是三种最常见的 Docker 代理配置方法:

场景一:配置 Docker Daemon 代理(docker pull 慢、超时、拉不动镜像)

当在终端执行 docker pull 时,是由 Docker Daemon 后台守护进程去下载镜像的,因此直接在终端 export 环境变量是无效的,必须通过 systemd 配置

操作步骤:

  1. 创建配置目录(如果不存在):
1
sudo mkdir -p /etc/systemd/system/docker.service.d
  1. 新建或编辑配置文件:
1
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
  1. 填入代理服务器信息(请将 proxy 替换为你实际的代理 IP 和端口):
1
2
3
4
[Service]
Environment="HTTP_PROXY=proxy"
Environment="HTTPS_PROXY=proxy"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
  1. 刷新 systemd 配置并重启 Docker 服务:
1
2
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 验证是否生效:
    执行 docker info,在输出的底部如果看到 HTTP ProxyHTTPS Proxy 字样,说明配置成功

场景二:配置 Container 容器内代理(容器内部网络请求慢,如 curl 报错)

如果你希望启动的容器内部自动带有代理(例如容器内跑的脚本需要请求外网 API,或者安装依赖),可以通过修改用户目录下的 .docker/config.json 来实现全局注入

操作步骤:

  1. 编辑当前用户的 Docker 配置文件:
1
2
mkdir -p ~/.docker
vim ~/.docker/config.json
  1. 添加或加入以下 proxies 配置:
1
2
3
4
5
6
7
8
9
{
"proxies": {
"default": {
"httpProxy": "proxy",
"httpsProxy": "proxy",
"noProxy": "localhost,127.0.0.1"
}
}
}
  1. 生效方式:
    此配置无需重启 Docker,但只对之后新建的容器生效;如果容器已经 docker create 过,只是重新 start,环境变量不会重新注入

💡 替代方案(单次临时生效):
如果你不想污染全局配置,可以在 docker run 时通过 -e 注入变量:

1
2
3
4
5
6
docker run -d \
-e HTTP_PROXY="proxy" \
-e HTTPS_PROXY="proxy" \
-e http_proxy="proxy" \
-e https_proxy="proxy" \
你的镜像名称

场景三:配置构建阶段代理(Dockerfile 编译打包时安装依赖慢)

A:配置 docker build 代理(Dockerfile 编译打包时安装依赖慢)

在使用 docker build 构建新镜像时(主要考虑 Dockerfile 里的 RUN 阶段,例如执行 RUN pip installRUN apt-get update 时发生卡顿等网络连带问题),需要通过参数传递代理

操作步骤:

在执行编译命令时,使用 --build-arg 参数将代理传进去:

1
2
3
4
docker build \
--build-arg HTTP_PROXY=proxy \
--build-arg HTTPS_PROXY=proxy \
-t my-image-name:latest .

B:配置 buildx Builder 代理(使用 docker-container driver 构建多架构镜像)

docker buildx create --driver docker-container 会启动一个独立的 BuildKit builder 容器,这个 builder 容器自己需要访问 registry 拉基础镜像、读取 metadata,而场景三 -A 中 --build-arg HTTP_PROXY=... 主要影响 Dockerfile 里的 RUN 阶段,所以多架构 buildx 构建时,可能需要同时配置:

  • builder 容器代理:--driver-opt env.HTTP_PROXY=...
  • 构建阶段代理:--build-arg HTTP_PROXY=...

操作步骤:

1
2
3
4
5
6
7
8
9
docker buildx create \
--name multiarch \
--use \
--driver docker-container \
--driver-opt network=host \
--driver-opt env.HTTP_PROXY=proxy \
--driver-opt env.HTTPS_PROXY=proxy

docker buildx inspect --bootstrap # 不是必需步骤,但建议执行:它会提前启动 builder,并检查 BuildKit 容器和平台支持是否正常

然后构建:

1
2
3
4
5
6
7
8
9
docker buildx build \
--build-arg HTTP_PROXY=proxy \
--build-arg HTTPS_PROXY=proxy \
--build-arg http_proxy=proxy \
--build-arg https_proxy=proxy \
--platform linux/arm64 \
-t my-image-name:latest \
--output type=docker,dest=my-image-name.tar \
.

be slow to promise and quick to perform.