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?
Best Answer
Basically, all
compose_*
containers, are attached to a different Docker Network, as well astest1
, is associated to another network.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, sotest1
will be associated to the defaultbridge
network.compose_postgres
has 5432 port exposed to the host network and it is associated todevelopment_default
network (172.20.0.0/16).Answer (steps):
compose_postgres
test1
, in order to provide connection from the app tocompose_postgres
databasedevelopment_default
as the--network
fortest1
when runningdocker run
For further reference: