Сеть в Docker Создать файл - PullRequest
1 голос
/ 19 марта 2020

Я пишу файл docker compose для своего веб-приложения. Если я использую «ссылку» для соединения служб друг с другом, мне также нужно включить «порт»? И «зависит от» альтернативного варианта «ссылки»? Что будет лучше для сервисов соединения в составном файле друг с другом?

1 Ответ

2 голосов
/ 19 марта 2020

Настройка ядра для этого описана в Сеть в Compose . Если вы абсолютно ничего не делаете, одна служба может вызвать другую, используя свое имя в файле docker-compose.yml в качестве имени хоста, используя порт, который прослушивает процесс внутри контейнера.

Вплоть до проблем порядка запуска Вот минимальный docker-compose.yml, который демонстрирует это:

version: '3'
services:
  server:
    image: nginx
  client:
    image: busybox
    command: wget -O- http://server/
    # Hack to make the example actually work:
    # command: sh -c 'sleep 1; wget -O- http://server/'

Вы не должны использовать links: вообще. Это была важная часть сетей Docker первого поколения, но в современных Docker она бесполезна. (Точно так же нет причин помещать expose: в Docker Compose файл.)

Вы всегда подключаетесь к порту, на котором запущен процесс внутри контейнера. ports: являются необязательными; если у вас есть ports:, вызовы между контейнерами всегда соединяются с вторым номером порта, и переназначение не имеет никакого эффекта. В приведенном выше примере контейнер client всегда подключается к стандартному HTTP-порту 80 по умолчанию, даже если вы добавляете ports: ['12345:80'] к контейнеру server, чтобы сделать его внешне доступным через другой порт.

depends_on: влияет на две вещи. Попробуйте добавить depends_on: [server] в контейнер client к примеру. Если вы посмотрите на сообщения «Starting ...», которые Compose распечатывает при запуске, это заставит server начинать запуск до того, как client начнет запускаться, но это , а не гарантия того, что server запущен и готов к обслуживанию запросов (это очень распространенная проблема с контейнерами базы данных). Если вы запускаете только часть стека с docker-compose up client, это также приводит к запуску server с него.

Более полный типичный пример может выглядеть следующим образом:

version: '3'
services:
  server:
    # The Dockerfile COPYs static content into the image
    build: ./server-based-on-nginx
    ports:
      - '12345:80'
  client:
    # The Dockerfile installs
    # https://github.com/vishnubob/wait-for-it
    build: ./client-based-on-busybox
    # ENTRYPOINT and CMD will usually be in the Dockerfile
    entrypoint: wait-for-it.sh server:80 --
    command: wget -O- http://server/
    depends_on:
      - server

SO вопросов в этом пространстве, кажется, есть ряд других ненужных опций. container_name: явно задает имя контейнера для не-Compose docker команд, вместо того, чтобы позволить Compose выбрать его, и оно предоставляет альтернативное имя для сетевых целей, но оно вам на самом деле не нужно. hostname: влияет на внутреннее имя хоста контейнера (например, то, что вы можете увидеть в приглашении оболочки), но не влияет на другие контейнеры. Вы можете вручную создать networks:, но Compose предоставляет вам сеть default, и нет никаких причин не использовать ее.

...