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 件事:
修复连接字符串
将ws://gremlin:8182
替换为ws://db:8182
确保 db 已启动并且 运行ning(depends_on
不保证)
简单的调试方法是先 运行 db
$ docker-compose -f docker-compose.yml up db
等待它准备好,然后在单独的控制台运行服务器
$ docker-compose -f docker-compose.yml up server
其他配置
如果还有其他设置连接到数据库的配置,请不要忘记将当前网络下可用的主机放在那里
- 当服务器在本地启动并在 docker 中建立数据库时,两者都可以在
localhost
下使用
- 当 docker-compose 中的两个 运行 时,主机分别为
db
和 server
)
设法解决了这个问题。事实证明,第 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 中的 EXPOSE
和 ports
在撰写中彼此不一致。
所以我有一个用 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 件事:
修复连接字符串
将
ws://gremlin:8182
替换为ws://db:8182
确保 db 已启动并且 运行ning(
depends_on
不保证)简单的调试方法是先 运行 db
$ docker-compose -f docker-compose.yml up db
等待它准备好,然后在单独的控制台运行服务器
$ docker-compose -f docker-compose.yml up server
其他配置
如果还有其他设置连接到数据库的配置,请不要忘记将当前网络下可用的主机放在那里
- 当服务器在本地启动并在 docker 中建立数据库时,两者都可以在
localhost
下使用
- 当 docker-compose 中的两个 运行 时,主机分别为
db
和server
)
- 当服务器在本地启动并在 docker 中建立数据库时,两者都可以在
设法解决了这个问题。事实证明,第 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 中的 EXPOSE
和 ports
在撰写中彼此不一致。