Подтвердить что ты не робот

Как объединяются ссылки и масштабирование в докере?

Вот мое понимание докера:

  • Вы можете "масштабировать" службу для запуска ее сразу в нескольких контейнерах.
  • Если вы связываете службу A с сервисом B, служба A имеет доступ к контейнеру, на котором запущена служба B.

Я правильно понимаю, и если да, то где соединяется ссылка, если есть несколько контейнеров, на которых запущена служба?

4b9b3361

Ответ 1

Прежде всего, я поясню, что по умолчанию, с или без связывания контейнера с другим, весь контейнер имеет видимость для других контейнеров, работающих на одном и том же хосте (с использованием IP-адреса контейнера). Вы можете изменить это поведение, используя флаг icc=true в демке docker.

В отношении ссылок с компоновкой docker они генерируются при создании контейнера со ссылками. Посмотрим на это с примером. Используя этот файл 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"
    ], (...)

Теперь мы хотим масштабировать услугу 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"
    ], (...)

Необходимо остановить, удалить и запустить 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"
    ],(...)

И /etc/hosts контейнера web_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

Чтобы создать новые ссылки, вам необходимо остановить, удалить и снова запустить контейнер.