写在前面,上一篇文章 《django with docker #2 之如何让django在docker容器中运行起来》,我们是直接使用django默认自带的数据库sqlite3,它通常情况下用作一个中小型网站(日访问次数少于10万)的后台数据库是完全可以胜任的。
这里为什么使用Postgres而不使用Mysql?
原因很简单,使用Postgres后,你可以很方便使用Django为你提供结合Postgres后的一些功能,比如全文搜索,今天我们的重点不在于这里,想要学习如何利用Postgres实现全文搜索可以查看我很早之前写的文章:《Django + PostgreSQL + 全文搜索》
开始容器化Postgres
要配置Postgres,我们需要:
- 向 docker-compose.yml 文件添加一个新服务。
- 更新Django设置。
- 安装Psycopg2。
首先,在docker- composite.yml中添加一个名为db的新服务:
为了在容器的使用寿命之外保留数据,我们配置了一个卷。 此配置会将postgres_data绑定到容器中的“ /var/lib/postgresql/data/”目录。
我们还添加了一个环境密钥,以定义默认数据库的名称并设置用户名和密码。
我们还将需要一些新的环境变量用于Web服务,因此请像这样更新.env.dev:
DEBUG=1
SECRET_KEY=foo(foo填写settings.py中对应的SECRET_KEY值)
ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=hello_django_dev
SQL_USER=hello_django
SQL_PASSWORD=hello_django
SQL_HOST=db
SQL_PORT=5432
更新settings.py中的DATABASES字典:
DATABASES = {
"default": {
"ENGINE": os.environ.get("SQL_ENGINE", "django.db.backends.sqlite3"),
"NAME": os.environ.get("SQL_DATABASE", os.path.join(BASE_DIR, "db.sqlite3")),
"USER": os.environ.get("SQL_USER", "user"),
"PASSWORD": os.environ.get("SQL_PASSWORD", "password"),
"HOST": os.environ.get("SQL_HOST", "localhost"),
"PORT": os.environ.get("SQL_PORT", "5432"),
}
}
在这里,数据库是根据我们刚刚定义的环境变量配置的。
更新Dockerfile以安装Psycopg2所需的适当软件包:
将Psycopg2添加到requirements.txt中:
Django==3.0.7
psycopg2-binary==2.8.5
接着执行命令构建新的镜像:
docker-compose up --build
运行迁移:
docker-compose exec web python manage.py migrate
在浏览器中打开 http://localhost:8000/。