连接docker-compose的两个实例

我有一个使用docker-compose运行的几个服务的dockerized应用程序。 我想用ElasticSearch / Logstash / Kibana(ELK)使用另一个docker-compose应用程序docker -elk来连接这个应用程序。 他们两个都在开发中的同一个docker机器上运行。 在生产中,情况可能不会如此。

我如何configuration我的应用程序的docker-compose.yml链接到ELK栈?

2016年6月更新

下面的答案是从docker1.10开始的。 看到这个新的解决scheme的其他类似的答案。 https://stackoverflow.com/a/34476794/1556338

老答案

  1. 创build一个networking:

      $ docker network create --driver bridge my-net 
  2. 在docker-compose.yml文件中将networking引用为环境variables( ${NETWORK} )。 例如:

     pg: image: postgres:9.4.4 container_name: pg net: ${NETWORK} ports: - "5432" myapp: image: quay.io/myco/myapp container_name: myapp environment: DATABASE_URL: "http://pg:5432" net: ${NETWORK} ports: - "3000:3000" 

请注意, http://pg:5432将parsing为pg服务(容器)的ip地址。 不需要硬编码的IP地址; pg的条目会自动添加到myapp容器的/ etc / host中。

  1. 调用docker-compose,将它传递给你创build的networking:

     $ NETWORK=my-net docker-compose up -d -f docker-compose.yml -f other-compose.yml 

我创build了一个只能在一个节点(主机)内工作的桥接networking 。 良好的开发。 如果您需要让两个节点相互交谈,则需要创build一个覆盖networking 。 尽pipe相同的原则。 您将networking名称传递给docker-compose up命令。

看看多主机dockernetworking

networking是Docker Engine的一个特性,允许您创build虚拟networking并将容器附加到它们,以便您可以创build适合您的应用程序的networking拓扑。 networking容器甚至可以跨越多个主机,因此您不必担心容器的主机位置。 无论他们在哪里,他们都可以无缝沟通 – 从而实现真正的分布式应用程序。

如果为第一个组合设置可预测的项目名称,则可以使用external_links通过不同的撰写文件中的名称来引用外部容器。

在下一个docker-compose发行版(1.6)中,您将能够使用用户定义的networking,并将这两个组合join同一个networking。

您也可以在docker-compose外部使用docker创build一个networking:

 docker network create my-shared-network 

在你的docker-compose.yml中:

 version: '2' services: pg: image: postgres:9.4.4 container_name: pg expose: - "5432" networks: default: external: name: my-shared-network 

在你的第二个docker-compose.yml中:

 version: '2' myapp: image: quay.io/myco/myapp container_name: myapp environment: DATABASE_URL: "http://pg:5432" net: ${NETWORK} expose: - "3000" networks: default: external: name: my-shared-network 

而且这两个实例都能够看到彼此,而不需要在主机上打开端口,只需要公开端口,通过networking就可以看到对方:“my-shared-network”。