Docker(撰写)和socket io - 如何链接容器

时间:2017-03-21 15:20:52

标签: node.js docker socket.io docker-compose

我目前正在开展一个项目,我重新制作了一个在docker容器中使用的现有项目。 我有3个不同的容器:

  • 在端口3001上打开socket.io连接并在端口3000上提供网页(也连接到该socket.io服务器)的nodejs服务器
  • nodejs后端所需的MySQL数据库
  • 通过socket.io将数据发送到服务器的小型应用程序

现在我正在尝试链接这些容器,但我不确定我是否理解了docker网络。我是否正确地假设在docker-compose.yml文件中:

  • ports:将端口暴露给主机(以及所有其他/所有链接的容器?)
  • links:设置开始顺序,并允许一个容器使用其他公开的端口,hostname = containername
  • 公开:仅将端口暴露给所有链接的容器(不是主机,而不是未链接的容器)

所以我必须始终链接并公开?这总是在两个方向都有效(socket.io消息也可以发回)?

所以这样的事情是正确的(版本3格式):

nodeserver:
    ports:
        -3000:3000
    expose: 
        -3001
    links:
        -database
    ...

database:
    (image mysql...)

application:
    links:
        -nodeserver
     ...

应用程序和网页现在都可以作为nodeserver:3000?

到达socket.io服务器

我已经尝试过其中的一些但是还没有完全发挥作用所以我想确保先了解一切。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

如果我了解您的部署体系结构,application需要通过端口3001上的socket.io访问nodeserver,那么您将带有nodeserver的链接添加到应用程序,它&# 39;是的。

但是nodeserver提供的网页也连接到端口3001上的socket.io,因此浏览器无法连接端口3001上的nodeserver。

所以您只需要更改nodeserver,如下所示:

nodeserver:
ports:
    - "3000:3000"
    - "3001:3001"
links:
    -database
...

链接:

  

链接到其他服务中的容器。指定服务名称和链接别名(SERVICE:ALIAS),或仅指定服务名称。

     

链接服务的容器可以在与别名相同的主机名上访问,如果没有指定别名,则可以访问服务名称。

端口:

  

暴露端口。指定两个端口(HOST:CONTAINER),或仅指定容器端口(将选择随机主机端口)。

暴露:

  

暴露端口而不将它们发布到主机 - 它们只能被链接服务访问。只能指定内部端口。

查看更多详情:https://docs.docker.com/compose/compose-file