Настройка ядра для этого описана в Сеть в 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
, и нет никаких причин не использовать ее.