Різниця між посиланнями та залежними_ми в docker_compose.yml


292

Відповідно до документації на композицію Docker Compose :

  • depends_on - Експрес-залежність між службами.
  • links- Посилання на контейнери в іншій службі, а також висловлюйте залежність між службами так само, як і залежно_on .

Я не розумію мети з'єднання з іншими контейнерами, тому різниця між двома варіантами все ще здається мені досить складною.

Було б набагато простіше, якщо є приклад, але я не можу його знайти.

Я помітив, що коли я зв'язую контейнер B з контейнером A, тоді контейнер B буде "pingable" всередині оболонки контейнера A.

Я забіг ping Bвсередину контейнера A bashі отримав такий результат (лише для довідки, зображення з Інтернету)

введіть тут опис зображення


6
Зараз --linkпрапор є застарілою застарілою функцією Docker, а документація передбачає "Зрештою, його можна буде видалити" Docker: Legacy контейнерні посилання . Пропонується не використовувати функцію мереж Docker або метод компонування докера. Я вважав, що це буде корисно для всіх, хто тут дізнається про цю особливість.
Зірка

Відповіді:


122

Повідомлення потребує оновлення після того, як 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.


13
загальний StackOverflow, чому я повинен прокручувати вниз нижче 147 та 43 точкових відповідей, щоб знайти 1-бальну відповідь, що насправді найкраще.
u8it

3
@ u8it Це природа часу та Інтернету.
Майкл Коул

Як зробити те ж саме в docker-compose? Я думаю, що при складанні докерних композицій усі сервіси вже є в одній мережі, і не потрібно нічого додавати. Все-таки зв'язок між контейнерами не працює, якщо один із контейнерів намагається підключитися до контейнера, який не знаходиться в стані готовності.
makkasi

Я не бачу інформації про застарілі посилання у docker-compose версії 3 docs: docs.docker.com/compose/compose-file/#links . Я не вважаю цей параметр надто корисним, оскільки ми маємо спільні мережі та ovis_on, але це не застаріло, якщо я читаю документи правильно (вони згадують лише прапор - посилання на контейнер докера).
їхати в шторм

Примітка: контейнери (фактично послуги) в одній мережі доступні за назвою служби, а не назвою контейнера. Офіційна документація: docs.docker.com/compose/networking/#links
GarryOne

194

Ця відповідь призначена для докер- версії 2, вона також працює у версії 3

Ви все одно можете отримати доступ до даних, коли використовуєте залежність_on.

Якщо ви подивитесь докерів 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"

Це означає, що ви можете підключити базу даних зі свого порту localhost 32777 (3306 в контейнері), але цей порт буде змінюватися щоразу, коли ви перезапускаєте або видаляєте контейнер. Таким чином, ви можете використовувати посилання, щоб переконатися, що ви завжди будете підключатися до бази даних і не потрібно знати, який це порт.

web:
  links:
   - db

залежить від:

Я знайшов приємний блог від Giorgio Ferraris Docker-compose.yml: від V1 до V2

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

І

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

Оновлення

залежить від

Експресна залежність між службами, яка має два наслідки:

  • docker-compose upзапустить послуги в порядку залежності. У наступному прикладі db та redis будуть запущені перед веб.
  • docker-compose up SERVICEавтоматично включить залежність SERVICE. У наступному прикладі докер-композиція веб також створить і запустить db та redis.

Простий приклад:

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

Примітка: ovis_on не буде чекати, коли db та redis будуть "готові" до запуску веб-сторінок - лише до їх запуску. Якщо вам потрібно дочекатися, коли послуга буде готова, див. Розділ "Контроль порядку запуску", щоб дізнатися більше про цю проблему та стратегії її вирішення.


Я оновив свою відповідь, щоб уточнити, що відповідь призначена для створення файлу v1.
Xiongbing Jin,

1
Це все ще дійсно для версії 3?
fabiomaia

Так, ви можете подивитисяhttps://docs.docker.com/compose/compose-file/compose-versioning/
Windsooon

"Це означає, що ви можете підключити базу даних зі свого порту localhost 32777 (3306 в контейнері). Але цей порт буде змінюватися щоразу, коли ви перезапускаєте або видаляєте контейнер", якщо ви не вкажете прив'язку порту в файлі docker-compose, він не буде . І оскільки це питання стосується конкретно докер-композиту, я вважаю, що приклад із docker runтут абсолютно не має значення, це не так, як контейнер буде працювати. Що я пропускаю?
Андрій Савіних

Так, ви праві, якщо вказуєте порт. У моєму docker run прикладі хочеться вказати, чому нам потрібно використовувати zavis_on або посилання замість жорсткого коду порту. Я думаю, це дозволить людям зрозуміти більше про залежність_on або посилання.
Windsooon

50

[Оновити вересень 2016]: Ця відповідь була призначена для докерного композиційного файлу 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було використано, це було б неможливо, але порядок запуску контейнерів був би правильним.


Чи можете ви надати мені приклад? Тому що ця частина - це те, що мені досі незрозуміло. Можливо, є й інші параметри композитного файлу, які можуть зробити його більш конкретним. Будь ласка, надайте більш детальну інформацію. Дякую!
itjef

Велике спасибі! Зрозумів. Останнє запитання, будь ласка. Таким чином, в моєму конкретному випадку, я впевнений , розгортання моїх рейок додатки, я повинен використовувати linksабо depends_onчи будь-який з них в порядку? Моє поточне docker-compose.ymlвикористання depends_onта речі, здається, працюють нормально. :)
itsjef

Якщо вам не потрібно безпосередньо отримувати доступ до іншого контейнера, name:portтоді depends_onце нормально.
Xiongbing Jin

9
ім'я: порт працює навіть без посилання, коли ви використовуєте експонати:
Аміт Гольдштейн

7
"Якщо використовували залежність_on, це було б неможливо, але порядок запуску контейнерів був би правильним." Це неправильно. Це буде працювати, якщо ви просто використовуєте залежність_on. Ви все одно можете отримати доступ до своїх даних dbза webдопомогою імені хоста баз даних.
prog.Dusan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.