51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

解决Docker无法拉取镜像问题

前几天还好好的,这两天拉取docker镜像的时候发现一直无法拉取了,应该是进了GFW了,整理一下如何正常拉取镜像。

基本原理 {#基本原理}

Docker是一种容器实现方式,巴拉巴拉,这里不细说了,其采用的C/S架构,其中

  • 客户端:命令行工具,负责与服务器通信。
  • 服务端: docker服务( docker daemon),承担创建、运行和下载容器镜像服务

所以这里如果处理无法拉取镜像的问题,即需要配置服务端,让其能够正常拉取。

Docker守护程序在其启动环境中使用以下环境变量来配置HTTP或HTTPS代理行为:

  • HTTP_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
  • NO_PROXY
  • no_proxy

处理方式 {#处理方式}

默认代理模式添加

创建一个systemd插件目录docker服务:

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

                    </code>
                  </pre>



 
创建/etc/systemd/system/docker.service.d/http-proxy.conf文件,增加了HTTP_PROXY环境变量:

 
                        
                          [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"

                        </code>
                      </pre>



     
    如果使用HTTPS代理服务器,配置HTTPS_PROXY环境变量:

     
                            
                              [Service]
        Environment="HTTPS_PROXY=https://proxy.example.com:3129"

                            </code>
                          </pre>



         
        或者按需配置多个环境变量:

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

                                </code>
                              </pre>



             
            如果代理路径中需要使用特殊字符包括 ` #?!()[]{} ` 需要进行转义处理。 
             例如:

             
                                    
                                      [Service]
                Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%
                                      23pass@proxy.example.com
                                      :3128/"

                                    </code>
                                  </pre>



                 
                如果有不需要代理的地址,可以通过NO_PROXY环境变量说明。 
                 NO_PROXY变量指定一个字符串,该字符串包含应从代理中排除的主机的逗号分隔值。您可以指定以下选项来排除主机:

                 

                  
                * IP地址前缀(1.2.3.4)

                  
                * 域名或特殊的DNS标签(*)

                  
                * 域名匹配该名称和所有子域。以"."开头的域名仅匹配子域。例如,给定域foo.example.com和example.com: 
                     
                      
                  * example.com比赛example.com和foo.example.com,以及

                      
                  * .example.com仅匹配foo.example.com

                     

                  
                * 一个星号(*)表示不应进行任何代理

                  
                * IP地址前缀(1.2.3.4:80)和域名(foo.example.com:80) 
                   例如:

                 

                 
                                        
                                          [Service]
                    Environment="HTTP_PROXY=http://proxy.example.com:3128"
                    Environment="HTTPS_PROXY=https://proxy.example.com:3129"
                    Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"

                                        </code>
                                      </pre>



                     
                    刷新配置并重启Docker

                     
                                            
                                              sudo systemctl daemon-reload
                        sudo systemctl restart docker

                                            </code>
                                          </pre>



                         
                        验证配置是否已加载

                         
                                                
                                                  sudo systemctl show --property=Environment docker

                            Environment=HTTP_PROXY=http://proxy.example.com:3128 HTTPS_PROXY=https://proxy.example.com:3129 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp


                                                </code>
                                              </pre>



                             
                            在Docker引擎版本23.0和更高版本中,可以在daemon.json文件修改,修改方式如下:

                             
                                                    
                                                      {
                                  "proxies": {
                                    "http-proxy": "http://proxy.example.com",
                                    "https-proxy": "https://proxy.example.com",
                                    "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
                                  }
                                }

                                                    </code>
                                                  </pre>



                                 
                                这些配置会覆盖默认配置。

赞(0)
未经允许不得转载:工具盒子 » 解决Docker无法拉取镜像问题