У меня запущены следующие контейнеры:
$ 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 уже открыт для хоста? Что мне не хватает?
В основном все 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).
Ответ (шаги):
compose_postgres
test1
, чтобы обеспечить подключение приложения к compose_postgres
база данныхdevelopment_default
как --network
для test1
при беге docker run
Для получения дополнительной информации: