Różnica między linkami i zależy od w docker_compose.yml

292

Zgodnie z dokumentacją pliku Docker Compose :

  • depends_on - Wyraźna zależność między usługami.
  • links- Łącz do kontenerów w innej usłudze, a także wyrażaj zależność między usługami w taki sam sposób, jak depend_on .

Nie rozumiem celu łączenia z innymi kontenerami, więc różnica między dwiema opcjami wciąż wydaje mi się dość trudna.

Byłoby o wiele łatwiej, gdyby istniał przykład, ale nie mogę go znaleźć.

Zauważyłem, że kiedy połączę pojemnik B z pojemnikiem A, wówczas pojemnik B będzie „możliwy do pingowania” w powłoce pojemnika A.

Wbiegłem ping Bdo kontenera A bashi uzyskałem taki wynik (tylko w celach informacyjnych, obraz z Internetu)

wprowadź opis zdjęcia tutaj

itsjef
źródło
6
--linkFlaga jest obecnie przestarzała funkcja spuścizna Döcker i dokumentacja sugeruje „To może ostatecznie zostać usunięte” Docker: Legacy linki kontenerów . Zaleca się, aby nie używać funkcji sieci Docker ani metody komponowania dokera . Uznałem, że byłoby to pomocne dla każdego, kto dowie się o tej funkcji.
A Star

Odpowiedzi:

122

Wpis wymaga aktualizacji po linkswycofaniu opcji.

Zasadniczo linksnie jest już potrzebny, ponieważ jego główny cel - udostępnienie kontenera innym przez dodanie zmiennej środowiskowej - jest domyślnie dołączony do network. Gdy kontenery są umieszczone w tej samej sieci, są one dostępne dla siebie nawzajem, używając nazwy kontenera i innego aliasu jako hosta.

Na docker run, --linkjest również przestarzała i powinna zostać zastąpiona przez sieć niestandardowej.

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

depends_onwyraża kolejność początkową (i domyślnie kolejność ciągnięcia obrazu), co było dobrym efektem ubocznym links.

Siyu
źródło
13
wspólny StackOverflow, dlaczego muszę przewijać w dół odpowiedzi poniżej 147 i 43 punkty, aby znaleźć odpowiedź 1 punkt, która jest najlepsza.
u8it
3
@ u8it To natura czasu i Internetu.
Michael Cole
Jak zrobić to samo w oknie dokowanym? Myślę, że dzięki komponentowi dokującemu wszystkie usługi są już w tej samej sieci i nie trzeba niczego dodawać. Nadal łączenie między kontenerami nie działa, jeśli jeden z kontenerów próbuje połączyć się z kontenerem, który nie jest w stanie Gotowe.
makkasi
Nie widzę informacji o nieaktualnych linkach w dokeratycznych wersjach 3 dokumentu: docs.docker.com/compose/compose-file/#links . Nie widzę opcji zbyt przydatnej, ponieważ mamy wspólne sieci i zależy od, ale to nie jest przestarzałe, jeśli poprawnie czytam dokumenty (wspominają tylko o flagi --link na kontenerze dokera).
rideronthestorm
Uwaga: kontenery (faktycznie usługi) w tej samej sieci są dostępne według nazwy usługi, a nie nazwy kontenera. Oficjalna dokumentacja: docs.docker.com/compose/networking/#links
GarryOne
194

Ta odpowiedź dotyczy wersji 2 dokera i działa również w wersji 3

Nadal możesz uzyskać dostęp do danych, gdy używasz zależy_on.

Jeśli spojrzysz na dokery Docker Compose i Django , nadal możesz uzyskać dostęp do bazy danych w następujący sposób:

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

Jaka jest różnica między linkami i zależy od opcji?

spinki do mankietów:

Podczas tworzenia kontenera dla bazy danych, na przykład:

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

docker inspect d54cf8a0fb98 |grep HostPort

I możesz znaleźć

"HostPort": "32777"

Oznacza to, że możesz podłączyć bazę danych z lokalnego portu hosta 32777 (3306 w kontenerze), ale ten port będzie się zmieniać za każdym razem, gdy ponownie uruchomisz lub usuniesz kontener. Możesz więc użyć łączy, aby mieć pewność, że zawsze będziesz się łączyć z bazą danych i nie musisz wiedzieć, który to port.

web:
  links:
   - db

zależy od:

Znalazłem fajnego bloga od Giorgio Ferraris Docker-compose.yml: od V1 do V2

Kiedy docker-compose wykonuje pliki V2, automatycznie buduje sieć między wszystkimi kontenerami zdefiniowanymi w pliku, a każdy kontener będzie mógł natychmiast odwoływać się do innych tylko przy użyciu nazw zdefiniowanych w pliku docker-compose.yml.

