【问题标题】:Linking Django - Postgresql with Standalone Docker链接 Django - Postgresql 与独立 Docker
【发布时间】:2020-06-27 01:39:09
【问题描述】:

按照线程of this question,我正在尝试在一个容器中运行 Django,在另一个容器中运行 Postgres,并通过用户定义的网络“手动”连接它们。

我首先创建容器:

docker run --rm --name postgres-10 \
    -d -it \
    -p 5432:5432 \
    --network django-network \
    postgres:10

docker run --rm --name betcomm-django \
    -d -it  \
    -p 8000:8000 \
    -v $PWD:/app/backend \
    --network django-network \
    --link postgres-10:docker-db \
    pablorr10/betcomm-django:dev

这是我启动两个容器后的网络:

[
    {
        "Name": "django-network",
        "Id": "bbae9d656ea9ccc56c2c0f4db310d53fa135275358b16bc08636cf0c1a56127f",
        "Created": "2020-03-15T17:21:48.405473202Z",
        ...

        "Containers": {
            "79c7a66a5f4a892486d3c1d3089ff5850e2753af66cc694798015f80021297f3": {
                "Name": "postgres-10",
                "EndpointID": "d5fb80edfdf19678890da858e25e8bafd3e56113f82a5c1e39de5ca16f1caf5a",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "8873f054b23bb888b91deb64c819c1bf370db6ddc7b9f638ee60d850ee082da6": {
                "Name": "betcomm-django",
                "EndpointID": "e60640ec4dfbc1dd86b3464260ed73446846b8dd33b6e4b173befe26d5ee0738",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },...
]

这是 Django 容器上的错误:

root@8873f054b23b:/app/backend# python manage.py runserver 0.0.0.0:8000
Running Docker locally, setting env variables...

DB:  betcomm-dev
User:  postgres
Pass:  postgres
Host:  docker-db
Port:  5432
Running Docker locally, setting env variables...

DB:  betcomm-dev
User:  postgres
Pass:  postgres
Host:  docker-db
Port:  5432
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 220, in ensure_connection
    ...
    ...
    connection = Database.connect(**conn_params)
  File "/usr/local/lib/python3.7/site-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 "docker-db" (172.18.0.2) and accepting
        TCP/IP connections on port 5432?

但该 IP 上的 docker-db 确实已连接。

这些是 postgres 容器的日志:

(django) ➜  backend git:(serializing-on-kubernetes) ✗ docker logs postgres-10
2020-03-15 20:39:09.678 CET [1] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2020-03-15 20:39:09.679 CET [1] LOG:  could not bind IPv6 address "::1": Cannot assign requested address
2020-03-15 20:39:09.679 CET [1] HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2020-03-15 20:39:09.686 CET [1] LOG:  could not bind IPv4 address "192.168.65.2": Cannot assign requested address
2020-03-15 20:39:09.686 CET [1] HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2020-03-15 20:39:09.686 CET [1] WARNING:  could not create listen socket for "docker.for.mac.localhost"
2020-03-15 20:39:09.688 CET [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-03-15 20:39:09.808 CET [26] LOG:  database system was shut down at 2020-03-15 20:38:56 CET
2020-03-15 20:39:09.843 CET [1] LOG:  database system is ready to accept connections

我错过了什么?

【问题讨论】:

    标签: django postgresql docker networking docker-networking


    【解决方案1】:

    如果两个容器共享同一个网络,您可以使用容器name 将一个容器连接到另一个容器。

    例如:

    docker run -it  --name this-is-postgres --network=django-network  postgres
    docker run -it  --name this-is-django --network=django-network  python3
    

    两个容器都有一个共享网络,称为 django-network,要获取 postgress 容器中包含的资源,您可以使用其容器名称:this-is-postgres

    在django设置中,例如:

    DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.postgresql_psycopg2",
            "NAME": "mydb",
            "USER": "pg",
            "PASSWORD": "Password123",
            "HOST": "this-is-postgres", # the container name!
            "PORT": 5432,
        },
    }
    

    编辑:

    如果您可以连接到网络,则问题来自数据库的错误配置和/或您尝试连接的数据库不存在。以下docker run 与之前的 Django 设置数据库配置兼容。 env 变量用于设置用户名、密码并创建名为mydb 的数据库。

    docker run -it  --name this-is-postgres -e POSTGRES_PASSWORD=Password123 -e POSTGRES_USER=pg -e POSTGRES_DB=mydb --network=django-network  postgres
    

    有关命令/环境变量的完整列表,请参阅https://hub.docker.com/_/postgres

    【讨论】:

    • 它能够再次识别给定容器名称的IP,但仍然无法连接到数据库... psycopg2.OperationalError:无法连接到服务器:连接被拒绝服务器是否正在运行主机 "postgres-10" (172.18.0.2) 并接受端口 5432 上的 TCP/IP 连接?
    • 你可以使用 docker-compose 吗?编辑:数据库是否创建?您是否设置了 postgres ENV 变量?
    • 我正在尝试了解它是如何在没有 compose / kubectl 的情况下工作的。我已经附加了如何运行容器的问题,我忘记了
    • 能否提供您正在使用的docker run
    • 它正在工作!谢谢你的帮助!我正在阅读文档,您认为这可能是问题所在吗? --> 注意 1:PostgreSQL 映像在本地设置信任身份验证,因此您可能会注意到从 localhost(在同一容器内)连接时不需要密码。但是,如果从不同的主机/容器连接,则需要密码。
    猜你喜欢
    • 2017-04-18
    • 2014-12-05
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多