yyhhyy's blog

yyhhyy

Doker-compose 网络互通

69
2024-05-02

Doker-compose 网络互通

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

踩坑1:

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

具体配置如下:

image-hcsw.png

踩坑2:

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

查看1Panel-容器-网络

image-saxg.png

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

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

image-fwhp.png

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

image-yras.png

可以看到,其网段都在 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进行编写都不行

最后学习了一套写法,仅供参考

    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  # 添加networds设置,请one-api容器ip放到1panel-network网段下,也就是与这些上述两个服务ip在同一网段下

networks:
  1panel-network:
    external: true  # 最后通过external: true指明

解释:

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

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

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

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

至此,问题解决

不同容器通信技巧:

情形一:

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

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

情形二:

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

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