Docker容器-仅内部的TCP端口可在同一容器内的2个组件之间进行通信

时间:2019-03-10 16:56:05

标签: docker containers

我试图查找是否有任何陷阱,需要在容器内暴露端口(tcp),然后在同一容器内将另一个进程消耗(读取/写入)到同一端口。我是否需要撰写/公开/发布此端口? 因此,基本上,是否有任何特定的事情需要做/知道要在容器中公开端口以供内部使用(同一个容器使用)?

2 个答案:

答案 0 :(得分:0)

在这种情况下,无需执行任何特定操作。您可以忽略任何Docker物件(公开或发布端口)。

只有该容器中的第二个进程连接到localhost:<port of opened by the first process>

答案 1 :(得分:0)

正确维护两个进程的生命周期非常棘手。如果一个进程死了,您希望某事注意到并杀死另一个进程或重新启动另一个进程,并且您可能想知道这种情况正在发生。 docker logs可能不会自动合并这两个进程的输出(并且取决于您启动它们的方式,可能不会捕获两者)。如果一个进程比另一个进程需要更多的计算能力,那么就不能在不扩展另一个进程的情况下扩展一个进程。如果您在一个过程中更新软件,则无法在不重新启动另一个过程的情况下重新启动它。

简而言之:通常不建议这样做,这是最佳做法;通常最好在两个单独的容器中运行这些过程。

如果这样做,仅在这种情况下 ,同一容器中的两个进程将彼此视为localhost,并且可以将其作为环境变量设置来传递一个过程看到另一个。您不需要专门“公开”或“发布”端口。典型的docker-compose.yml文件看起来像

version: '3'
services:
  myapp:
    build: .
    ports: ['8080:8080']
    env:
      - BACKEND_URL: 'http://localhost:12345'

但是更好的docker-compose.yml文件看起来像

version: 3
services:
  myapp:
    build: .
    ports: ['8080:8080']
    env:
      - BACKEND_URL: 'http://backend:12345'
    command: 'myapp -bind 0.0.0.0:8080'
  backend:
    build: .
    command: 'backend -bind 0.0.0.0:12345'