当前位置: 首页 > article >正文

Docker 代理配置全攻略:从入门到企业级实践

Docker 代理配置终极指南:从原理到实践

在企业环境中,Docker 的网络访问常常需要通过代理来完成,例如拉取镜像或在容器内访问外部网络。本文将从核心流程、配置方法到验证步骤,全面解析 Docker 代理的配置方式,助你轻松应对各种场景。


一、核心流程与架构

理解 Docker 代理的关键在于区分 客户端(Docker Client)守护进程(Docker Daemon) 的职责。以下是两种代理方式的核心流程对比:

1. ~/.docker/config.json 代理

  • 适用场景:仅需 docker pull 等客户端操作通过代理。
  • 流程
    1. 通过代理连接
    2. 返回镜像数据
    3. 发送数据
    Client
    Registry
    Docker Daemon

2. dockerd 代理

  • 适用场景:容器运行、构建等需要通过代理访问外部网络。
  • 流程
    通过代理连接
    Client
    Docker Daemon
    Registry

3. 完整通信架构

Docker 的通信分为两部分:

  • 本地通信:Client 与 Daemon 之间的交互,不受代理影响。
  • 外部请求:Daemon 或容器访问 Registry 或互联网,受代理控制。
    (1) 本地通信
    (不受任何代理影响)
    (2) 外部网络请求
    (受dockerd代理控制)
    直接或通过config.json代理
    Docker Client
    Docker Daemon
    Internet
    Registry

关键记忆点

  • config.json:只管客户端到 Registry 的连接(“家门口”)。
  • dockerd 代理:控制镜像拉取、容器运行、构建等所有外联(“家里”)。
  • 两者结合:实现企业级全链路代理。

二、配置手册

根据不同场景,Docker 代理配置分为以下三种方式:

1. 仅需 docker pull 走代理

适用于个人开发环境,仅客户端操作需要代理。

# 创建客户端代理配置
mkdir -p ~/.docker
cat > ~/.docker/config.json <<EOF
{"proxies": {"default": {"httpProxy": "http://127.0.0.1:7897","httpsProxy": "http://127.0.0.1:7897","noProxy": "localhost,internal.example.com"}}
}
EOF

2. 全局代理(容器/构建均走代理)

适用于容器运行或构建过程中需要访问外部网络的场景。

# 配置守护进程代理
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7897"
Environment="HTTPS_PROXY=http://127.0.0.1:7897"
Environment="NO_PROXY=localhost,172.0.0.0/8"
EOF# 应用配置
sudo systemctl daemon-reload
sudo systemctl restart docker

3. 混合代理(企业级推荐)

适用于需要区分客户端权限和守护进程出口的企业环境。

# 客户端代理(认证场景)
echo '{"proxies": {"default": {"httpProxy": "http://user:pass@corp-proxy:8080","noProxy": "*.corp.example.com"}}
}' > ~/.docker/config.json# 守护进程代理
sudo tee /etc/systemd/system/docker.service.d/proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://gateway-proxy:3128"
Environment="NO_PROXY=.corp.example.com,10.0.0.0/8"
EOF# 应用配置
sudo systemctl daemon-reload
sudo systemctl restart docker

三、Docker 构建中的代理问题

docker build 过程中,很多人会遇到即使配置了守护进程代理,构建仍失败的问题。原因在于 构建过程涉及双重网络访问

1. 构建过程的双重网络访问

  • 阶段1:拉取基础镜像(FROM)

    • 由守护进程代理控制。
    • 配置:/etc/systemd/system/docker.service.d/proxy.conf
  • 阶段2:执行 RUN 指令

    • 由容器内部网络环境控制。
    • 需要通过 --build-arg 或环境变量传递代理。
    依赖
    依赖
    docker build
    阶段1: 拉取基础镜像
    阶段2: 执行RUN指令
    dockerd代理
    构建时环境变量

2. 为什么需要额外的 export 代理?

如果仅配置了守护进程代理,RUN 指令(如 apt-getpip)仍然会直连外部网络,导致失败。以下是常见解决方法:

方案1:显式传递代理
sudo docker build \--build-arg http_proxy=http://127.0.0.1:7897 \--build-arg https_proxy=http://127.0.0.1:7897 \-t mmcv -f docker/release/Dockerfile .
方案2:使用主机网络
sudo docker build --network=host -t mmcv -f docker/release/Dockerfile .
  • 优点:容器直接使用主机网络栈,继承主机的代理设置。
  • 适用场景:临时调试或网络环境复杂时。
方案3:环境变量 + -E
export HTTP_PROXY=http://127.0.0.1:7897
export HTTPS_PROXY=http://127.0.0.1:7897
sudo -E docker build -t mmcv -f docker/release/Dockerfile .
  • 注意-E 确保环境变量传递给 sudo 命令。

