代码之家  ›  专栏  ›  技术社区  ›  Dag Høidahl

连接docker compose的两个实例[副本]

  •  12
  • Dag Høidahl  · 技术社区  · 9 年前

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

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

    5 回复  |  直到 9 年前
        1
  •  9
  •   Community CDub    8 年前

    2016年6月更新

    下面的答案从docker 1.10开始就已经过时了。请参阅另一个类似的答案,了解新的解决方案。 https://stackoverflow.com/a/34476794/1556338

    老答案

    1. 创建网络:

       $ docker network create --driver bridge my-net
      
    2. 将该网络作为环境变量引用( ${NETWORK} )在码头工作。yml文件。如:

      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"
      

    请注意 pg 在里面 http://pg:5432 将解析为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
  •  9
  •   Antoine    8 年前

    您也可以在docker组成之外创建一个与docker的网络:

    docker network create my-shared-network 
    

    在你的码头上作曲。yml:

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

    在你的第二个码头上作曲。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
    

    两个实例都可以相互看到,而主机上没有打开的端口,您只需要暴露端口,就可以通过网络看到彼此:“我的共享网络”。

        3
  •  2
  •   dnephin    9 年前

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

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

        4
  •  1
  •   Rob van Laarhoven    9 年前

    查看多主机docker网络

    网络是Docker Engine的一项功能,它允许您创建 虚拟网络并将容器附加到它们上,以便可以创建 适合您的应用程序的网络拓扑。联网的 容器甚至可以跨越多个主机,所以您不必担心 关于您的集装箱降落在哪个主机上。它们无缝地通信 无论在何处,都能实现真正的分布式 应用。

        5
  •  1
  •   Seyed Mostafa SeyedAshoor    3 年前

    我没有找到任何完整的答案,所以决定用一种完整而简单的方式解释它。

    要连接两个docker compose,您需要一个网络,并将两个dockercompose放在该网络中, 您可以使用创建netwrok docker网络创建网络名称 ,

    或者你可以简单地把网络声明 网络 选项,当您运行dockercompose(docker-compose-up)时,网络将自动创建。

    在两个dockercompose文件中放入以下行

    networks:
       net-for-alpine:
         name: test-db-net
    

    注: 高山网 是网络的内部名称,它将在docker合成文件中使用, 测试数据库网络 是网络的外部名称,在两个docker组成文件中必须相同。

    假设我们有docker-compose.db。yml和docker-compose.alpine.yml

    docker-compose.pline。yml将是:

    version: '3.8'
    
    services:
    
      alpine:
        image: alpine:3.14
        container_name: alpine
        networks:
          - net-for-alpine
      
        # these two command keeps apline container running
        stdin_open: true # docker run -i
        tty: true # docker run -t
    
    
    
    networks:
      net-for-alpine:
        name: test-db-net
    

    docker-compose.db。yml将是:

    version: '3.8'
    
    services:
    
      db:
        image: postgres:13.4-alpine
        container_name: psql
        networks:
          - net-for-db
      
    networks:
      net-for-db:
        name: test-db-net
    

    要测试网络,请进入阿尔卑斯山集装箱

    docker exec -it alpine sh 
          
    

    然后使用以下命令可以检查网络

    # if it returns 0 or see nothing as a result, network is established
    nc -z psql (container name)  
    

    ping pgsql