【问题标题】:Connect two instances of docker-compose连接两个 docker-compose 实例
【发布时间】:2016-03-27 09:58:01
【问题描述】:

我有一个 dockerized 应用程序,其中有一些使用 docker-compose 运行的服务。我想使用另一个 docker-compose 应用程序docker-elk 将此应用程序与 ElasticSearch/Logstash/Kibana (ELK) 连接起来。它们都在开发中的同一台 docker 机器上运行。在生产中,情况可能并非如此。

如何配置我的应用程序的 docker-compose.yml 以链接到 ELK 堆栈?

【问题讨论】:

  • 你不能。您要么需要使用主机网络连接到应用程序,要么使用 docker compose 覆盖网络,我认为这对于生产用例来说还不够成熟。

标签: docker docker-compose elastic-stack


【解决方案1】:

2016 年 6 月更新

从 docker 1.10 开始,以下答案已过时。有关新解决方案,请参阅其他类似的答案。 https://stackoverflow.com/a/34476794/1556338

旧答案

  1. 创建网络:

     $ docker network create --driver bridge my-net
    
  2. 在 docker-compose.yml 文件中将该网络作为环境变量 (${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中的pg会解析到pg服务(容器)的ip地址。无需硬编码 IP 地址; pg 的条目会自动添加到 myapp 容器的 /etc/host 中。

  1. 调用 docker-compose,将您创建的网络传递给它:

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

我在上面创建了一个bridge network,它只能在一个节点(主机)内工作。对开发人员有好处。如果您需要让两个节点相互通信,您需要创建一个 overlay network。不过原理一样。您将网络名称传递给 docker-compose up 命令。

【讨论】:

    【解决方案2】:

    你也可以在你的 docker-compose 之外用 docker 创建一个网络:

    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
    

    而且两个实例都可以互相看到,主机上没有开放端口,你只需要暴露端口,就可以通过网络互相看到:“my-shared-network”。

    【讨论】:

    • 第二个 docker-compose.yml 中是否需要 net: ${NETWORK}
    • 如果一个服务必须先于另一个启动,我们如何实现link或depends_on。
    【解决方案3】:

    看看多主机 docker 网络

    网络是 Docker 引擎的一项功能,它允许您创建 虚拟网络并将容器附加到它们,以便您可以创建 适合您的应用程序的网络拓扑。网络化的 容器甚至可以跨越多个主机,因此您不必担心 关于您的容器所在的主机。他们无缝沟通 无论他们身在何处,都可以相互联系——从而实现真正的分布式 应用程序。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • @tmoreau 我同意。但这个问题太宽泛,话题太复杂,无法给出简短的回答。我删除了链接,以便 OP 可以 google。
    • 如果问题太宽泛,就这样标记。您的回答可能是评论。
    • 见仁见智。答案太笼统,不是问题。答案用于为问题添加解决方案。用于添加基本信息、要求澄清、要求额外信息等的评论。虽然答案很简短,但可以作为未来的参考。
    【解决方案4】:

    如果您为第一个合成设置了可预测的项目名称,则可以使用 external_links 从不同的合成文件中按名称引用外部容器。

    在下一个 docker-compose 版本 (1.6) 中,您将能够使用用户定义的网络,并让两个组合加入同一个网络。

    【讨论】:

      猜你喜欢
      • 2021-01-26
      • 2020-01-06
      • 1970-01-01
      • 2019-06-18
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      相关资源
      最近更新 更多