wake-up-neo.com

Docker-Compose: Unterschied zwischen Netzwerk und Link

Ich lerne Hafenarbeiter. Ich sehe, dass diese beiden Begriffe mich verwirren. Zum Beispiel ist hier ein Docker-Compose, der zwei Services redis und web-app Definiert.

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 ein Brückennetzwerk mit dem Namen lognet und alle Dienste stellen eine Verbindung zu diesem Netzwerk her. Soweit ich weiß, können diese Dienste durch diese Aktion andere sehen. Warum muss der App-Dienst in diesem Fall noch mit dem Redis-Dienst verknüpft werden?.

Vielen Dank

30
Trần Kim Dự

Links wurden durch Netzwerke ersetzt. Docker beschreibt sie als Legacy-Funktion, die Sie vermeiden sollten. Sie können die Verknüpfung sicher entfernen, und die beiden Container können über ihren Dienstnamen (oder Containernamen) auf einander verweisen.

Mit compose haben Links den Nebeneffekt, dass eine implizite Abhängigkeit entsteht. Sie sollten dies durch einen expliziteren Abschnitt depend_on ersetzen, damit die App nicht versucht, ohne oder vor dem Start von redis auszuführen.

Abgesehen davon bin ich kein Fan von fester Codierung container_name, es sei denn, Sie sind sicher, dass dies der einzige Container ist, der mit diesem Namen auf dem Host vorhanden ist, und Sie müssen in der Docker-CLI namentlich darauf verweisen. Ohne den Containernamen erhält der Name von docker-compose einen weniger intuitiven Namen, es wird jedoch auch ein Alias ​​für die erneute Anzeige im Netzwerk angezeigt, genau das, was Sie für das Container-zu-Container-Netzwerk benötigen. Das Endergebnis mit diesen Vorschlägen ist also:

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
44
BMitch