Контейнер не может подключиться к сервису из другого контейнера
У меня работают следующие контейнеры:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b02d801f9aa3 development_mongo "docker-entrypoint.s…" 7 hours ago Up About an hour 0.0.0.0:50001->27017/tcp compose_mongo
2903bb830ea7 development_postgres "docker-entrypoint.s…" 7 hours ago Up About an hour 0.0.0.0:50000->5432/tcp compose_postgres
6ce3fe015a8f development_elastic "/usr/local/bin/dock…" 7 hours ago Up About an hour 0.0.0.0:50002->9200/tcp, 0.0.0.0:50003->9300/tcp compose_elastic
Когда я создаю / запускаю контейнер Docker, который имеет python manage.py makemigrations
в качестве точки входа приложение Django не может подключиться к контейнеру Postgres:
$ docker run --name test1 repo/myapp:stage_1605191501
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/django/db/backends/base/base.py", line 217, in ensure_connection
self.connect()
File "/usr/local/lib/python3.6/dist-packages/django/db/backends/base/base.py", line 195, in connect
self.connection = self.get_new_connection(conn_params)
File "/usr/local/lib/python3.6/dist-packages/django/db/backends/postgresql/base.py", line 178, in get_new_connection
connection = Database.connect(**conn_params)
File "/usr/local/lib/python3.6/dist-packages/psycopg2/__init__.py", line 126, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: Connection refused
Is the server running on host "0.0.0.0" and accepting
TCP/IP connections on port 50000?
Почему он не может подключиться, так как этот порт Postgres уже открыт для хоста? Что мне не хватает?
1 ответ
В основном все compose_*
контейнеры, подключены к другой сети Docker, а также test1
, связан с другой сетью.
$ docker network inspect development_default | grep 'Name\|IPv4'
"Name": "development_default",
"Name": "compose_postgres",
"IPv4Address": "172.20.0.2/16",
"Name": "compose_elastic",
"IPv4Address": "172.20.0.4/16",
"Name": "compose_mongo",
"IPv4Address": "172.20.0.3/16",
Эти контейнеры были созданы с помощью Docker Compose без указания пользовательской сети. Если в файле Docker Compose не определена пользовательская сеть, docker создаст пользовательскую сеть, которая использует имя каталога, из которого у вас есть среда сборки. Вот почему разработка, имя каталога, в котором находились файлы для генерации этих контейнеров, использовалась при создании development_default
сеть для них.
Когда выполняется команда
$ docker run --name test1 repo/myapp:stage_1605191501
нет--network
было указано, такtest1
будет связан с дефолтомbridge
сеть.compose_postgres
имеет порт 5432, открытый для сети хоста, и он связан сdevelopment_default
сеть (172.20.0.0/16).
Ответ (шаги):
- предоставить статический IP для
compose_postgres
- определить этот IP для определений приложения Django, внутри изображения
test1
, чтобы обеспечить подключение из приложения кcompose_postgres
база данных - определять
development_default
как--network
заtest1
при бегеdocker run
Для дальнейшего использования: