2016-12-23 11 views
11

Uczę się dokera. Widzę, że te dwa terminy sprawiają, że się mylę. Na przykład tutaj znajduje się okno dokowane, które definiuje dwie usługi: redis i web-app.docker-compose: różnica między siecią a łączem

services: 
    redis: 
    container_name: redis 
    image: redis:latest 
    ports: 
     - "6379:6379" 
    networks: 
     - lognet 

    app: 
    container_name: web-app 
    build: 
     context: . 
     dockerfile: Dockerfile 
    ports: 
     - "3000:3000" 
    volumes: 
     - ".:/webapp" 
    links: 
     - redis 
    networks: 
     - lognet 

networks: 
    lognet: 
    driver: bridge 

Ten plik docker-compose definiuje sieć most nazwany lognet i wszystkie usługi będą łączyć się z tą siecią. Jak rozumiem, ta czynność sprawia, że ​​te usługi mogą widzieć innych. Dlaczego więc usługa aplikacji nadal musi łączyć się z usługą redis w powyższym przykładzie.

Dzięki

Odpowiedz

18

Linki zostały zastąpione przez sieci. Docker opisuje je jako legacy feature that you should avoid using. Możesz bezpiecznie usunąć łącze, a dwa pojemniki będą mogły się nawzajem odwoływać za pomocą nazwy usługi (lub nazwy kontenera).

Przy komponowaniu linki mają efekt uboczny tworzenia domniemanych zależności. Powinieneś zamienić to na bardziej wyraźną sekcję depends_on, aby aplikacja nie próbowała działać bez lub przed uruchomieniem redis.

Na marginesie, nie jestem fanem twardego kodowania nazwa_pakietu, chyba że masz pewność, że jest to jedyny kontener, który będzie istniał z tą nazwą na hoście i musisz odwoływać się do niego z poziomu okna dokowanego cli . Bez nazwy kontenera, funkcja docker-compose da mu mniej intuicyjną nazwę, ale da mu również alias redis w sieci, który jest dokładnie tym, czego potrzebujesz do połączenia kontenera z kontenerem. Tak więc wynik końcowy z tymi sugestiami jest następujący:

version: '2' 
# do not forget the version line, this file syntax is invalid without it 

services: 
    redis: 
    image: redis:latest 
    ports: 
     - "6379:6379" 
    networks: 
     - lognet 

    app: 
    container_name: web-app 
    build: 
     context: . 
     dockerfile: Dockerfile 
    ports: 
     - "3000:3000" 
    volumes: 
     - ".:/webapp" 
    depends_on: 
     - redis 
    networks: 
     - lognet 

networks: 
    lognet: 
    driver: bridge 
+0

Myślę, że @ Trân pytał o 'links' w docker-compose, które nie są przestarzałe. Tylko w poleceniach 'docker run'. https://forums.docker.com/t/are-links-deprecated-in-docker-compose/27348/2 –

+0

Są one nieaktualne. Zweryfikowałem je bezpośrednio od programisty do tworzenia dokerów wcześniej. Dokumentacja pokazuje, że nie są one w ogóle obsługiwane w trybie roju, a aby działały z kompozycją dockera, potrzebujesz wspólnej sieci, która i tak zapewni obsługę DNS. https://docs.docker.com/compose/compose-file/#links – BMitch