首页 > 其他分享 >如何配置docker通过代理服务器拉取镜像

如何配置docker通过代理服务器拉取镜像

时间:2023-06-21 15:15:38浏览次数:49  
标签:daemon 配置 代理服务器 拉取 proxy docker PROXY

如果 docker 所在的环境是通过代理服务器和互联网连通的,那么需要一番配置才能让 docker 正常从外网正常拉取镜像。然而仅仅通过配置环境变量的方法是不够的。本文结合已有文档,介绍如何配置代理服务器能使docker正常拉取镜像。

本文使用的docker 版本是

docker --version
Docker version 24.0.2, build cb74dfc

问题现象

如果不配置代理服务器就直接拉镜像,docker 会直接尝试连接镜像仓库,并且连接超时报错。如下所示:

$ docker pull busybox
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled 
while waiting for connection (Client.Timeout exceeded while awaiting headers)

容易误导的官方文档

有这么一篇关于 docker 配置代理服务器的 官方文档 ,如果病急乱投医,直接按照这篇文章配置,是不能成功拉取镜像的。

我们来理解一下这篇文档,文档关键的原文摘录如下:

If your container needs to use an HTTP, HTTPS, or FTP proxy server, you can configure it in different ways: Configure the Docker client On the Docker client, create or edit the file ~/.docker/config.json in the home directory of the user that starts containers.

...

When you create or start new containers, the environment variables are set automatically within the container.

这篇文档说:如果你的 容器 需要使用代理服务器,那么可以以如下方式配置: 在运行容器的用户 home 目录下,配置 ~/.docker/config.json 文件。重新启动容器后,这些环境变量将自动设置进容器,从而容器内的进程可以使用代理服务。

所以这篇文章是讲如何配置运行 容器 的环境,与如何拉取镜像无关。如果按照这篇文档的指导,如同南辕北辙。

要解决问题,我们首先来看一般情况下命令行如何使用代理。

环境变量

常规的命令行程序如果要使用代理,需要设置两个环境变量:HTTP_PROXYHTTPS_PROXY 。但是仅仅这样设置环境变量,也不能让 docker 成功拉取镜像。

我们仔细观察 上面的报错信息,有一句说明了报错的来源:

Error response from daemon:

因为镜像的拉取和管理都是 docker daemon 的职责,所以我们要让 docker daemon 知道代理服务器的存在。而 docker daemon 是由 systemd 管理的,所以我们要从 systemd 配置入手。

正确的官方文档

关于 systemd 配置代理服务器的 官方文档在这里,原文说:

The Docker daemon uses the HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environmental variables in its start-up environment to configure HTTP or HTTPS proxy behavior. You cannot configure these environment variables using the daemon.json file.

This example overrides the default docker.service file.

If you are behind an HTTP or HTTPS proxy server, for example in corporate settings, you need to add this configuration in the Docker systemd service file.

这段话的意思是,docker daemon 使用 HTTP_PROXY, HTTPS_PROXY, 和 NO_PROXY 三个环境变量配置代理服务器,但是你需要在 systemd 的文件里配置环境变量,而不能配置在 daemon.json 里。

具体操作

下面是来自 官方文档 的操作步骤和详细解释:

1、创建 dockerd 相关的 systemd 目录,这个目录下的配置将覆盖 dockerd 的默认配置

$ sudo mkdir -p /etc/systemd/system/docker.service.d

新建配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf,这个文件中将包含环境变量

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80"
Environment="HTTPS_PROXY=https://proxy.example.com:443"

如果你自己建了私有的镜像仓库,需要 dockerd 绕过代理服务器直连,那么配置 NO_PROXY 变量:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80"
Environment="HTTPS_PROXY=https://proxy.example.com:443"
Environment="NO_PROXY=your-registry.com,10.10.10.10,*.example.com"

多个 NO_PROXY 变量的值用逗号分隔,而且可以使用通配符(*),极端情况下,如果 NO_PROXY=*,那么所有请求都将不通过代理服务器。

重新加载配置文件,重启 dockerd

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

检查确认环境变量已经正确配置:

$ sudo systemctl show --property=Environment docker

