У меня есть два проекта (a и b), в каждом из которых есть файл docker-compose.yml. Теперь я хочу, чтобы один из проектов мог вызывать службу другого проекта, и, насколько мне известно, для этого мне нужно создать общую сеть докеров. Итак, чтобы создать минимальный пример, я создал две папки (a/
и b/
), каждая из которых содержит файл docker-compose.yml
.
Это в папке a/
:
version: '3'
services:
common_server:
image: ubuntu
ports:
- 4444:4444
command: >
bash -c '
apt update && apt install netcat -y &&
while true; do echo -e "HTTP/1.1 200 OK\n\npong" | nc -k -l -p 4444 -q 1; done'
# networks:
# - my_network
project_a:
image: ubuntu
depends_on:
- common_server
# networks:
# - my_network
command: >
bash -c '
apt update && apt install curl -y &&
while true; do echo "Calling the container"; echo "AAAAAAAA"; curl common_server:4444; sleep 10; done'
#networks:
# my_network:
# driver: bridge
Это устанавливает две вещи:
common_server
: простой сервер ping/pong, который отвечает "pong" на каждый полученный запрос.project_a
: простой клиент, который вызываетcommon_server
каждые 10 секунд.
Это прекрасно работает. Я быстро проверил сети докеров, используя:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
5ac503033848 a_default bridge local <== THIS NETWORK WAS CREATED
1f65f9c91441 bridge bridge local
72fcb38f2060 host host local
b76cd7ef1ac9 none null local
У меня есть второй файл docker-compose.yml в папке b/
, из которого я также хочу вызвать common_server
, определенный в файле выше. Поэтому я раскомментировал строки с сетью в файле выше, чтобы включить my_network
. Бег тоже отлично работает.
Когда я снова проверяю docker network ls
, я также вижу вторую сеть, которую он создал:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
5ac503033848 a_default bridge local <== CREATED BY THE FIRST RUN
f0a42e17007b a_my_network bridge local <== CREATED BY THE SECOND RUN
1f65f9c91441 bridge bridge local
72fcb38f2060 host host local
b76cd7ef1ac9 none null local
Затем я запустил второй файл docker-compose:
version: '3'
services:
project_b:
image: ubuntu
command: >
bash -c '
apt update && apt install curl -y &&
while true; do echo "Calling the container"; echo "BBBBBBB"; curl common_server:4444; sleep 10; done'
networks:
- a_my_network
networks:
a_my_network:
external: true
Это также работает. Он может вызывать common_server
из первого файла docker-compose.
Первый вопрос: хотя я определяю сеть как my_network
в первом файле, docker называет ее a_my_network
. Есть ли способ определить сеть, чтобы я мог называть ее одинаково в обоих файлах docker-compose?
Затем я решил удалить эти две сети с помощью docker network prune
и начать заново. К сожалению, когда я снова запускаю первый файл, я получаю следующую ошибку:
$ docker-compose up
Creating network "a_my_network" with driver "bridge"
Starting a_common_server_1 ... error
ERROR: for a_common_server_1 Cannot start service common_server: network f0a42e17007bc0f352042f5394aef65be18bb12c7836e8864ecb734f83a421d7 not found
ERROR: for common_server Cannot start service common_server: network f0a42e17007bc0f352042f5394aef65be18bb12c7836e8864ecb734f83a421d7 not found
ERROR: Encountered errors while bringing up the project.
Итак, мой второй вопрос: почему я могу запустить только первый файл docker-compose, если я сначала создаю сеть a_default
, не определяя сеть явно?