Docker中的链接和缩放如何协同工作?

Gae*_*lan 34 docker docker-compose

这是我对docker compose的理解:

  • 您可以"缩放"服务,以便一次在多个容器中运行它.
  • 如果将服务A链接到服务B,则服务A可以访问运行服务B的容器.

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

Jav*_*oso 30

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

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

web:
  build: .
  command: python app.py
  ports:
   - "5000:5000"
  volumes:
   - .:/code
  links:
   - redis
redis:
  image: redis
Run Code Online (Sandbox Code Playgroud)

运行后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"
    ], (...)
Run Code Online (Sandbox Code Playgroud)

现在我们想要使用扩展redis服务docker-compose scale redis=2.运行它(并创建一个新容器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"
    ], (...)
Run Code Online (Sandbox Code Playgroud)

需要停止,删除并运行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"
    ],(...)
Run Code Online (Sandbox Code Playgroud)

/etc/hostsweb_1容器:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 它与服务B的所有实例相关联,但每个实例具有不同的别名(例如:redis_1和redis_2).检查我的答案,看看示例的`/ etc/hosts` (2认同)