Docker容器如何优雅地访问宿主机网络

# 前言

某些时候,我们会有在容器内容访问宿主机某个服务的需求,比如现在 openai 无法直接访问,需要给项目添加代理,我的 chatgpt-dingtalk (opens new window) 项目支持了通过环境变量指定代理地址。

添加方式如下:

# 运行项目$ docker run -itd --name chatgpt -p 8090:8090 -e APIKEY=换成你的key -e MODEL="gpt-3.5-turbo" -e SESSION_TIMEOUT=600 -e HTTP_PROXY="" -e DEFAULT_MODE="单聊" --restart=always dockerproxy.com/eryajf/chatgpt-dingtalk:latest

复制

其中的 HTTP_PROXY 就是对应的代理服务。

# 方案

要解决这个问题,并且让如上命令能通用在 Linux,Mac,Windows 系统都通用,因此网上一些通过命令获取到宿主机 IP 的方案就不满足需求了,要实现这个需求,需要一点点骚操作才行。

# 方案一

使用 host 模式启动服务。

默认情况下,docker 使用的是桥接模式启动服务,即 Docker 容器将使用 Docker 自己创建的虚拟网络,Docker 容器之间可以相互通信,但是它们无法直接访问宿主机上的网络服务。Docker 容器需要通过端口映射来暴露自己的服务,以便宿主机或其他网络主机访问。

而使用 host 模式启动,Docker 容器与宿主机共享同一个网络命名空间,即 Docker 容器将直接使用宿主机的网络。这意味着 Docker 容器可以使用宿主机的 IP 地址和端口,可以直接访问宿主机上的网络服务。然而,host 模式也存在一些限制,例如 Docker 容器之间无法直接通信,Docker 容器的网络性能可能会受到影响。

所以此时启动命令可以改成下边这样:

# 运行项目$ docker run -itd --name chatgpt  --network host -e APIKEY=换成你的key -e MODEL="gpt-3.5-turbo" -e SESSION_TIMEOUT=600 -e HTTP_PROXY="http://127.0.0.1:1080" -e DEFAULT_MODE="单聊" --restart=always dockerproxy.com/eryajf/chatgpt-dingtalk:latest

复制

这样容器就能直接访问到宿主机的 1080 了。

但是因为这种模式的局限性,因此实际生产当中几乎没有人会用这种方式,所以不推荐使用方案一,推荐方案二。

# 方案二

docker 官方提供了一种支持方案,可通过指向 host.docker.internal 来指向宿主机的 IP。参见文档:从容器连接到主机上的服务 (opens new window)

但注意,这个方案存在一个问题,那就是只支持 Mac 与 Windows 中 desktop 这种环境,并不支持在 Linux 中使用,所以不能直接使用。

于是,有人在官方提交了这个 issue:Support host.docker.internal DNS name to host (opens new window)。

在其中的一个回答里,找到了一种可行方案:

按照如上说明,可以使用如下命令进行启动:

# 运行项目$ docker run -itd --name chatgpt -p 8090:8090 --add-host="host.docker.internal:host-gateway" -e APIKEY=换成你的key -e MODEL="gpt-3.5-turbo" -e SESSION_TIMEOUT=600 -e HTTP_PROXY="http://host.docker.internal:15732" -e DEFAULT_MODE="单聊" --restart=always dockerproxy.com/eryajf/chatgpt-dingtalk:latest

复制

于是我在自己的 Mac 以及 Linux 都使用这种方案做了测试,发现是可以的。

需要注意的是,这个功能在 docker 版本过低的时候,可能支持的有问题,所以你的 docker 版本最好不低于 20。

如果使用的是docker-compose,则通过添加如下内容进行配置:

extra_hosts:- 'host.docker.internal:host-gateway'

复制

比如上边的项目改成docker-compose部署,就变成下边这样:

version: '3.9'
services:chatgpt:image: dockerproxy.com/eryajf/chatgpt-dingtalk:latestcontainer_name: chatgptenvironment:- APIKEY=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- MODEL="gpt-3.5-turbo-0301"- SESSION_TIMEOUT=600- HTTP_PROXY=http://host.docker.internal:15777- DEFAULT_MODE="单聊"ports:- "8090:8090"restart: alwaysextra_hosts:- host.docker.internal:host-gateway

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式奇妙之旅:Python与树莓派编程深度探索

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 在这个数字化的时代,嵌入式系统的应…

主动学习与弱监督学习

人工智能数据的获取没有想象中的那么简单,虽然我们早已身处大数据的浪潮下,很多公司在获取数据的大浪中翻滚却始终没有找到一个合适的获取数据的渠道。很多情况下,获取高质量的人工智能数据需要消耗大量的人力、时间、金钱,但是对…

Vue3-08-条件渲染-v-if 的基本使用

v-if 是什么 v-if 一个指令, 它是用来根据条件表达式,进行选择性地【展示】/【不展示】html元素的。比如 : 有一个按钮A,当条件为真时,展示该按钮;条件为假时,不展示该按钮。与 js 中的 条件判…