四、验证流程

确保代理配置生效,可以按以下流程验证:

仅镜像拉取
容器/构建网络
全链路代理
开始
需代理的对象
config.json
dockerd代理
同时配置两者
验证命令: docker pull nginx
验证命令: docker run alpine curl ifconfig.co
两者组合测试
  • 验证 config.json
    docker pull nginx
    
  • 验证 dockerd 代理
    docker run alpine curl ifconfig.co
    
  • 验证构建代理
    docker build --build-arg http_proxy=http://127.0.0.1:7897 -t test .
    

五、企业级最佳实践

在企业环境中,推荐以下配置组合:

  1. 客户端代理:使用 ~/.docker/config.json,配置企业 VPN 代理,控制访问权限。
  2. 守护进程代理:使用 dockerd 代理,配置网关防火墙规则,管理出口流量。
  3. 构建代理:通过 --build-arg--network=host 确保构建过程的网络访问。

示例 CI/CD 配置:

docker build \--build-arg http_proxy=${HTTP_PROXY} \--build-arg https_proxy=${HTTPS_PROXY} \--network=host \-t your-image .

黄金法则

  • 客户端代理 = 访问权限。
  • 守护进程代理 = 出口流量。
  • 构建参数 = 容器内网络。

六、常见问题解答

Q1:为什么配置了守护进程代理,构建仍失败?
A:守护进程代理只控制镜像拉取,构建中的 RUN 指令需要额外传递代理参数(如 --build-arg)。

Q2:如何避免每次手动设置代理?
A:将代理写入 ~/.docker/config.jsondockerd 配置,或在 CI/CD 中通过环境变量统一管理。

Q3:--network=host 有什么副作用?
A:可能导致容器网络与主机完全耦合,调试时使用,生产环境谨慎。


七、总结

Docker 代理配置看似复杂,但只要理解 客户端守护进程 的职责边界,就能轻松应对。记住以下要点:

  1. config.json 只管客户端到 Registry。
  2. dockerd 代理控制镜像、容器、构建的外联。
  3. 构建过程需要额外传递代理参数或使用主机网络。

希望这份指南能帮你快速掌握 Docker 代理配置!如果有更多问题,欢迎留言讨论。

相关文章:

Docker 代理配置全攻略:从入门到企业级实践

Docker 代理配置终极指南&#xff1a;从原理到实践 在企业环境中&#xff0c;Docker 的网络访问常常需要通过代理来完成&#xff0c;例如拉取镜像或在容器内访问外部网络。本文将从核心流程、配置方法到验证步骤&#xff0c;全面解析 Docker 代理的配置方式&#xff0c;助你轻…...

MyBatis-plus笔记 (上)

简介 [MyBatis-Plus]&#xff08;简称 MP&#xff09;是一个 [MyBatis]的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 mybatis-plus总结&#xff1a; 注意&#xff1a;mybatis-puls仅局限于单表操作。 自动生成单表的C…...

大模型微调数据集怎么搞?基于easydataset实现文档转换问答对json数据集!

微调的难点之一在与数据集。本文介绍一种将文档转换为问答数据集的方法&#xff0c;超级快&#xff01; 上图左侧是我的原文档&#xff0c;右侧是我基于文档生成的数据集。 原理是通过将文档片段发送给ollama本地模型&#xff0c;然后本地模型生成有关问题&#xff0c;并基于文…...

opencv 灰度实验

opencv 灰度实验 1. 最大值法2. 平均值法3. 加权均值法4(直接读取灰度图)cv2.IMREAD_GRAYSCALE5内置将原图转换为灰度图cv2.cvtColor()6 两个极端的灰度值 灰度图与彩色图最大的不同就是&#xff1a;彩色图是由R、G、B三个通道组成&#xff0c;而灰度图只有一个通道&#xff0c…...

安卓基础(无障碍)

配置无障碍服务 在 res/xml 目录下创建一个 accessibility_service_config.xml 文件&#xff0c;用于配置无障碍服务的相关信息&#xff0c;例如要监听的事件类型、反馈类型等。 <?xml version"1.0" encoding"utf-8"?> <!-- 这行代码告诉电脑…...

解决在linux下运行rust/tauri项目出现窗口有内容,但是渲染出来成纯黑问题

起因 最近折腾了一下rust/tauri程序开发&#xff0c;据说这玩意性能非常牛皮就玩了一下&#xff0c;但是我运行打包一直出现一个奇怪问题&#xff0c;窗口能正常打开&#xff0c;但是是纯黑的什么内容都没有&#xff0c;鼠标移上去又发现指针会变换&#xff08;看起来是内容又…...

