部署 使用 Kamal 部署 Rails7 项目,提示数据库域名无法解析

fengfans · 2023年11月05日 · 最后由 v2up 回复于 2023年11月07日 · 476 次阅读

本地 Macos 开发,本地 ubuntu22.04 部署,本地 docker 镜像封装成两个镜像,一个是 mysql 数据库,一个是 web 端,本地测试运行正常后,通过 Kamal 的 kamal setup 指令部署到 ubuntu,提示数据库域名无法解析,请问这样的运行环境,确保 docker 间正常通讯,网络配置有什么要求吗?

用 IP。

配置 docker 分配的内部 ip 还是实体机可直达的 ip,例如同网段 ip

fengfans 回复

宿主机 ip, 需要 db 容器映射端口

看错了问题 😅 没用过 kamal, 不过不用虚拟网络的话,两台 docker 互通我一般是通过宿主机地址加映射端口实现

https://ruby-china.org/topics/43396 参见下我这个帖子里的回复 本质问题是 连 docker 里的数据库问题

fengfans 回复

Host IP。kamal 没有用 docker 的虚拟子网(无法跨主机)。

手动创建一个 bridge 网络

docker network create -d bridge mynetwork

所有容器使用这个网络

container:
  env:
    secret:
      - GODADDY_API_KEY
      - GODADDY_API_SECRET
  options:
    network: mynetwork

使用 container name 去连接

POSTGRES_HOST=xxx_app-postgres

其实这也是我费解的地方 在我的想象当中 kamal 是用在多台机器上的部署

但是感觉连数据库都是直接通过公网 ip 连,而不是通过内网 ip

jicheng1014 回复

可以通过内网 ip 啊,把虚拟机放在 VPC 里。

你如果指 docker 的 service,那是 docker 自己维护的虚拟内网。如果跨主机用 docker 的网络,就等于要用 docker swarm 了。

deploy.yml 中按照下面配置 servers,database_url 就可以直接通过本地 ip 访问到了。

servers:
  web:
    hosts:
      - 8.8.8.8 # 改成你自己的ip
    options:
      add-host: host.docker.internal:host-gateway
需要 登录 后方可回复, 如果你还没有账号请 注册新账号