Разница между ссылками и зависит от в docker compose.в формате YML
согласно Docker Compose compose-file documentation:
depends_on
- выраженная зависимость между службами.
links
- ссылка на контейнеры в другой сервис, а также выраженная зависимость между службами точно так же, как depends_on.
Я не понимаю цели привязки к другим контейнерам, поэтому разница между двумя вариантами все еще кажется довольно сложной для меня.
было бы намного проще, если бы был пример, но я не могу его найти.
Я заметил, когда я ссылку на контейнер б в контейнер, то контейнер б будут "обмениваться информацией" внутри контейнера в оболочке.
Я побежал ping B
внутри контейнера, а bash
и получил такой результат (просто для справки, изображение из интернета)
2 ответов:
этот ответ для docker-compose вариант 2 и он также работает на вариант 3
вы все еще можете получить доступ к данным при использовании depends_on.
если вы посмотрите на docker docs 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
в чем разница между links и depends_on?
ссылки:
при создании контейнер для базы данных, например:
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-файл.
и
так что нам больше не нужны ссылки; ссылки были использованы для запуска сетевой связи между нашим контейнером БД и нашим контейнером веб-сервера, но это уже сделано docker-compose
обновление
depends_on
выраженная зависимость между службами, которая имеет два эффекта:
- docker-compose up запустит службы в порядке зависимости. В следующем примере db и redis будут запущены до web.
- docker-compose up SERVICE автоматически включает сервис зависимости. В следующем примере docker-compose up web также создаст и запустит db и redis.
простой пример:
version: '2' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
Примечание: depends_on не будет ждать, пока db и redis будут "готовы" перед запуском веб - только до тех пор, пока они не будут запущены. Если вам нужно дождаться готовности службы, см. раздел Управление порядком запуска для получения дополнительной информации об этой проблеме и стратегиях ее решения.
[Update Sep 2016]: этот ответ был предназначен для docker compose file v1 (как показано в Примере compose file ниже). Для v2 см. другой ответ от @Windsooon.
[оригинальный ответ]:
это довольно ясно в документации.
depends_on
решает, зависимость и порядок создания контейнера иlinks
не только это, но иконтейнеры для связанной службы будут доступны по адресу имя хоста, идентичное псевдониму, или имя службы, если псевдоним не указан.
например, предполагая следующее
docker-compose.yml
file: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
были использованы, это было бы невозможно, но порядок запуска контейнеров будет правильным.