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 说明:以折线的上升或下降来表示统计数量的增减变化的统计图 特点&…

使用Docker快速搭建一套三主三从Redis集群用于开发、测试

文章目录 一 基本概念二 部署流程2.1 准备配置文件2.2 启动6个 Docker 容器2.3 集群搭建 三 总结四 参考资料 一 基本概念 Redis集群是一种通过将多个Redis节点连接在一起以实现高可用性、数据分片和负载均衡的技术。它允许Redis在不同节点上同时提供服务,提高整体…

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

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

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

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

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

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

linux面试题 Java工程师、C++工程师、iOS工程师、安卓工程师、运维工程师、PHP工程师、安全工程师、2020、golang工程师等面试可用

下列有关const限定符说法错误的是: A. 可以将一个非const对象的地址赋给一个指向const对象的指针B. 可以将一个非const对象的地址赋给一个指向非const对象的指针C. 一个const对象不可以被多次赋值D. 通过const对象指针可以改变全局const对象内容 正确答案&#xff1…

华为OD机试-内存冷热标记(JavaPythonJs)100%通过率

题意 现代计算机系统中通常存在多级的存储设备,针对海量workload的优化的一种思路是将热点内存页优先放到快速存储层级,这就需要对内存页进行冷热标记。 一种典型的方案是基于内存页的访问频次进行标记,如果统计窗口内访问次数大于等于设定闽值,则认为是热内存页,否则是冷…

第18节:Vue3 数组和集合的注意事项

在UniApp中使用Vue3框架时,处理数组和集合需要注意以下几点: 数组和集合的初始化:在Vue3中,可以使用ref()函数来创建一个响应式引用对象,然后使用该引用来初始化数组或集合。例如: import { ref } from vu…

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

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

MySQL:JSON语法说明

一、SELECT JSON_OVERLAPS([5261,5265], [5265,5278,1000]) -- 0不存在 1存在(比较两个数组是否有匹配) 二、SELECT JSON_CONTAINS([1,2,3,4,5,6,7], CAST(4 AS CHAR)) -- key是字符串类型(比较字符串是否在数组中存在) 三、JSON_EXTRACT(eas.question_…

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

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

Golang 链表的创建和读取 小记

文章目录 链表的相关知识链表的创建:模拟方式建立链表的**递归创建** 链表的读取遍历读取递归读取 完整代码 链表的相关知识 链表有时会具有头节点,头节点的指针指向第一个节点的地址,其本身的数据域可以根据自己的选择进行赋值   接下来我将以将int转…

【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、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…