如何在容器之间连接 docker-compose 内的 socket.io

Tre*_*ree 2 websocket socket.io docker docker-compose

我有一个在端口 4000 上提供 http 服务的容器。它附加了套接字服务器

docker-撰写:

  dashboard-server:
    image: enginetonic:compose1.2
    container_name: dashboard-server
    command: node src/service/endpoint/dashboard/dashboard-server/dashboard-server.js
    restart: on-failure
    ports:
      - 4000:4000

  integration-test:
    image: enginetonic:compose1.2
    container_name: integration-test
testRegex "(/integration/.*|(\\.|/)(integration))\\.jsx?$$"
    tty: true
Run Code Online (Sandbox Code Playgroud)

服务器:

const http = require('http').createServer(handler)
const io = Io(http)
io.on('connection', socket => {
  logger.debug('socket connected')
})

io.use((socket, next) => {
  logger.debug('socket connection established.')
})

http.listen(4000, '127.0.0.1', () => {
    console.log(
      `Server running at http://127.0.0.1:4000/`
    )
Run Code Online (Sandbox Code Playgroud)

泊坞窗中的输出:

Server running at http://127.0.0.1:4000/

https is listening: true

现在,我尝试从另一个容器连接到该服务器,如下所示:

文件:

  const url = `ws://dashboard-server:4000`

      const ioc = IoC.connect(url)

      ioc.on('error', error => {
        console.log(error.message)
      })
      ioc.on('connect', res => {
        console.log('connect')
      })
      ioc.on('connect_error', (error) => {
        console.log(error.message)
      })
Run Code Online (Sandbox Code Playgroud)

输出:

xhr poll error

当我在终端本地运行两者时,我得到正确的响应

{"message":"socket connection established","level":"debug"}

为什么套接字不在容器内部建立连接,而是在本地建立连接?我究竟做错了什么?

编辑:仅显示部分文件以方便阅读。套接字在本地计算机上正常连接,并在单独的终端中生成两个文件

Dan*_*ell 7

您需要链接 docker 容器并按名称引用它们,而不是127.0.0.1. https://docs.docker.com/compose/networking提供了更多文档。您还需要侦听“0.0.0.0”,以便接受 Docker 网络上的连接。

我在您的撰写文件中只看到一个容器。如果您尝试从外部docker连接到 docker 容器,则必须公开一个端口。同一个参考文献向您展示了如何操作。

http.listen(4000, '127.0.0.1', () => {
Run Code Online (Sandbox Code Playgroud)

应该成为

http.listen(4000, '0.0.0.0', () => {
Run Code Online (Sandbox Code Playgroud)

这样服务器就会监听所有地址,包括 docker 在 docker 网络上自动分配的地址。

然后客户端必须通过 docker compose 中给出的名称引用服务器,所以

const url = `ws://127.0.0.1:4000`
Run Code Online (Sandbox Code Playgroud)

变成

const url = `ws://dashboard-server:4000`
Run Code Online (Sandbox Code Playgroud)