【问题标题】:rationale behind docker compose "links" orderdocker compose "links" 命令背后的基本原理
【发布时间】:2017-02-15 13:21:08
【问题描述】:

我在 docker 中有一个 Redis - Elasticsearch - Logstash - Kibana 堆栈,我正在使用 docker compose 进行编排。 Redis 将从远程位置接收日志,将它们转发到 Logstash,然后是习惯的 Elasticsearch、Kibana。

在 docker-compose.yml 中,我对“链接”的顺序感到困惑

Elasticsearch 链接到任何人,而 logstash 链接到 redis 和 elasticsearch

elasticsearch:

redis:

logstash:
    links:
    - elasticsearch
    - redis

kibana:
    links:
    - elasticsearch

这个顺序正确吗?选择“链接”方向的原因是什么。 为什么不说,elasticsearch链接到logstash呢?

【问题讨论】:

    标签: docker


    【解决方案1】:

    您可以使用 Docker 用户定义的网络,而不是使用旧版容器链接方法。基本上,您可以为您的服务定义一个网络,然后在 docker-compose 文件中指明您希望容器在该网络上运行。如果您的容器都在同一个网络上运行,它们可以通过容器名称相互访问(自动添加 DNS 记录)。

    1) : 创建用户定义的网络

    docker network create pocnet

    2) : 更新 docker-compose 文件

    您想将容器添加到刚刚创建的网络中。你的 docker-compose 文件看起来像这样:

    version: '2'
    
    services:
      elasticsearch:
        image: elasticsearch
        container_name: elasticsearch
        ports:
          - "{your:ports}"
        networks:
          - pocnet
    
      redis:
        image: redis
        container_name: redis
        ports:
           - "{your:ports}"
        networks:
          - pocnet
    
      logstash:
        image: logstash
        container_name: logstash
        ports:
          - "{your:ports}"
        networks:
          - pocnet
    
      kibana:
        image: kibana
        container_name: kibana
        ports:
          - "5601:5601"
        networks:
          - pocnet
    
    networks:
      pocnet:
        external: true
    

    3) : 启动服务

    docker-compose up

    注意:您可能需要打开一个新的 shell 窗口来运行第 4 步。

    4) : 测试

    进入 Kibana 容器,看看能否 ping 通 elasticsearch 容器。

    your__Machine:/ docker exec -it kibana bash
    kibana@123456:/# ping elasticsearch

    【讨论】:

      【解决方案2】:

      首先,docker 中的LinksUnidirectional

      有关链接的更多信息: 有遗留链接,以及用户定义网络中的链接。

      旧版链接为默认桥接网络提供了 4 个主要功能。

      • 名称解析
      • 使用 --link=CONTAINER-NAME:ALIAS 为链接容器命名别名
      • 安全的容器连接(通过 --icc=false 隔离)
      • 环境变量注入

      将以上4个功能与非默认用户自定义网络进行比较,无需任何额外配置,docker network提供

      • 使用 DNS 的自动名称解析
      • 容器中的自动安全隔离环境 网络
      • 能够动态连接和分离多个网络
      • 支持 --link 选项为链接提供名称别名 容器

      在您的情况下:自动 dns 将在用户定义的网络上为您提供帮助。首先创建一个新网络:

      docker network create ELK -d bridge
      

      使用这种方法,您不需要在同一个用户定义的网络上链接容器。您只需将您的 elk stack + redis 容器放入 ELK 网络并从 composer 文件中删除链接指令。

      我觉得您的订单很好。如果您对订单有任何问题,或者在依赖容器中等待服务启动,您可以使用以下内容:

      version: "2"
      services:
        web:
          build: .
          ports:
            - "80:8000"
          depends_on:
            - "db"
          entrypoint: ./wait-for-it.sh db:5432
        db:
          image: postgres
      

      这将使 web 容器等待直到它可以连接到数据库。 您可以从here 获取等待脚本。

      【讨论】:

      猜你喜欢
      • 2011-03-11
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      相关资源
      最近更新 更多