在Docker中使用PostgreSQL
出于各种原因,尽管在生产环境中数据库很少进行容器化,但请记住这一点。
先前的知識
在使用Docker环境处理PostgreSQL时,需要事先了解的知识。
/docker-entrypoint-initdb.d/ -> /docker-entrypoint-initdb.d/
在PostgreSQL(也适用于MySQL)的镜像中,有一个机制可以在启动时执行放置在/docker-entrypoint-initdb.d/目录下的文件,通过利用这些文件可以进行数据库的初始设定和初始数据的创建。
支持的文件扩展名有.sh,.sql以及.sql.gz。
/var/lib/postgresql/data可以被中文本地化成以下方式:
PostgreSQL的数据存储路径为/var/lib/postgresql/data。将其挂载到本地以实现数据的持久化。
基本
开动
首先,我们将尝试在Docker中简单地启动PostgreSQL。
由于我的安排,我指定了14.5-bullseye版本,但仅使用postgres也没有问题。
docker run --name postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d postgres:14.5-bullseye
-e 用于指定环境变量(指定密码)。
-d 用于在后台启动。
登入
如果在使用Docker的主机环境上已安装了psql,则可以使用以下命令登录。
$ psql -h localhost -U postgres -d postgres
在运行docker时,密码作为环境变量提供(这里是postgres)。
应用一(初始数据设置及永久化)
准备好
cd
mkdir docker-pg-test
cd docker-pg-test
mkdir init data
touch ./init/init.sql
初始化.sql
create table if not exists members(
id serial primary key,
name text,
age int
);
执行和操作确认
除了基本时间描述,还通过-v将本地的./init和./data映射到容器上的目录中。
实施地点位于上述docker-pg-test目录中。
执行 (shí
docker run --name postgres -it -p 5432:5432 -e POSTGRES_PASSWORD=postgres -v $(pwd)/init:/docker-entrypoint-initdb.d -v $(pwd)/data:/var/lib/postgresql/data -d postgres:14.5-bullseye
登入
在主机电脑上进行。
$ psql -h localhost -U postgres -d postgres
确认桌子
我会查看dt表。members表已经创建了。
members_id_sql 是一个用于自动生成自动序列号的表。
postgres=# \dt;
List of relations
Schema | Name | Type | Owner
--------+----------------+----------+----------
public | members | table | postgres
public | members_id_seq | sequence | postgres
(2 rows)
数据插入
我将尝试插入数据。
请尝试通过执行“选择*来自成员”来查看内容。
postgres=# insert into members(name,age) values('hoge',99);
从数据库中退出
我会先暂时从数据库离开(在主机上操作)。
postgres=# \q;
可以通过“exit”来退出。
让我们确认数据是否已被持久化。
停止容器
首先,停止容器。
docker stop postgres
删除容器
删除容器。
如果不在这里进行永久化,数据将会丢失。
docker rm postgres
容器重新运行
现在,让我们再次启动容器。
docker run --name postgres -it -p 5432:5432 -e POSTGRES_PASSWORD=postgres -v $(pwd)/init:/docker-entrypoint-initdb.d -v $(pwd)/data:/var/lib/postgresql/data -d postgres:14.5-bullseye
请登录并确认数据。
登录并确认数据。您可以查看之前输入的数据(即数据已被持久化)。
postgres=# select * from members;
id | name | age
----+------+-----
1 | hoge | 99
(1 row)
将应用程序2进行Docker Compose化。
由于杂乱无章,因此尝试使用docker-compose进行整理。
docker-compose.yml的描述
version: '3'
services:
postgres:
image: postgres:14.5-bullseye
container_name: my_postgres
ports:
- "5432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
- ./data:/var/lib/postgresql/data
- ./init:/docker-entrypoint-initdb.d
执行
docker-compose up -d
停止可以解释为终止或中断某事。
docker-compose down
在应用3中(使用Dockerfile进行编写)
与Docker Compose相比,虽然能做的事情有限,但如果要在云端管理环境中运行的话,或许还是应该提前做好Dockerfile(镜像化)。
Dockerfile – Docker文件
FROM postgres:14.5-bullseye
COPY ./init/init.sql /docker-entrypoint-initdb.d/init.sql
ENV POSTGRES_USER postgres
ENV POSTGRES_PASSWORD postgres
EXPOSE 5432
在Dockerfile的VOLUME指令中,好像不能指定具名卷。
构建图像
docker build -t my_postgres .
进行
试一试。
docker run --name my_db -p 5432:5432 -d my_postgres
确认行动
首先,进行登录(通过主机电脑)。
$ psql -h localhost -U postgres -d postgres
确认 init.sql 已经被应用(看起来是这样)。
postgres=# select * from members;
id | name | age
----+------+-----
(0 rows)
请尽量把下列内容用中文进行改述,只需要一种选择:
参考
-
- https://timesaving.hatenablog.com/archive/category/PostgreSQL
-
- https://kakakakakku.hatenablog.com/entry/2017/11/08/193031
- https://karuta-kayituka.hatenablog.com/entry/2019/05/04/114056