高性能内存kv数据库Redis(续)

目录 四.主从同步与对象模型 1.Redis 淘汰策略 2.Redis 如何做到 持久化 2.1 redis为什么要实现持久化 2.2fork进程的写时复制机制 2.3大Key的影响 2.4redis做持久化的方式 2.5 aof 2.6 rdb 2.7 redis 持久化方式的优缺点 3.redis里面的高可用体现在哪里&#xff1f; 3.1r…...

从0到1构建企业级消息系统服务体系(一):产品架构视角下的高并发设计与动态响应能力建设

从0到1构建企业级消息系统服务体系&#xff08;一&#xff09;&#xff1a;产品架构视角下的高并发设计与动态响应能力建设 | 从今天开始将持续更新此专题下的文章&#xff0c;讲述从产品角度是如何从0-1的构建一个企业级的消息系统&#xff0c;从系统架构设计、产品架构设计&…...

ElasticSearch中常用的数据类型

一、映射 Elasticsearch中通过映射来指定字段的数据类型&#xff0c;映射方式有2种&#xff0c;静态映射和动态映射。 1.动态映射 使用动态映射时&#xff0c;无须指定字段的数据类型&#xff0c;Elasticshearch会自动根据字段内容来判断映射到哪个数据类型。 比如&#xff…...

【go】--编译

go build -o [编译完成的可执行文件] [需要编译的.go文件]#例如 go build -o myapp main.go#确保编译的结果和当前运行环境相同 #查看arch uname -a在 Linux 中查看和修改 GOOS 和 GOARCH 环境变量&#xff1a; 1. 查看当前 Go 环境变量 # 查看所有Go相关的环境变量 go env# …...

【指纹浏览器系列-chromium编译】

本文提供了一步一步的指导来帮助读者在Windows环境下成功编译Chromium浏览器。涵盖了系统需求、开发环境搭建、代码下载及构建等关键步骤。 官方编译文档&#xff1a;https://github.com/chromium/chromium/blob/main/docs/windows_build_instructions.md 一、系统要求 一台…...

Docker华为云创建私人镜像仓库

Docker华为云创建私人镜像仓库 在华为云官网的 产品 中搜索 容器镜像服务 &#xff1a; 或者在其他页面的搜索栏中搜索 容器镜像服务 &#xff1a; 进入到页面后&#xff0c;点击 创建组织 &#xff08;华为云的镜像仓库称为组织&#xff09;&#xff1a; 设置组织名字后&…...

Ubuntu 22.04安装MySQL : Qwen2.5 模型对话数据收集与微调教程

在Ubuntu 22.04安装MySQL的教程请点击下方链接进行参考: 点击这里获取MySQL安装教程 今天将为大家带来如何微调Qwen2.5模型并连接数据库进行对话的教程。快跟着小编一起试试吧~ ​ 1 大模型 Qwen2.5 微调步骤 1.1 从 github 仓库 克隆项目 克隆存储库:#拉取代码 git clo…...

关于 JDK 中的 jce.jar 的详解,以及与之功能类似的主流加解密工具的详细对比分析

以下是关于 JDK 中的 jce.jar 的详细解析&#xff0c;涵盖其作用、内容、历史背景及使用注意事项&#xff1a; 一、jce.jar 的核心作用 jce.jar 是 Java Cryptography Extension (JCE) 的核心实现库&#xff0c;提供 加密算法支持&#xff0c;包括&#xff1a; 对称加密&…...

React 更新state中的对象

更新 state 中的对象 state 中可以保存任意类型的 JavaScript 值&#xff0c;包括对象。但是&#xff0c;你不应该直接修改存放在 React state 中的对象。相反&#xff0c;当你想要更新一个对象时&#xff0c;你需要创建一个新的对象&#xff08;或者将其拷贝一份&#xff09;…...

【嵌入式八股4】C++:引用、模板、哈希表与 I/O

1. 左值引用与右值引用 左值与右值的定义 左值&#xff1a;指那些可以在表达式后取得地址的对象。换句话说&#xff0c;左值代表一个可以出现在赋值号&#xff08;&#xff09;左边的值&#xff0c;也可以被修改。例如&#xff0c;变量、数组元素、以及通过引用或指针访问的对…...

算法思想之模拟

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想之模拟 发布时间&#xff1a;2025.4.14 隶属专栏&#xff1a;算法 目录 算法介绍核心特点常见问题优化方向 例题替换所有的问号题目链接题目描述算法思路代码实现 提莫攻击题目链接题目描述算法思路代码实现…...

