二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancker
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
推广
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • 网站状态 (opens new window)
    • json2go (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancker
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
推广
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • 网站状态 (opens new window)
    • json2go (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • 最佳实践

  • 迎刃而解

  • Nginx

  • Php

  • Zabbix

  • Prometheus

  • Grafana

  • CentOS

  • Supervisord

  • Systemd

  • Docker

    • docker的几种安装方式
    • docker配置加速器的几种方案
    • docker搭建官方版私有仓库(了解)
    • Docker笔记之企业级仓库harbor搭建
    • 认识了解Dockerfile
    • 利用Dockerfile创建一些基础镜像
    • Docker笔记之与镜像相关的命令整理
    • 从docker容器时间问题探究到Namespace问题
    • Docker笔记之制作kafka镜像
    • Docker笔记之制作lnmp镜像
    • Docker笔记之使用apline镜像
    • Docker笔记之修改默认数据存储目录
    • Docker笔记之修改默认网段
    • docker磁盘或者镜像清理相关内容
    • centos镜像添加chrome浏览器以及中文字体
    • 利用buildx构建支持多CPU架构平台的docker镜像
    • docker exec命令中含有通配符执行失败的问题
    • Docker 调试构建失败的 Dockerfile 的方法
    • Docker容器如何优雅地访问宿主机网络
      • 前言
      • 方案
        • 方案一
        • 方案二
  • Docker-Compose

  • Rancher

  • Ansible

  • OpenLdap

  • GitLab

  • GitHub

  • Etcd

  • Consul

  • RabbitMQ

  • Kafka

  • Mysql

  • MongoDB

  • OpenVPN

  • Kvm

  • VMware

  • 配置文件详解

  • Other

  • 运维观止
  • Docker
二丫讲梵
2023-03-07
目录

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
1
2
3

其中的 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
1
2
3

这样容器就能直接访问到宿主机的 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

1
2
3
4
5

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

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

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

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

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

version: '3.9'
services:
  chatgpt:
    image: dockerproxy.com/eryajf/chatgpt-dingtalk:latest
    container_name: chatgpt
    environment:
      - APIKEY=换成你的key
      - MODEL="gpt-3.5-turbo-0301"
      - SESSION_TIMEOUT=600
      - HTTP_PROXY=http://host.docker.internal:15777
      - DEFAULT_MODE="单聊"
    ports:
      - "8090:8090"
    restart: always
    extra_hosts:
      - host.docker.internal:host-gateway
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
微信 支付宝
上次更新: 2023/03/08, 11:05:08

← Docker 调试构建失败的 Dockerfile 的方法 博客已发布过的docker-compose拉起项目文件汇集→

最近更新
01
go-cache包的使用简析
03-19
02
学习周刊-总第98期-2023年第11周
03-17
03
使用retry-go给项目添加重试机制
03-15
更多文章>
Theme by Vdoing | Copyright © 2017-2023 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式