1

I have the following containers running:

$ 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

When I create/run a Docker container that has python manage.py makemigrations as entrypoint, the Django app can't connect to the Postgres container:

 $ 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?

Why it cannot connect, since that Postgres port is already exposed to the host? What am I missing?

ivanleoncz
  • 1,433
  • 4
  • 18
  • 32

1 Answers1

1

Basically, all compose_* containers, are attached to a different Docker Network, as well as test1, is associated to another network.

$ 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",

These containers were created through Docker Compose, without specifying a custom network. If no custom network is defined on your Docker Compose file, docker will create a custom network which uses the name of the directory from were you have your build environment. That's why the development, name of the directory which was holding the files for generating these containers, was used when creating a development_default network for them.

  • When executed the command $ docker run --name test1 repo/myapp:stage_1605191501, no --network was specified, so test1 will be associated to the default bridge network.

  • compose_postgres has 5432 port exposed to the host network and it is associated to development_default network (172.20.0.0/16).

Answer (steps):

  1. provide static IP for compose_postgres
  2. define this IP for the Django app definitions, inside the image of test1, in order to provide connection from the app to compose_postgres database
  3. define development_default as the --network for test1 when running docker run

For further reference:

ivanleoncz
  • 1,433
  • 4
  • 18
  • 32
  • You don't need the `compose_` part, that's the project name in compose which can change. Set it to `postgres`, `elastic`, and `mongo` for the hostnames instead. You'll see network aliases configured for these when deploying your project in compose. – BMitch May 17 '19 at 12:33