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

时间:2018-10-19 15:17:39

标签: docker websocket socket.io docker-compose

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

docker-compose:

  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

服务器:

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/`
    )

在docker中的输出:

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)
      })

输出:

xhr poll error

当我在终端中本地运行这两个程序时,都会得到正确的响应

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

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

编辑:出于可读性考虑,仅显示部分文件。套接字正常连接本地计算机,并在单独的终端中生成两个文件

1 个答案:

答案 0 :(得分:1)

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

我在撰写文件中仅看到一个容器。如果您尝试从 outside docker连接到docker容器,则必须公开一个端口。相同的参考资料向您展示了如何。

http.listen(4000, '127.0.0.1', () => {

应成为

http.listen(4000, '0.0.0.0', () => {

以便服务器正在侦听所有地址,包括docker在docker网络上自动分配的地址。

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

const url = `ws://127.0.0.1:4000`

成为

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