Разница между ссылками и 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
Обновление
Экспресс-зависимость между сервисами, которая имеет два эффекта:
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
, это было бы невозможно, но порядок запуска контейнеров был бы правильным.