docker(撰写)和套接字io – 如何链接容器

我目前正在做一个项目,在那里我重做一个现有的项目,在docker集装箱中使用。 我有3个不同的容器:

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

现在我试图链接这些容器,但是我不确定是否理解了dockernetworking。 我正确地认为在一个docker-compose.yml文件中:

  • 端口:将端口暴露给主机(以及所有其他/所有链接的容器?)
  • 链接:设置启动顺序,并允许一个容器使用者相互暴露的端口,hostname = containername
  • 揭露:只暴露端口到所有链接的容器(不是主机,而不是未链接的容器)

所以我必须经常链接和揭露? 这是否总是工作在双向(socket.io消息可以发回)?

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

nodeserver: ports: -3000:3000 expose: -3001 links: -database ... database: (image mysql...) application: links: -nodeserver ... 

现在应用程序和网页是否可以作为nodeserver:3000到达socket.io服务器?

我已经尝试了一些,但没有得到充分的工作,所以我想先确定一切。 谢谢你的帮助!

如果我了解了您的部署体系结构,则application需要通过端口3001上的socket.io访问nodeserver ,因此您将与nodeserver的链接添加到应用程序,这是正确的。

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

所以你只需要改变nodeserver如下:

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

链接:

链接到另一个服务中的容器。 请指定服务名称和链接别名(SERVICE:ALIAS),或者仅指定服务名称。

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

端口:

公开港口。 既可以指定两个端口(HOST:CONTAINER),也可以指定容器端口(将select一个随机的主机端口)。

暴露:

公开端口而不将它们发布到主机 – 它们只能被链接的服务访问。 只能指定内部端口。

查看更多详细信息: https : //docs.docker.com/compose/compose-file