我想用dockerized postgres运行dockerized Django应用程序。
我使用以下命令运行dockerized Django应用程序:
docker run --rm --env-file /path/to/variables -d -p 8000:8000 django_app:test
我使用以下命令运行dockerized postgres:
docker run --rm -d --env-file /path/to/secrets/variables -p 5432:5432 \ -v "$PWD/my-postgres.conf":/etc/postgresql/postgresql.conf \ --mount src=/path/to/db/data,dst=/var/lib/postgresql/data,type=bind \ postgres:alpine -c 'config_file=/etc/postgresql/postgresql.conf'
我的postgres配置是postgres docker容器文档中建议的默认配置。它实际上是一个包含以下内容的配置文件listen_addresses = '*'
listen_addresses = '*'
我对两个容器使用 相同的 环境变量:
DJANGO_SETTINGS_MODULE=settings.module PROJECT_KEY=xxyyzzabcdefg DB_ENGINE=django.db.backends.postgresql POSTGRES_DB=db_name POSTGRES_USER=db_user POSTGRES_PASSWORD=verydifficultpassword POSTGRES_HOST=localhost # I've also tried to use 0.0.0.0 POSTGRES_PORT=5432
我的数据库Django设置模块是:
DATABASES = { 'default': { 'ENGINE': os.environ.get('DB_ENGINE'), 'NAME': os.environ.get('POSTGRES_DB'), 'USER': os.environ.get('POSTGRES_USER'), 'PASSWORD': os.environ.get('POSTGRES_PASSWORD'), 'HOST': os.environ.get('POSTGRES_HOST'), 'PORT': os.environ.get('POSTGRES_PORT') } }
但是,我不断得到:
django.db.utils.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 5432?
我的django应用程序的Dockerfiles看起来像:
FROM python:alpine3.7 COPY --from=installer /app /app # required for postgres COPY --from=installer /usr/lib /usr/lib COPY --from=installer /usr/local/bin /usr/local/bin COPY --from=installer /usr/local/lib /usr/local/lib ARG SETTINGS_MODULE WORKDIR /app ENTRYPOINT python manage.py migrate &&\ python manage.py test &&\ python manage.py create_default_groups &&\ python manage.py set_screen_permissions &&\ python manage.py create_test_users &&\ python manage.py init_core &&\ python manage.py runserver 0.0.0.0:8000
另一个有趣的事实是,如果我在本地运行该应用程序python manage.py runserver并运行postgres容器,则该应用程序似乎正在运行。
python manage.py runserver
谁能帮助我找出为什么我的连接被拒绝了吗?提前致谢!
其次,定义自己的网络
docker network create foo
接下来,运行 连接 到该网络的容器:
docker run --rm --env-file /path/to/variables -d --network foo django_app:test docker run --rm -d ... --network foo postgres:alpine ...
注意两个命令--network foo。同样,在这种情况下,您也不 需要 公开端口-在用户定义的网络内,它是自动完成的:
--network foo
连接到同一用户定义的网桥网络的容器会自动将所有端口彼此公开,而不会向外界公开任何端口。这使容器化的应用程序可以轻松地彼此通信,而不会意外打开对外界的访问。
第三,为您的容器提供易于阅读的主机名 --name bar
--name bar
docker run ... --network foo --name my-django django_app:test ... docker run ... --network foo --name my-postgres postgres:alpine ...
最后修复连接字符串-从更改localhost为容器名称,例如my-postgres:
localhost
my-postgres
... POSTGRES_HOST=my-postgres ...