Avatar

Doker-compose 网络互通

May 2, 2024 · comments

这两天由于购入halo pro,关注到飞致云旗下还有个1Panel,因此打算将服务也全部迁到1Panel,刚好有个可视化面板。

踩坑1:

1Panel默认开启了WAF(哪怕没有购入1Panel专业版也开启),会导致halo有一系列不正常现象。因此,第一件事情,需要将WAF关闭。

具体配置如下:

waf

踩坑2:

接下来就是迁移服务咯,迁移one-api的时候出现了个问题,就是容器之间网络不互通。

查看1Panel-容器-网络

docker

可以看到1panel的docker网络信息,采用的是bridge的形式。

因为one-api需要使用到mysql、redis,因此,先提前在1panel-数据库下进行相关数据库安装:

network

安装完成后查看下这两个数据库容器的信息:

docker-network

可以看到,其网段都在 192.168.96.0/20 这个网段下,并且其映射的地址为 127.0.0.1,也就是只能在这个网段下进行访问,其他网段是不可以进行访问的

开始编写 compose,只写需要网络信息的地方

environment:
  - SQL_DSN=aaa:123@tcp(db:3306)/one-api
  - REDIS_CONN_STRING=redis://redis:6379
  - SESSION_SECRET=yyhhyy
  - TZ=Asia/Shanghai

可以看到,上面的连接都是用指代的 db redis 用来指代服务器的ip地址。

我先后尝试用 localhost 以及他们分别对应的 容器ip进行编写都不行

最后学习了一套写法,仅供参考(以下为完整、可解析的 compose 片段):

services:
  one-api:
    environment:
      - SQL_DSN=aaa:123@tcp(1Panel-mysql-X3XP:3306)/one-api # 将 db 修改成 mysql 容器名称
      - REDIS_CONN_STRING=redis://1Panel-redis-QTio:6379 # 将 redis 修改成 redis 容器名称
      - SESSION_SECRET=yyhhyy
      - TZ=Asia/Shanghai
    networks:
      - 1panel-network # 将 one-api 放入与数据库相同的网络
networks:
  1panel-network:
    external: true # 使用已存在的网络

解释:

  1. 网络配置one-api服务现在使用 1panel-network网络,这个网络需要是一个已经存在的网络,通过 external: true指明。

  2. 环境变量中的连接字符串

    • SQL_DSN现在使用 1Panel-mysql-X3XP这个服务名称进行连接。
    • REDIS_CONN_STRING同样使用 1Panel-redis-QTio作为服务名称。

    也就是分别使用同一网段下的容器名填写即可。

至此,问题解决

不同容器通信技巧:

情形一:

两个容器 都在 同一个docker网络组中

如果两个容器都在同一个docker网络组中,直接在需要网络通信的地方,使用 <容器名>:<容器端口>

情形二:

两个容器 不在 同一个docker网络组中

那么使用 <容器使用的网络模式的网关>:<宿主机端口(也就是映射端口)> 即可

Comments
CC BY-NC-SA 4.0 2020-PRESENT © yyhhyyyyyy