在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