Кросс-составные сетевые подключения
При запуске проекта составления службы доступны как по их полному имени (включая префикс имени проекта, например, myproject_web_1
), так и по имени службы (как указано в файле compose), например. web
. Краткое имя - псевдоним сети , что означает, что любой контейнер, подключенный к той же сети, может получить доступ к контейнеру через это имя.
По умолчанию docker-compose
создает сеть для каждого составного проекта (projectname_default
), чтобы все службы в составном проекте могли обмениваться данными. Поскольку эта сеть создается для каждого проекта индивидуально, два составных проекта не совместно используют одну и ту же сеть, а их службы изолированы от других составных проектов.
Однако возможно, чтобы составные проекты (или отдельные службы в составном проекте) находились в одной сети.
Пример 1 - использование общей сети для всего проекта
В следующих файлах составления указано пользовательское имя для сети по умолчанию; оба compose-файла по умолчанию используют сеть sharednet
, что означает, что сервисы для обоих проектов compose будут подключены к одной сети:
Создать файл 1 (compose1.yml):
version: '3.5'
services:
compose1service:
image: busybox
tty: true
networks:
default:
name: sharednet
Создать файл 2 (compose2.yml):
version: '3.5'
services:
compose2service:
image: busybox
tty: true
networks:
default:
name: sharednet
Чтобы проиллюстрировать это:
Запустите оба файла компоновки:
docker-compose -f compose1.yml --project-name=compose1 up -d
docker-compose -f compose2.yml --project-name=compose2 up -d
Использование короткого (compose2service
) имени для проверки связи compose2service
изнутри службы в контейнере compose1service
работает;
docker exec compose1_compose1service_1 ping -c1 compose2service
PING compose2service (172.20.0.3): 56 data bytes
64 bytes from 172.20.0.3: seq=0 ttl=64 time=0.134 ms
--- compose2service ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.134/0.134/0.134 ms
И наоборот:
docker exec compose2_compose2service_1 ping -c1 compose1service
PING compose1service (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.151 ms
--- compose1service ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.151/0.151/0.151 ms
Как и полное имя (включая префикс проекта);
docker exec compose2_compose2service_1 ping -c1 compose1_compose1service_1
PING compose1_compose1service_1 (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.151 ms
--- compose1_compose1service_1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.151/0.151/0.151 ms
Пример 2 - использование общей сети для какой-либо службы в проекте
В этом примере оба составных проекта имеют свою собственную («по умолчанию») сеть, но, кроме того, добавляется общая сеть, чтобы некоторые службы могли подключаться к службам в другом составном проекте.
Создать файл 1 (compose3.yml):
version: '3.5'
services:
compose3service:
image: busybox
tty: true
networks:
- default
- sharednet
compose3otherservice:
image: busybox
tty: true
networks:
sharednet:
name: mysharednetwork
Примечание : если вы указываете, к каким сетям должен быть подключен сервис, вы переопределяете значения по умолчанию, что означает, что сервис больше не подключается автоматически к сети default
. Включите сеть default
в список сетей, чтобы служба могла взаимодействовать с другими службами в составном проекте.
Создать файл 2 (compose4.yml):
version: '3.5'
services:
compose4service:
image: busybox
tty: true
networks:
- default
- sharednet
compose4otherservice:
image: busybox
tty: true
networks:
sharednet:
name: mysharednetwork
Запустите оба файла компоновки:
docker-compose -f compose3.yml --project-name=compose3 up -d
docker-compose -f compose4.yml --project-name=compose4 up -d
Опять же, ping из службы compose3service
в compose4service
в других работах по созданию проекта (либо по короткому имени, либо по полному имени);
docker exec compose3_compose3service_1 ping -c1 compose4service
PING compose4service (172.22.0.3): 56 data bytes
64 bytes from 172.22.0.3: seq=0 ttl=64 time=0.110 ms
--- compose4service ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.110/0.110/0.110 ms
docker exec compose3_compose3service_1 ping -c1 compose4_compose4service_1
PING compose4_compose4service_1 (172.22.0.3): 56 data bytes
64 bytes from 172.22.0.3: seq=0 ttl=64 time=0.093 ms
--- compose4_compose4service_1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.093/0.093/0.093 ms
Однако попытка подключиться к compose4otherservice
не удастся, поскольку эта служба не подключена к сети mysharednetwork
:
docker exec compose3_compose3service_1 ping -c1 compose4otherservice
ping: bad address 'compose4otherservice'
docker exec compose3_compose3service_1 ping -c1 compose4_compose4otherservice_1
ping: bad address 'compose4_compose4otherservice_1'
Примечание
Следует соблюдать осторожность, если два составных проекта имеют службу с одинаковым именем (например, оба имеют службу с именем web
). В таких ситуациях web
может произвольно разрешить службу web
из любого проекта.