Go 应用无法通过 docker-compose 内的 websocket 连接

Go app cannot connect over websocket inside docker-compose

所以我有一个用 Go 编写的非常简单的应用程序,它需要通过 websocket 连接到数据库。当我 运行 容器内的数据库并通过 docker run -d -p 8182:8182 tinkerpop/gremlin-server 公开所需的端口时,这工作正常,应用程序在本地指向 localhost:8182。

但是我现在想通过 compose for CI 运行 两个容器内部,我的应用找不到数据库。我试过使用 docker 主机名、IP 地址,并在 0.0.0.0 上收听无济于事。目前我的撰写看起来像这样:

version: '3'

services:
  db:
    image: tinkerpop/gremlin-server
    hostname: gremlin
    ports:
      - 8182:8182
  server:
    build: .
    environment:
      ORBITAL_DB_ADDRESS: "ws://gremlin:8182"
    ports:
    - 5000:5000
    depends_on:
      - db

但是我似乎只从我的应用程序容器中收到以下消息:dial tcp: lookup gremlin on 127.0.0.11:53: no such host

尽管我的应用在 0.0.0.0 上设置为 ListenAndServe:

err := http.ListenAndServe(fmt.Sprintf("0.0.0.0:%d", conf.Service.Port), nil)

如有任何帮助,我们将不胜感激。谢谢。

从你原来的 post 想到要尝试的 3 件事:

  1. 修复连接字符串

    ws://gremlin:8182替换为ws://db:8182

  2. 确保 db 已启动并且 运行ning(depends_on 不保证)

    简单的调试方法是先 运行 db

    $ docker-compose -f docker-compose.yml up db
    

    等待它准备好,然后在单独的控制台运行服务器

    $ docker-compose -f docker-compose.yml up server
    
  3. 其他配置

    如果还有其他设置连接到数据库的配置,请不要忘记将当前网络下可用的主机放在那里

    • 当服务器在本地启动并在 docker 中建立数据库时,两者都可以在 localhost
    • 下使用
    • 当 docker-compose 中的两个 运行 时,主机分别为 dbserver

设法解决了这个问题。事实证明,第 3 方容器的 Dockerfile 已设置为 EXPOSE 8182,并且我另外将 host:container 端口映射到 compose with:

ports:
  - 8182:8182

由于某种原因,这导致在尝试到达 ws://db:8182 时超时,当我删除 compose 中的端口映射时,它自行解决并变得可用。

我的最终 docker-compose.yml 看起来像:

version: '3'

services:
  db:
    image: tinkerpop/gremlin-server
  server:
    build: app
    environment:
      ORBITAL_DB_ADDRESS: ws://db:8182
    ports:
    - 5000:5000

我无法解释为什么会发生这种情况,但如果有人能更详细地解释这里发生的事情,我会很感兴趣,因为 dockerfile 中的 EXPOSEports 在撰写中彼此不一致。