I

Więc nie potrzebujemy już linków; linki zostały użyte do rozpoczęcia komunikacji sieciowej między naszym kontenerem db a kontenerem serwera WWW, ale jest to już zrobione przez docker-compose

Aktualizacja

zależy od

Wyraźna zależność między usługami, która ma dwa efekty:

  • docker-compose upuruchomi usługi w kolejności zależności. W poniższym przykładzie db i redis zostaną uruchomione przed uruchomieniem sieci.
  • docker-compose up SERVICEautomatycznie uwzględni zależności SERVICE. W poniższym przykładzie web-docker-compose up również utworzy i uruchomi db i redis.

Prosty przykład:

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

Uwaga: depend_on nie będzie czekał, aż db i redis będą „gotowe” przed uruchomieniem sieci - tylko do momentu ich uruchomienia. Jeśli musisz poczekać na gotowość usługi, zobacz Kontrolowanie kolejności uruchamiania, aby uzyskać więcej informacji na temat tego problemu i strategii jego rozwiązywania.

Windsooon
źródło
Zaktualizowałem swoją odpowiedź, aby wyjaśnić, że odpowiedź była przeznaczona do skomponowania pliku v1.
Xiongbing Jin
1
Czy nadal obowiązuje to dla wersji 3?
fabiomaia
Tak, możesz https://docs.docker.com/compose/compose-file/compose-versioning/
rzucić
„Oznacza to, że możesz podłączyć bazę danych z portu lokalnego hosta 32777 (3306 w kontenerze). Ten port będzie się zmieniać za każdym razem, gdy ponownie uruchomisz lub usuniesz kontener”, nie jeśli określisz powiązanie portu w pliku dokowania-komponowania, nie będzie . A ponieważ to pytanie dotyczy konkretnie komponowania dokerów, uważam, że podany docker runtu przykład jest zupełnie nieistotny, i tak nie będzie można uruchomić kontenera. czego mi brakuje?
Andrew Savinykh,
Tak, masz rację, jeśli określisz port. Mój docker run przykład chce wskazać, dlaczego musimy użyć depend_on lub linków zamiast twardego kodu numeru portu. Po prostu dlatego, że jeśli go nie określisz, zmieni się za każdym razem. Myślę, że to pozwoli ludziom zrozumieć więcej na temat depend_on lub linków.
Windsooon
50

[Aktualizacja września 2016 r.]: Ta odpowiedź była przeznaczona dla skomponowanego pliku dokera v1 (jak pokazano w przykładowym pliku do komponowania poniżej). W przypadku wersji 2 zobacz inną odpowiedź autorstwa @Windsooon.

[Oryginalna odpowiedź]:

Jest to dość jasne w dokumentacji. depends_ondecyduje o zależności i kolejności tworzenia kontenerów, i to linksnie tylko, ale także

Kontenery dla połączonej usługi będą dostępne pod nazwą hosta identyczną z aliasem lub nazwą usługi, jeśli nie określono aliasu.

Na przykład zakładając następujący docker-compose.ymlplik:

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

db:
  image: postgres:latest

cache:
  image: redis:latest

Dzięki linkskodowi wewnątrz webbędzie można uzyskać dostęp do bazy danych przy użyciu db:5432, zakładając, że port 5432 jest widoczny na dbobrazie. Gdyby depends_onzostały użyte, nie byłoby to możliwe, ale kolejność uruchamiania kontenerów byłaby prawidłowa.

Xiongbing Jin
źródło
Czy możesz podać mi przykład? Ponieważ ta część jest wciąż niejasna. Być może istnieją inne opcje pliku tworzenia, które mogą uczynić go bardziej szczegółowym. Proszę o przedstawienie dalszych szczegółów. Dzięki!
itsjef
Dziękuję Ci bardzo! Mam to. Proszę o ostatnie pytanie. Tak więc, w moim konkretnym przypadku, wdrażam moją aplikację Railsową, czy powinienem użyć, linksczy depends_onteż jedno z nich jest w porządku? Moje obecne docker-compose.ymlzastosowania depends_oni rzeczy wydają się działać dobrze. :)
itsjef
Jeśli nie ma potrzeby bezpośredniego dostępu do innego pojemnika poprzez name:portwtedy depends_onjest w porządku.
Xiongbing Jin
9
name: port działa nawet bez łączenia, gdy używasz expose:
Amit Goldstein
7
„Gdyby użyto depend_on, nie byłoby to możliwe, ale kolejność uruchamiania kontenerów byłaby prawidłowa.”. To nie jest poprawne. Działałoby, jeśli po prostu użyjesz depend_on. Nadal możesz uzyskać do niego dostęp dbza webpomocą nazwy hosta baz danych.
prog.Dusan