从 docker info 的结果中查看配置项。

这样配置后,应该可以正常拉取 docker 镜像。

结论

docker 镜像由 docker daemon 管理,所以不能用修改 shell 环境变量的方法使用代理服务,而是从 systemd 角度设置环境变量。

参考资料
https://www.lfhacks.com/tech/pull-docker-images-behind-proxy/#correct
https://stackoverflow.com/questions/69047394/cant-pull-docker-image-behind-a-proxy
https://mikemylonakis.com/unix/docker-proxy/
https://docs.docker.com/config/daemon/systemd/

标签:daemon,配置,代理服务器,拉取,proxy,docker,PROXY
From: https://www.cnblogs.com/abc1069/p/17496240.html

相关文章

  • 使用docker compose部署emqx集群
    1、docker-compose.yml文件,内容如下:version:'3'services:emqx1:image:emqx:5.0.26container_name:emqx1environment:-"EMQX_NODE_NAME=emqx@node1.emqx.io"-"EMQX_CLUSTER__DISCOVERY_STRATEGY=static"-......
  • docker-k8s-日志分析
    1.mac安全模式关了2.docker源改了,国内的3、k8s的git仓库,匹配到版本后,下载了。依旧无法正常启动···2023062113:36:45第一次日志记录2023-06-2113:31:23.630123+0800localhostcom.docker.backend[17097]:(0fd28985)ead7cf58-KubernetesManagerC<-Sd75b0a51-VMD......
  • docker部署
    dockerdocker是一个开源的应用容器引擎,用于开发应用、交付(shipping)应用、运行应用,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到云服务器的Linux上。docker容器是轻量级的虚拟机,可以将操作系统底层虚拟机化,而虚拟机则是虚拟化硬件docker行了进一步的封......
  • 根据ubuntu:20.04制作python环境docker镜像
    因为有个算法是python写的,要在服务器上调用,之前是直接根据jdk镜像制作的环境,现在要装python,jdk双环境,只能自己制作一个镜像出来了,命令如下FROMubuntu:20.04ENVTZ=Asia/ShanghaiENVLANGC.UTF-8RUNmv/etc/apt/sources.list/etc/apt/sources.list.bakCOPYsources.li......
  • Docker部署clickhouse
    Clickhouse特点完备的DBMS:不仅是个数据库,也是个数据库系统列存储和数据压缩:典型的olap数据库特性向量化并行:利用CPU的SIMD(SingleINstructionMUltipleData),单条指令操作多条数据多线程并行:向量化并行利用硬件采取数据并行(缺陷:不适应较多分支的判断),多线程级并行提高并发关系......
  • Docker 命令
    Docker命令attach登录到容器直接操作build 构建镜像commit将容器打包成另一个镜像cp   在容器与本地系统间复制文件create创建一个新的容器,不启动diff  查看容器中新增或修改的目录及文件events查看docke......
  • 通过 docker-compose 快速部署 DolphinScheduler 保姆级教程
    目录一、概述二、前期准备1)部署docker2)部署docker-compose三、安装MySQL数据库四、安装注册中心Zookeeper五、ApacheDolphinScheduler编排部署1)下载DolphinScheduler安装包2)配置2)安装MySQL驱动3)启动脚本bootstrap.sh4)构建镜像Dockerfile5)编排docker-compose.yaml6)开......
  • Docker镜像
    是什么是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Ja......
  • Docker --镜像容器学习笔记
    Docker简介准备工作1.前提知识-linux-Git2.课程定位和范围(基于JavaEE方向)-JavaEEjavaSpringMVC/springBoot/mybatis...docker基础篇-DockerGoSwarm/compose/machine/mesos/k8s/---CI/CDjenkinds整合docker高级篇是什么1.问题:为什......
  • Docker 常用命令
    DOCKER常用命令根据镜像创建:sudodockercreate-itimg_name启动容器:sudodockerstartcon_name停止容器:dockerstopcon_name删除容器:dockerrmcon_name改名:dockerrenameold_namenew_name进入容器:sudodockerexec-itcon_namebash退出容器:exit查看运行中的容......