django - 链接 Django - Postgresql 与独立 Docker
问题描述
按照这个问题的主题,我试图在一个容器中运行 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
我错过了什么?
解决方案
如果两个容器共享同一个网络,您可以使用容器将一个容器连接到另一个容器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
推荐阅读
- go - 使用固定窗口在 Go 中运行 Apache Beam 管道的数据流“错误处理管道”
- e-commerce - Hybris SAO 和 AOM 混合设置
- c++ - mongocxx 驱动程序中可能未释放的内存
- firebase-realtime-database - 为 auto-id 节点设置 firebase 数据库规则
- azure-sql-database - servicestack sql server 关键字不支持 ormlite
- r - 提取重复字符
- c - 为什么除法比乘以它的倒数更准确
- android - 使用滚动物理 Flutter 的速度
- amazon-web-services - 如何使用 jmeter POST 方法在 aws 中创建 s3 存储桶
- z3 - z3:枚举类型、ADT 和递归函数