绝地求生:PGC2023胜者组D2下半场:17天霸成功晋级,TL、NH跌入最后机会组

第四场 第一名:LGC 第二名:T5 第三名:FaZe 17仅剩两人,T5踩住高点,sujiu前顶时被T5架枪位击倒,小鬼的盾牌没能挡住对方的雷遗憾第五出局。然而T5自己也进圈不易,仅剩两人。 LG独狼卡住T5却忽…

Leetcode 2132. 用邮票贴满网格图(Java + 两次一维前缀和 + 二维差分)

Leetcode 2132. 用邮票贴满网格图(Java 两次一维前缀和 二维差分) 题目 给你一个 m x n 的二进制矩阵 grid ,每个格子要么为 0 (空)要么为 1 (被占据)。给你邮票的尺寸为 stampHeight x sta…

Linux_Ubuntu 系统入门

Ubuntu 系统是和 Windows 系统一样的大型桌面操作系统,因此功能非常强大。 本节的目的是掌握后续嵌入式开发所需的 Ubuntu 基本技能,比如系统的基本设置、常用的 shell 命令、vim 编译器的基本操作等等…… Ubuntu 的图形化界面操作和 Windows 下基本一致…

数据分析基础之《matplotlib(3)—散点图》

一、常见图形种类及意义 1、matplotlib能够绘制折线图、散点图、柱状图、直方图、饼图。我们需要知道不同的统计图的意义,以此来决定选择哪种统计图来呈现我们的数据 2、折线图plot 说明:以折线的上升或下降来表示统计数量的增减变化的统计图 特点&…

智能优化算法应用:基于白鲸算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于白鲸算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于白鲸算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.白鲸算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

实践干货 | CodeWave如何支持多人协作开发应用

在传统软件开发领域里,要完成具备一定复杂程度的软件,通常都会由一个研发团队协作开发。软件复杂度越大,研发团队的规模也就越大。 为了让研发团队能够高效的进行协同开发,业务引入了优秀的代码版本管理工具,比如传统软…

C语言union联合体(共用体)

一、定义 联合体(共用体)是一种特殊的自定义的数据类型,它包含一系列的成员变量,这些成员变量共用一块内存空间。 语法: union 标识符 { data_type 标识符1; data_type 标识符2; . . . dat…

【数组Array】力扣-5 最长回文子串

目录 题目描述 题解labuladong 题目描述 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s "babad" 输出:"bab"…

在javaweb项目中resource目录和webapp目录的区别

resource存放的是一些配置文件,这些文件一般都是与java代码相关的配置文件,比如这里的jdbc配置文件,在java中可以使用这个目录下的文件,不用写全路径 webapp存放的是web的资源文件,如jsp,html,css,js文件,在网页请求会…

【NSX-T】5. 搭建NSX-T环境 —— NSX架构基础配置

目录 5. 准备 NSX 基础架构5.1 准备工作5.2 创建传输域(1)创建 Overlay 传输域(2)创建 VLAN 传输域 5.3 创建 IP 池5.4 准备 ESXi 主机 参考资料 5. 准备 NSX 基础架构 5.1 准备工作 vCenter 中已存在 DVS。 为 NSX-T 创建两个 …

计算机毕业设计 基于Web的城市旅游网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

ARM I2C通信

1.概念 I2C总线是PHLIPS公司在八十年代初推出的一种串行的半双工同步总线,主要用于连接整体电路2.IIC总线硬件连接 1.IIC总线支持多主机多从机,但是在实际开发过程中,大多数采用单主机多从机模式 2.挂接到IIC总线上,每个从机设备都…

现代雷达车载应用——第2章 汽车雷达系统原理 2.4节 雷达波形和信号处理

经典著作,值得一读,英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.4 雷达波形和信号处理 对于连续波雷达来说,波形决定了其基本信号处理流程以及一些关键功能。本节将以FMCW波形为例,讨论信号…

EasyRecovery2024苹果电脑mac破解版安装包下载

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序,它不会往源驱上写任何东西,也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件,其支持的媒体介质包括:硬盘驱动器、光驱、…

VS Code串口监视插件Serial Monitor

文章目录 初步使用参数设置VS Code插件 初步使用 Serial Monitor,即串行监视器,提供串口和TCP协议的通信监控功能。在插件栏搜索安装之后,按下Ctrl打开终端,终端界面会多出一个串行监视器选项卡,进入之后,…

golang反射(reflect)虽爽,但很贵

标准库 reflect 为 Go 语言提供了运行时动态获取对象的类型和值以及动态创建对象的能力。反射可以帮助抽象和简化代码,提高开发效率。 但是使用反射势必会多出大量的操作指令,导致性能下降 案例 字段赋值方式对比 type Student struct {Name string…

如何使用 Redis 快速实现分布式锁?

本文我们来讨论如何使用 Redis 快速实现分布式锁。 分布式锁有很多种解决方案,前面简单介绍过,Redis 可以通过 set key 方式来实现分布式锁,但实际情况要更加复杂,比如如何确保临界资源的串行执行,如何及时释放&#…