【问题标题】:How do links and scaling work together in docker compose?链接和缩放如何在 docker compose 中协同工作?
【发布时间】:2015-04-19 04:55:14
【问题描述】:

以下是我对 docker compose 的理解:

  • 您可以“扩展”服务以同时在多个容器中运行。
  • 如果将服务 A 链接到服务 B,则服务 A 可以访问运行服务 B 的容器。

我的理解是否正确,如果是,如果有多个容器运行服务,链接在哪里连接?

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    首先我要澄清的是,默认情况下,无论是否将容器与其他容器链接,所有容器都可以看到在同一主机上运行的其他容器(使用容器 IP)。您可以使用 docker 守护程序中的 icc=true 标志更改此行为。

    关于 docker-compose 的链接,这些链接是在创建带有链接的容器时生成的。让我们用一个例子来看看。使用这个 docker-compose.yml

    web:
      build: .
      command: python app.py
      ports:
       - "5000:5000"
      volumes:
       - .:/code
      links:
       - redis
    redis:
      image: redis
    

    运行docker-compose up -d后,web_1容器与redis_1的容器链接:

            (...)
            "Links": [
            "/compose_redis_1:/compose_web_1/compose_redis_1",
            "/compose_redis_1:/compose_web_1/redis",
            "/compose_redis_1:/compose_web_1/redis_1"
        ], (...)
    

    现在我们想使用docker-compose scale redis=2 扩展redis 服务。运行后(并创建一个新容器redis_2),web_1 中的链接保持不变。

            (...)
            "Links": [
            "/compose_redis_1:/compose_web_1/compose_redis_1",
            "/compose_redis_1:/compose_web_1/redis",
            "/compose_redis_1:/compose_web_1/redis_1"
        ], (...)
    

    需要停止、删除和运行web_1 才能看到创建的这些链接:

    docker-compose stop web
    docker-compose rm web
    docker-compose run -d web
    docker inspect compose_web_run_2
    (...)        "Links": [
            "/compose_redis_1:/compose_web_run_2/compose_redis_1",
            "/compose_redis_2:/compose_web_run_2/compose_redis_2",
            "/compose_redis_1:/compose_web_run_2/redis",
            "/compose_redis_1:/compose_web_run_2/redis_1",
            "/compose_redis_2:/compose_web_run_2/redis_2"
        ],(...)
    

    还有web_1容器的/etc/hosts

    172.17.0.24 7be2dabea910
    127.0.0.1   localhost
    ::1 localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.17.0.21 compose_redis_1 8a1297a5b3e4
    172.17.0.23 compose_redis_2 069dd46836aa
    172.17.0.21 redis 8a1297a5b3e4 compose_redis_1
    172.17.0.21 redis_1 8a1297a5b3e4 compose_redis_1
    172.17.0.23 redis_2 069dd46836aa compose_redis_2
    

    因此,要生成新链接,您需要停止、删除并再次运行容器。

    【讨论】:

    • 那么如果服务 A 链接到服务 B,服务 A 可以访问服务 B 的所有实例?
    • 使用容器的 IP 始终可以访问,但如果您使用 --link 选项进行访问(即:使用 /etc/hosts 中的条目、全局环境变量...),则需要重新创建服务一个容器。
    • 这不是我的问题。服务 A 是链接到服务 B 的所有实例,还是链接到服务 B 的一个实例?
    • 它与服务 B 的所有实例相关联,但每个实例都有不同的别名(例如:redis_1 和 redis_2)。检查我的答案以查看示例的/etc/hosts
    • 好的,这是有道理的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2020-12-29
    • 1970-01-01
    相关资源
    最近更新 更多