连接两个 docker-compose 实例

Posted

技术标签:

【中文标题】连接两个 docker-compose 实例【英文标题】:Connect two instances of 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 覆盖网络,我认为这对于生产用例来说还不够成熟。 【参考方案1】:

2016 年 6 月更新

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

旧答案

    创建网络:

     $ docker network create --driver bridge my-net
    

    在 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 中。

    调用 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) 中,您将能够使用用户定义的网络,并让两个组合加入同一个网络。

【讨论】:

以上是关于连接两个 docker-compose 实例的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose wordpress mysql连接被拒绝

使用 docker-compose 无法在同一网络中连接 mysql 和 spring boot

docker-compose 连接来自 LAN 上不同设备的服务器/客户端容器

Pycharm docker-compose解释器不加载库

Doc-Compose

centos7 安装docker-compose