前情提要: 主要是记录实践的感慨和分享一下微小的经验,在我看来一些细微的细节就能折腾我们小白心力憔悴,以在下小白视角描述,没有系统学习过,纯靠 ai 和浏览器自己摸索,还搞崩溃了好几次容器网络,如有错误请大佬积极点出,以下使用均在 1panel 进行(毕竟小白嘛,命令行还是有点不懂),docker compose 不怎么会就不说了
1panel 还是很好用的,尤其是对我这种小白来说,这里不讲解相关 1panel 配置,我是看下面这个帖子学习的 [超详细教学] 教你从零开始,入坑域名、云服务器并部署 New API + Open WebUI! - 文档共建 - LINUX DO,安装的话看官方文档: 在线安装 - 1Panel 文档
为什么会有网络问题
好吧这个我也不懂,按照我的想法 docker 属于一个 “完全” 隔离的环境,类比虚拟机,所以说当你想在容器使用 localhost/127.0.0.1 地址访问本地(宿主机)的时候,其实是在访问容器本身
容器访问容器
同一网络下
我尽量用图说明
有简单两种方法可以判断是否处于同一网络
- 观察容器分配的 ip 地址前面是否一致,例如
172.17.0.2和172.17.0.3就处于同一网络,它们的前面都是172.17.0.
下面图中框在一起的属于同一个网络
可以通过命令查看容器网络 ip, 命令多种多样,可以自行搜索或者 ai
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器ID或名称>
- 点击容器更多,编辑,查看网络,选择的名称一样的也属于同一个网络
- 还有更多方法,就不一一列举了,欢迎大佬补充
知道处于同一个网络就简单了,比如我上图的 gpt-load,在 new-api 访问 http://172.17.0.2:3001/proxy/xxx 就可以了,示例:http://+172.x.0.x:+端口
需要注意的是 端口需要是访问容器服务的原始端口,而不是映射在宿主机的端口,即
这样就可以避免自己攻击自己了【KYX 公益站】| 11/15 3:00 out 流量配额上限了 11 月截止用了 9k+ GiB 站点暂时无法使用 等待回归 - 福利羊毛 / 福利羊毛,Lv1 - LINUX DO
这时候有人问了,同一个网络下 8000 端口被多个容器占用了怎么办,大多数容器应该是可以通过环境变量更改在容器内的运行端口的,如果你没办法,或者懒的改,则可以通过容器访问宿主机的方法实现
不同网络下
- 能够修改网络
那就直接修改为一样的就行了,但是我个人认为在服务器上不够灵活,改完按照上面教程来就行
通过 1panel 修改比较方便,docker 命令也可以,但是我没用过,可以自行搜索
- 不能够修改容器网络,似乎有几种方法,我这里只说我成功了的一种方法,刚刚成功,个人比较喜欢,就是同等下要说的通过容器访问宿主机端口
容器访问宿主机
该方式个人认为比较灵活,可以用于不同网络下的容器,相同网络但是容器端口重复占用,容器访问宿主机
需要注意: 该方法需要端口以 0.0.0.0 开放,而不是仅以 127.0.0.1/localhost 开放
- 使用 host.docker.internal
这个我不会用,只是知道有这个,AI 特别热衷推荐,只是放在这站位
2.通过 docker 网络的网关
网关可以在 1panel 界面简单找到,如果不用 1panel,需要通过命令查询(命令多种多样,可以自行搜索或者 ai)
参考:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}' <容器ID或名称>
- 在 1panel 上的话,可以通过容器界面的 ip 地址,把最后一位改成 1 就行,例如
172.20.0.1
- 点击查看容器网络
找到之后,就可以把它当作本地地址使用,例如你想访问宿主机(本地)的 8000 端口,正常是使用 http://127.0.0.1:8000,但是在容器你需要修改 127.0.0.1 为这个容器的网关,例如 http://172.20.0.1:8000
访问容器的话,改到对应容器映射到宿主机的端口就可以了,和之前是容器端口是相反的,而使用的网关需要注意是在哪个容器里面就使用哪个容器的网关,而不是你需要访问容器的那个网关
注意:
配置防火墙放行,端口填写需要访问的宿主机端口,ip 填写容器自身网络 ip
这是我这一篇帖子到现在才发出来和想发出来的主要原因!
一直在容器里使用代理池超时,访问不了,搞不明白,到今天才知道 ufw 居然会拦截容器的请求!我一直以为都在本地,不可能拦截,结果。。。有懂的佬可以说明一下为什么,我猜可能是容器也有可能闭源不安全?
当然,你也可以命令行设置:
sudo ufw allow from 172.x.0.x to any port 端口
好了,快去尝试吧!
一时兴奋,写了好久,有任何错误或者疑问欢迎各位大佬指出!