Назад | Перейти на главную страницу

контейнер не может подключиться к службе из другого контейнера

У меня запущены следующие контейнеры:

$ 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).

Ответ (шаги):

  1. предоставить статический IP для compose_postgres
  2. определите этот IP-адрес для определений приложений Django внутри образа test1, чтобы обеспечить подключение приложения к compose_postgres база данных
  3. определить development_default как --network для test1 при беге docker run

Для получения дополнительной информации: