Docker-compose: разница между сетью и ссылкой

Я изучаю докер. Я вижу, что эти два слова заставляют меня смущать. Например, здесь находится сборка докеров, в которой определены две службы redis и web-app.

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

Этот файл docker-compose определяет сеть моста с именем lognet, и все службы будут подключаться к этой сети. Насколько я понимаю, это действие заставляет эти службы видеть других. Итак, почему для службы приложений по-прежнему необходимо связать службу redis в приведенном выше случае.

Спасибо

Ответ 1

Ссылки были заменены сетями. Docker описывает их как устаревшую функцию, которую вам следует избегать. Вы можете безопасно удалить ссылку, и два контейнера смогут ссылаться друг на друга по их имени службы (или имя_контейнера).

С compose ссылки имеют побочный эффект создания подразумеваемой зависимости. Вы должны заменить это более явным разделом depends_on, чтобы приложение не пыталось запустить без или до начала повтора.

В стороне я не поклонник жесткого кодирования container_name, если вы не уверены, что это единственный контейнер, который будет существовать с этим именем на хосте, и вам нужно будет ссылаться на него из docker cli по имени. Без имени контейнера docker-compose даст ему менее интуитивное имя, но также даст ему псевдоним redis в сети, что именно то, что вам нужно для создания контейнеров в контейнерах. Итак, конечный результат с этими предложениями:

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