当前位置: 首页 > 面试题库 >

无法从Dockerized应用连接到Docker中的Postgres服务器

叶经略
2023-03-14
问题内容

我想用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 = '*'

我对两个容器使用 相同的 环境变量:

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容器,则该应用程序似乎正在运行。

谁能帮助我找出为什么我的连接被拒绝了吗?提前致谢!


问题答案:
只需利用用户定义的桥接网络即可。首先,通过阅读有关Docker中不同类型网络的简短说明来利用您的知识: https
//docs.docker.com/network/bridge/

其次,定义自己的网络

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。同样,在这种情况下,您也不 需要 公开端口-在用户定义的网络内,它是自动完成的:

连接到同一用户定义的网桥网络的容器会自动将所有端口彼此公开,而不会向外界公开任何端口。这使容器化的应用程序可以轻松地彼此通信,而不会意外打开对外界的访问。

第三,为您的容器提供易于阅读的主机名 --name bar

docker run ... --network foo --name my-django django_app:test ...
docker run ... --network foo --name my-postgres postgres:alpine ...

最后修复连接字符串-从更改localhost为容器名称,例如my-postgres

...
POSTGRES_HOST=my-postgres
...


 类似资料:
  • 在我做了和之后,我的postgres遇到了一些问题。我试着卸载postgres并重新安装它,但它并没有那么好用。 这就是我所做的: 现在,在我重新安装homebrew之后,当我使用时,它不显示任何错误消息。 但是我在我的Rails应用程序中运行,它显示: 更新 这对我也管用。

  • 错误:Redis连接到Redis:6379失败-连接econnrejected 172.20.0.2:6379 码头集装箱 Redis工作: docker-compose.yml

  • 我的docker版本是1.13.1。我正试图从我的docker容器连接到redis-server,但我遇到了拒绝连接的错误。详细的日志如下: 原因:redis.clients.jedis.exceptions.jedisconnectionException:java.net.Connection:redis.clients.jedis.Connection(Connection.java:207

  • 我正在使用Windows上的Docker来使用本地的postgres数据库。我制作了两个docker容器:一个用于名为pg的数据库,另一个用于名为pgadmin的pgadmin4。检查完pg后,我在172.17.0.3:5432连接了pgadmin4,它工作了。现在该编码了,但是... 我读了很多这样的问题,但我不明白。在我看来,这不像pg_hba中产生的问题。conf,因为在这种情况下,pgad

  • application.properties:这是spring mvc应用程序,应用程序使用带有两个数据库的MySQL db 我阅读了创建dockerfile和docker-compose文件的文章https://medium.com/@asce4s/dockerize-spring-mvc-application-a9ffbd11eadb https://github.com/abagayev/

  • 我一直在寻找一个解决办法,但没有找到一个有效的解决办法。 我已经在我的MacBook中使用brew安装了postgres(),并且我目前正在使用brew服务运行它(将postgres显示为正在运行的服务)。但是,当我尝试运行时,我得到以下错误。 PSQL:无法连接到服务器:没有这样的文件或目录是本地运行并接受Unix域套接字“/tmp/.s.pgsql.5432”上的连接的服务器吗? 有人已经解决