前情提要: 主要是记录实践的感慨和分享一下微小的经验,在我看来一些细微的细节就能折腾我们小白心力憔悴,以在下小白视角描述,没有系统学习过,纯靠 ai 和浏览器自己摸索,还搞崩溃了好几次容器网络,如有错误请大佬积极点出,以下使用均在 1panel 进行(毕竟小白嘛,命令行还是有点不懂),docker compose 不怎么会就不说了

1panel 还是很好用的,尤其是对我这种小白来说,这里不讲解相关 1panel 配置,我是看下面这个帖子学习的 [超详细教学] 教你从零开始,入坑域名、云服务器并部署 New API + Open WebUI! - 文档共建 - LINUX DO,安装的话看官方文档: 在线安装 - 1Panel 文档

为什么会有网络问题

好吧这个我也不懂,按照我的想法 docker 属于一个 “完全” 隔离的环境,类比虚拟机,所以说当你想在容器使用 localhost/127.0.0.1 地址访问本地(宿主机)的时候,其实是在访问容器本身


Image


容器访问容器

同一网络下

我尽量用图说明
有简单两种方法可以判断是否处于同一网络

  1. 观察容器分配的 ip 地址前面是否一致,例如172.17.0.2172.17.0.3就处于同一网络,它们的前面都是 172.17.0.
    下面图中框在一起的属于同一个网络

Image


可以通过命令查看容器网络 ip, 命令多种多样,可以自行搜索或者 ai

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器ID或名称>
  1. 点击容器更多,编辑,查看网络,选择的名称一样的也属于同一个网络

Image


Image


  1. 还有更多方法,就不一一列举了,欢迎大佬补充
    知道处于同一个网络就简单了,比如我上图的 gpt-load,在 new-api 访问 http://172.17.0.2:3001/proxy/xxx 就可以了,示例:http://+172.x.0.x: + 端口
    需要注意的是 端口需要是访问容器服务的原始端口,而不是映射在宿主机的端口,即

Image


这样就可以避免自己攻击自己了【KYX 公益站】| 11/15 3:00 out 流量配额上限了 11 月截止用了 9k+ GiB 站点暂时无法使用 等待回归 - 福利羊毛 / 福利羊毛,Lv1 - LINUX DO


Image


这时候有人问了,同一个网络下 8000 端口被多个容器占用了怎么办,大多数容器应该是可以通过环境变量更改在容器内的运行端口的,如果你没办法,或者懒的改,则可以通过容器访问宿主机的方法实现

不同网络下

  1. 能够修改网络
    那就直接修改为一样的就行了,但是我个人认为在服务器上不够灵活,改完按照上面教程来就行

Image


通过 1panel 修改比较方便,docker 命令也可以,但是我没用过,可以自行搜索

  1. 不能够修改容器网络,似乎有几种方法,我这里只说我成功了的一种方法,刚刚成功,个人比较喜欢,就是同等下要说的通过容器访问宿主机端口

容器访问宿主机

该方式个人认为比较灵活,可以用于不同网络下的容器,相同网络但是容器端口重复占用,容器访问宿主机

需要注意: 该方法需要端口以 0.0.0.0 开放,而不是仅以 127.0.0.1/localhost 开放


Image


  1. 使用 host.docker.internal
    这个我不会用,只是知道有这个,AI 特别热衷推荐,只是放在这站位

2.通过 docker 网络的网关
网关可以在 1panel 界面简单找到,如果不用 1panel,需要通过命令查询(命令多种多样,可以自行搜索或者 ai)
参考:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}' <容器ID或名称>

Image



Image


找到之后,就可以把它当作本地地址使用,例如你想访问宿主机(本地)的 8000 端口,正常是使用 http://127.0.0.1:8000,但是在容器你需要修改 127.0.0.1 为这个容器的网关,例如 http://172.20.0.1:8000

访问容器的话,改到对应容器映射到宿主机的端口就可以了,和之前是容器端口是相反的,而使用的网关需要注意是在哪个容器里面就使用哪个容器的网关,而不是你需要访问容器的那个网关

注意:

配置防火墙放行,端口填写需要访问的宿主机端口,ip 填写容器自身网络 ip

这是我这一篇帖子到现在才发出来和想发出来的主要原因!
一直在容器里使用代理池超时,访问不了,搞不明白,到今天才知道 ufw 居然会拦截容器的请求!我一直以为都在本地,不可能拦截,结果。。。有懂的佬可以说明一下为什么,我猜可能是容器也有可能闭源不安全?


Image


Image


当然,你也可以命令行设置:

sudo ufw allow from 172.x.0.x to any port 端口

Image


好了,快去尝试吧!
一时兴奋,写了好久,有任何错误或者疑问欢迎各位大佬指出!