2016-12-23 4 views
11

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

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 в приведенном выше случае.

Thanks

ответ

18

Ссылки были заменены сетями. Docker описывает их как legacy feature that you should avoid using.. Вы можете безопасно удалить ссылку, и два контейнера будут иметь возможность ссылаться друг на друга по их имени службы (или имя_контента).

С составами ссылки имеют побочный эффект от создания подразумеваемой зависимости. Вы должны заменить это на более явный раздел 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 
+0

Я думаю, что @ Trân спрашивал о 'ссылках' в docker-compose, которые не устарели. Только в командах 'docker run'. https://forums.docker.com/t/are-links-deprecated-in-docker-compose/27348/2 –

+0

Они устарели, я проверил это непосредственно у докера, создавшего разработчика ранее. Документация показывает, что они вообще не поддерживаются режимом роя, и чтобы заставить их работать с докерером, вам нужна общая сеть, которая в любом случае обеспечивала бы поддержку DNS. https://docs.docker.com/compose/compose-file/#links – BMitch

Смежные вопросы