2016-12-23 4 views
11

Ich lerne Docker. Ich sehe, dass diese zwei Begriffe mich verwirren lassen. Hier ist zum Beispiel ein Docker-Compose, der zwei Dienste definiert redis und web-app.docker-komponieren: Unterschied zwischen Netzwerk und Link

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 

Diese docker-compose Datei definiert eine Brücke Netzwerk namens LogNet und alle Dienste an dieses Netz angeschlossen werden. Wie ich verstehe, bewirkt diese Aktion, dass diese Dienste andere sehen können. Warum muss der App-Service in diesem Fall noch mit dem Redis-Service verlinkt sein?

Danke

Antwort

18

Links wurden durch Netzwerke ersetzt. Docker beschreibt sie als legacy feature that you should avoid using. Sie können den Link sicher entfernen, und die beiden Container können sich auf ihren Dienstnamen (oder Containername) beziehen.

Mit verfassen haben Links einen Nebeneffekt der Schaffung einer impliziten Abhängigkeit. Sie sollten dies durch einen expliziteren Abschnitt depends_on ersetzen, damit die App nicht ohne oder vor dem Redis-Start ausgeführt werden kann.

Nebenbei bin ich kein Fan von hart coding container_name, es sei denn, Sie sind sicher, dass dies der einzige Container ist, der mit diesem Namen auf dem Host existieren wird und Sie müssen aus dem docker cli namentlich beziehen . Ohne den Namen des Containers gibt docker-compose ihm einen weniger intuitiven Namen, aber es gibt ihm auch einen Alias ​​für redis im Netzwerk, was genau das ist, was Sie für Container-zu-Container-Netzwerke benötigen. Also das Endergebnis mit diesen Vorschlägen ist:

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

Ich denke @ Trân fragte nach 'links' in docker-compose, die nicht veraltet sind. Nur in 'docker run' Befehlen. https://forums.docker.com/t/are-links-deprecated-in-docker-compose/27348/2 –

+0

Sie sind veraltet, ich habe dies direkt vom Docker verfasst Entwickler vorher verfassen. Die Dokumentation zeigt, dass sie überhaupt nicht mit dem Schwarm-Modus unterstützt werden, und damit sie mit docker arbeiten können, brauchen Sie ein gemeinsames Netzwerk, das sowieso DNS-Unterstützung bietet. https://docs.docker.com/compose/compose-file/#links – BMitch