测试基础笔记第四天(html)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 html介绍1. 介绍2.骨架标签3.常用标签标题标签段落标签超链接标签图片标签换行和空格标签布局标签input标签&#xff08;变形金刚&#xff09;form标签列表标签 htm…...

WPF 中的元素继承层次结构 ,以下是对图中内容的详细说明:

顶层基类 DispatcherObject&#xff1a;处于继承体系最顶端&#xff0c;是一个抽象类。它为 WPF 元素提供了与 Dispatcher&#xff08;调度器&#xff09;交互的能力&#xff0c;Dispatcher 负责管理线程间的消息传递&#xff0c;确保 UI 操作在正确的线程&#xff08;通常是 …...

十九、UDP编程和IO多路复用

1、UDP编程 服务端&#xff1a; #include<stdio.h> #include <arpa/inet.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <pthread.h> #include &l…...

DeepSeek使用001:Word中配置DeepSeek AI的V3和R1模型

文章目录 Word中配置DeepSeek大模型1、勾选开发工具2、信任中心设置3、添加DeepSeek-V3模型4、获取API KEY5、添加DeepSeek-R1模型6、新建组7、测试使用 Word中配置DeepSeek大模型 1、勾选开发工具 打开【选项】 选择【自定义功能区】 2、信任中心设置 打开【信任中心】&…...

linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之三 define_trace.h头文件

在linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之二 文章中&#xff0c;我们知道trace-events-sample.h 文件在包含了tracepoint.h后第一次对TRACE_EVENT(...)等系列宏定义进行了展开,主要是构建tracepoint 调用钩子函数,注册/注销函数。展开的第二阶段…...

TDengine 与其他时序数据库对比:InfluxDB/TimescaleDB 选型指南(二)

四、应用场景分析 &#xff08;一&#xff09;TDengine 适用场景 TDengine 适用于对写入性能和存储效率要求极高的物联网设备数据采集场景。在一个拥有数百万个传感器的智能工厂中&#xff0c;每个传感器每秒都会产生多条数据&#xff0c;TDengine 能够高效地处理这些高并发的…...

华为OD机试真题——攀登者2(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 华为OD机试真题《攀登者2》&#xff1a; 目录 题目名称&#xff1a;攀登者2…...

Windows卸载重装Docker

卸载 删除C:\Program Files\Docker &#xff0c;如果更改了路径的就找到相关位置进行删除 删除 C:\Users\<用户名>\.docker 清理注册表&#xff0c;不然重装会报错 Exising installation is up to date 按下WindowR唤起命令输入界面&#xff0c;输入regedit打开注…...

JVM 为什么需要即时编译器?

JVM之所以需要即时编译器 (JIT Compiler)&#xff0c;是为了提高 Java 程序的执行性能&#xff0c;弥补纯解释器执行的不足。 我们可以从以下几个角度来分析一下这个问题&#xff1a; 1. 解释器的性能瓶颈: 逐条解释的开销: 解释器需要逐条读取 Java 字节码指令&#xff0c;并…...

双目视觉中矩阵等参数说明及矫正

以下是标定文件中各个参数的详细解释&#xff1a; 1. 图像尺寸 (imageSize) 参数值: [1280, 1024]含义: 相机的图像分辨率&#xff0c;宽度为1280像素&#xff0c;高度为1024像素。 2. 相机内参矩阵 (leftCameraMatrix / rightCameraMatrix) 结构: yaml data: [fx, 0, cx, 0,…...

Android Compose 框架的列表与集合模块之滑动删除与拖拽深入分析(四十八)

Android Compose 框架的列表与集合模块之滑动删除与拖拽深入分析 一、引言 本人掘金号&#xff0c;欢迎点击关注&#xff1a;https://juejin.cn/user/4406498335701950 1.1 Android Compose 简介 在 Android 开发领域&#xff0c;界面的交互性和用户体验至关重要。传统的 A…...

一、LLM 大语言模型初窥:起源、概念与核心原理

一、初识大模型 1.1 人工智能演进与大模型兴起:从A11.0到A12.0的变迁 AI 1.0时代&#xff08;2012-2022年&#xff09; 感知智能的突破&#xff1a;以卷积神经网络&#xff08;CNN&#xff09;为核心&#xff0c;AI在图像识别、语音处理等感知任务中超越人类水平。例如&#…...

PyTorch核心函数详解:gather与where的实战指南

PyTorch中的torch.gather和torch.where是处理张量数据的关键工具&#xff0c;前者实现基于索引的灵活数据提取&#xff0c;后者完成条件筛选与动态生成。本文通过典型应用场景和代码演示&#xff0c;深入解析两者的工作原理及使用技巧&#xff0c;帮助开发者提升数据处理的灵活…...