Docker网络代理配置in CentOS

Docker的网络代理

背景

在一些实验室环境,服务器没有直接连接外网的权限,需要通过网络代理。我们通常会将网络代理直接配置在/etc/environment/etc/profile之类的配置文件中,这对于大部分操作都是可行的。然而,docker命令却使用不了这些代理。比如docker pull时需要从外网下载镜像,就会出现如下错误:
在这里插入图片描述

Docker Client- 代理访问远程的 Docker Daemon

DockerClientDaemon 端是可以不在同一个机器上的,可以通过 docker -h 连接其他的 Docker Daemon
在这里插入图片描述
Client 端设置代理其实就是设置 Linux 系统的代理,从而让系统的命令行可以通过代理连接到外部的网络。一般只需要配置 HTTP_PROXY HTTPS_PROXY 这两个即可。

  • 临时生效: 在命令行中执行下面的命令,根据自己实际代理 IP 与代理端口设置(需要允许局域网连接):
export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890
  • 永久生效,在系统变量中配置。系统变量配置有多个地方,例如在 /etc/profile 文件的底部添加下面的内容:
export https_proxy=http://127.0.0.1:7890 
export http_proxy=http://127.0.0.1:7890 

让配置文件生效:

source /etc/profile 

Docker Client 代理配置完成!

Docker Daemon - 代理拉取或推送国外镜像

原理 Docker 守护程序(dockerd)是在其启动环境中使用 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY 环境变量来配置 HTTP 或 HTTPS 代理行为,需要在 Docker systemd 服务文件中添加此配置。 在 daemon.json 文件或者是在系统环境变量文件中配置它们都不会使其生效。
在这里插入图片描述

要实现 Daemon 代理会比较复杂一些,并且下面的操作将覆盖默认的 docker.service 文件,这样当 Docker 启动的时候就会读取到下面的代理配置信息:

  1. /etc/systemd/system 目录下创建 docker.service.d 目录

    $ sudo mkdir -p /etc/systemd/system/docker.service.d
    
  2. 在该目录下创建 http-proxy.conf 文件

    $ sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf
    
  3. 在这个proxy.conf文件(可以是任意*.conf的形式)中,添加以下内容:

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:8080/"
    Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
    Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
    

    如果想某个 IP或域名不走代理则配置到 NO_PROXY中,proxy.example.com:8080要换成可用的免密代理。 通常使用Cntlm在本机自建免密 代理,去对接公司的代理。 可参考《Linux下安装配置Cntlm代理》

    查看修改结果

    $ sudo systemctl show --property=Environment docker
    
  4. 代理配置完成后,docker代理的修改比较特殊,它实际上是改systemd的配置,因此需要重载systemd并重启docker才能生效。使得代理生效:

    $ sudo systemctl daemon-reload   #重载 systemd 的脚本配置文件内容
    $ sudo systemctl restart docker
    

    Docker Daemon 代理配置完成!

Container- 容器内部代理访问国外资源

主要是用于容器内部的网络访问。
在这里插入图片描述
本身容器就可以当做一个简化版的 Linux 系统,如果想实现容器内部的代理,则必须在容器内设置适当的环境变量。

  • 直接在容器内部进行修改,虽然也可以这样做,但是不是很推荐,如果不是测试使用,最好还是保证容器的完整性。

如果是想要将该容器导出并移植到其他机器上去的话,那肯定是在容器内部修改环境变量导出。

  • Docker 17.06 及更早版本中,可以在构建映像(这会降低映像的可移植性)或创建或运行容器时通过指定参数来执行此操作。
    直接在其运行时通过-e注入http_proxy等环境变量。

  • Docker 17.07 及更高版本中,Docker 提供了一个全局的配置,可以通过配置 Docker 客户端以自动将代理信息传递给容器,从而让所有的容器内部都支持代理访问。 这两种方法分别适合不同场景。

这里主要说一下 Docker 17.07 及更高版本中的全局配置:

  1. Docker 客户端上,在启动容器的用户的主目录中创建或编辑文件 ~/.docker/config.json。 如果没有该目录或文件则使用相应的用户来创建。

    # 创建目录
    mkdir ~/.docker
    # 创建编辑配置文件
    vi ~/.docker/config.json
    

    根据自身需要添加下面的内容并替换为实际的配置,一般只需要添加 HTTP_PROXYHTTPS_PROXY 即可:

    {
     "proxies":
     {
       "default":
       {
         "httpProxy": "http://proxy.example.com:8080",
         "httpsProxy": "http://proxy.example.com:8080",
        "noProxy": "localhost,127.0.0.1,.example.com"
       }
     }
    }
    

    这个是用户级的配置,除了proxiesdocker login等相关信息也会在其中。 而且还可以配置信息展示的格式、插件参数等。

    config.json非常方便,默认在所有配置修改后启动的容器生效,适合个人开发环境。

  2. 重新启动Docker

    sudo systemctl restart docker
    

CI/CD的自动构建环境、或者实际上线运行的环境中,全局配置的方法就不太合适,用-e注入这种显式配置会更好,减轻对构建、部署环境的依赖。 当然,在这些环境中,最好用良好的设计避免配置代理上网。

Container 代理配置完成!、

docker build代理

虽然docker build的本质,也是启动一个容器,但是环境会略有不同,用户级配置无效。 在构建时,需要注入http_proxy等参数。

$ docker build . \
    --build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
    --build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
    --build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
    -t your/image:tag

注意:无论是docker run还是docker build,默认是网络隔绝的。 如果代理使用的是localhost:3128这类,则会无效。 这类仅限本地的代理,必须加上--network host才能正常使用。 而一般则需要配置代理的外部IP,而且代理本身要开启gateway模式。

重启生效
代理配置完成后,reboot重启当然可以生效,但不重启也行。

docker build代理是在执行前设置的,所以修改后,下次执行立即生效。 Container代理的修改也是立即生效的,但是只针对以后启动的Container,对已经启动的Container无效。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
配置Docker网络代理,你可以参考Docker官方文档配置方法。首先,你需要确定要使用的代理服务器的地址和端口。如果你使用的是本地代理,比如localhost:3128,你需要在docker命令添加--network host参数。这样Docker容器将能够正常使用本地代理。如果你使用的是外部IP地址的代理服务器,并且代理本身需要开启Gateway模式,你需要在Docker守护进程的配置文件添加代理设置。具体的配置方法可以参考Linux下安装配置Cntlm代理的教程。完成配置后,你需要重启Docker守护进程使配置生效。你可以使用以下命令来重启Docker守护进程并查看配置是否正确: sudo systemctl daemon-reload sudo systemctl restart docker systemctl show --property=Environment docker /etc/systemd/system/docker.service.d 这样你就成功配置Docker网络代理。请根据你的实际情况进行相应的配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [快速设置 Docker 的三种网络代理配置](https://blog.csdn.net/peng2hui1314/article/details/124267333)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Docker 配置网络代理](https://blog.csdn.net/qq_39698985/article/details/123748820)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值