Разница между ссылками и depend_on в docker_compose.yml

Согласно документации Docker Compose для составления файла:

  • depends_on - depends_on зависимости между сервисами.
  • links - links с контейнерами в другом сервисе, а также выражает зависимость между сервисами таким же образом, как зависимость_

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

Было бы намного проще, если бы был пример, но я не могу его найти.

Я заметил, что когда я связываю контейнер B с контейнером A, тогда контейнер B будет "пингуемым" внутри оболочки контейнера A.

Я запустил ping B внутри контейнера A bash и получил такой результат (просто для справки, изображение из Интернета)

enter image description here

Ответ 1

Сообщение нуждается в обновлении после того, как опция links устарела.

По сути, links больше не нужны, потому что его основное назначение - сделать контейнер доступным для другого путем добавления переменной среды, неявно включено в network. Когда контейнеры помещаются в одну и ту же сеть, они доступны друг другу, используя имя контейнера и другой псевдоним в качестве хоста.

Для docker run --link также устарела и должна быть заменена пользовательской сетью.

docker network create mynet
docker run -d --net mynet --name container1 my_image
docker run -it --net mynet --name container1 another_image

depends_on выражает начальный порядок (и неявный порядок вытягивания изображения), что является хорошим побочным эффектом links.

Ответ 2

Этот ответ предназначен для docker-compose версии 2 и также работает в версии 3

Вы по-прежнему можете получить доступ к данным, когда используете зависимость_

.Если вы посмотрите документы Docker Docker Compose и Django, вы по-прежнему можете обращаться к базе данных следующим образом:

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

В чем разница между ссылками и зависимости_?

Ссылки:

Когда вы создаете контейнер для базы данных, например:

docker run -d --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" -P mysql

docker inspect d54cf8a0fb98 |grep HostPort

И вы можете найти

"HostPort": "32777"

Это означает, что вы можете подключить базу данных через локальный порт 32777 (3306 в контейнере), но этот порт будет меняться при каждом перезапуске или удалении контейнера. Таким образом, вы можете использовать ссылки, чтобы всегда подключаться к базе данных и не знать, какой это порт.

web:
  links:
   - db

depends_on:

Я нашел хороший блог от Джорджио Феррариса Docker-compose.yml: от V1 до V2

Когда docker-compose выполняет файлы V2, он автоматически создает сеть между всеми контейнерами, определенными в файле, и каждый контейнер сразу же может ссылаться на другие, просто используя имена, определенные в файле docker-compose.yml.

И

Поэтому нам больше не нужны ссылки; ссылки использовались для запуска сетевого взаимодействия между нашим контейнером db и нашим контейнером веб-сервера, но это уже сделано docker-compose

Обновление

depends_on

Экспресс-зависимость между сервисами, которая имеет два эффекта:

  • docker-compose up запускает службы в порядке зависимости. В следующем примере db и redis будут запущены перед web.
  • docker-compose up SERVICE автоматически включает зависимости SERVICE. В следующем примере docker-compose up web также создаст и запустит db и redis.

Простой пример:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

Примечание: зависимость_ будет не ждать, пока БД и Redis будут "готовы", прежде чем запускать веб - только до тех пор, пока они не будут запущены. Если вам нужно дождаться готовности службы, см. "Управление порядком запуска" для получения дополнительной информации об этой проблеме и стратегиях ее решения.

Ответ 3

[Update Sep 2016]: этот ответ был предназначен для файла docker compose file v1 (как показано в примере, приведенном в примере ниже). Для v2 см. Другой ответ @Windsooon.

[Исходный ответ]:

В документации довольно ясно. depends_on определяет зависимость и порядок создания контейнера, а links не только это, но и также

Контейнеры для связанной услуги будут доступны по имени хоста, идентичному псевдониму, или имени службы, если не было указано псевдоним.

Например, если предположить следующий файл docker-compose.yml:

web:
  image: example/my_web_app:latest
  links:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest

С links код внутри web сможет получить доступ к базе данных с помощью db:5432, предполагая, что порт 5432 отображается в образе db. Если бы использовались depends_on, это было бы невозможно, но порядок запуска контейнеров был бы правильным.