草庐IT

快速设置 Docker 的三种网络代理配置

Roc.Chang 2023-07-25 原文

目录

通过代理访问网络是一个比较头疼的事情,例如:想访问远程的 Docker Daemon 需要代理,想拉取或推送国外的镜像需要代理,想容器内部访问国外的资源又需要代理。

上面的场景是不是让你很头大,但是请想开点,这篇文章将让你通往自由的国度。保护你的头发,让你留出更多的时间去做该做的事情。

上面说的是三个场景就是针对于不同的网络代理需要,根据需要处理即可。

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

参考 Docker 官方文档:Use the Docker command line

DockerClientDaemon 端是可以不在同一个机器上的,可以通过 docker -h 连接其他的 Docker Daemon

Client 端设置代理其实就是设置 Linux 系统的代理,从而让系统的命令行可以通过代理连接到外部的网络。一般只需要配置 HTTP_PROXYHTTPS_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 官方文档:Control Docker with systemd

有的时候我们会用到一些国外的镜像,比如搭建 k8s 时会用到 k8s.gcr.io 提供的镜像,但是无法正常 pull;或者你想将某些镜像上传到国外的镜像仓库中,都需要使用代理进行操作。

注:Docker 守护程序(dockerd)是在其启动环境中使用 HTTP_PROXYHTTPS_PROXYNO_PROXY 环境变量来配置 HTTPHTTPS 代理行为,需要在 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 touch /etc/systemd/system/docker.service.d/http-proxy.conf
    
  3. 选用你最喜欢的编辑器,编辑该文件并添加下面的内容,这里使用 vi/vim 进行编辑。

    vim /etc/systemd/system/docker.service.d/http-proxy.conf
    

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

    [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"
    

    【注】HTTP_PROXY 用于代理访问 http 请求,HTTPS_PROXY 用于代理访问 https 请求,如果想某个 IP域名不走代理则配置到 NO_PROXY中。

    添加完成后,保存即可。

  4. 刷新更改并重新启动 Docker

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

恭喜,Docker Daemon 代理配置完成!

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

参考 Docker 官方文档: Configure Docker to use a proxy server

该代理只针对于后续 build 或 run 的容器有效,已经创建好的不受影响。

主要是用于容器内部的网络访问。

本身容器就可以当做一个简化版的 Linux 系统,如果想实现容器内部的代理,则必须在容器内设置适当的环境变量。

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

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

  • Docker 17.06 及更早版本中,可以在构建映像(这会降低映像的可移植性)或创建或运行容器时通过指定参数来执行此操作。

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

通过参数配置在这里就不多说了,无非就是命令的使用。这里主要说一下 Docker 17.07 及更高版本中的全局配置:

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

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

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

    {
     "proxies":
     {
       "default":
       {
         "httpProxy": "http://127.0.0.1:7890",
         "httpsProxy": "http://127.0.0.1:7890",
         "noProxy": "*.test.example.com,.example2.com,127.0.0.0/8"
       }
     }
    }
    

    【注】HTTP_PROXY 用于代理访问 http 请求,HTTPS_PROXY 用于代理访问 https 请求,如果想某个 IP域名不走代理则配置到 NO_PROXY中。

    添加完成后,保存即可。

  2. 重新启动 Docker

    sudo systemctl restart docker
    

恭喜,Container 代理配置完成!

Roc’s Blog:详解 Docker 的三种网络代理配置

有关快速设置 Docker 的三种网络代理配置的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  3. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  4. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  5. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  6. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  7. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  8. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  9. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  10. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

随机推荐