使用Docker部署postgresql
使用Docker部署postgresql
postgresql数据库在Docker中的镜像的名称为postgres
,可以从DockerHub中pull下来,如果pull不下来那么很大概率是网络问题导致的,这时候你可能需要在网上找一些能用的镜像源,以成功拉取postgres
镜像。
有了postgres
的镜像之后,你就可以在本地的Docker创建一个postgres
的容器并运行。我们有两种方式来创建容器:
- 直接使用命令行来创建
postgres
的容器并运行; - 使用
docker-compose
来创建postgres
的容器并运行;
这里先介绍使用命令行的方式来创建postgres
容器的方式:
docker run -d
--name postgres-exprdb
-p 5432:5432
-e POSTGRES_PASSWORD=123456
-e POSTGRES_USER=aderversa
-e POSTGRES_DB=testdb
-v ~/postgresql/data:/var/lib/postgresql/data
postgres
-e
是用来设置postgres
容器中环境变量的值的,有些特殊的环境变量将会影响到启动后的postgresql
的一些参数,比如postgresql
数据库的密码、用户等等。具体一些环境变量的含义可以查看dockerhub中有关于环境变量的介绍,本文的最后也会介绍一些环境变量的含义。-p
将PostgreSQL的5432端口暴露到宿主机的5432端口,方便我们在外部访问容器内的PostgreSQL服务。-v
将容器内的/var/lib/postgresql/data
文件夹挂载到宿主机的~/postgresql/data
文件夹下,这样数据库中的数据就不会因为我们删除了容器而丢失。你需要自己定义好这个数据文件夹该挂载到自己主机的什么地方上,这里我给出的值仅做参考。--name postgres-exprdb
指定创建的PostgreSQL容器的名字。-d
表示该容器在后台运行,并打印创建容器的ID到控制台。postgres
是我们所使用的镜像。
运行上述命令,使用docker ps
查看容器状态:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1f5d4521cd0 postgres "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 0.0.0.0:5432->5432/tcp postgres-exprdb
可以看见,容器已经在后台运行了。之后,我们可以使用别的什么工具去访问已经创建好的testdb
数据库,用定义好的特权用户aderversa
,以及指定好的密码123456
。
IP已知,端口已知,用户名和密码都有了,那么你就可以用你能想象到的方式去连接这个PostgreSQL数据库啦。
使用docker-compose来部署
相比于在命令行中写冗长的命令,我更喜欢将容器的配置写到docker-compose.yaml
文件中,然后一行:
docker compose -f docker-compose.yaml -p package_name up -d
-f
指定要要操作的文件。-p
指定项目的名称。up
是创建并启动容器的命令。-d
表示容器在后台启动。
比如,我编写了一个docker-compose.yaml
文件:
version: "3.8"
services:
database_expr:
image: postgres:latest
container_name: postgres-expr
restart: on-failure:3
ports:
- 5432:5432
volumes:
- ./db:/var/lib/postgresql/data
healthcheck:
test: [ "CMD", "pg_isready" ]
interval: 10s
timeout: 5s
retries: 5
environment:
- POSTGRES_PASSWORD=123456
- POSTGRES_USER=aderversa
- POSTGRES_DB=testdb
直接对其进行操作就可以创建好容器并启动,用户不需要关心里面有什么配置。甚至如果你觉得使用docker compose
的命令行来启动不够抽象,那么你可以将它编写入shell脚本中,用户直接运行脚本,只要用户安装了Docker环境,就可以安装PostgreSQL成功,他甚至不需要关心Docker命令应该如何使用。
进入postgres容器中执行SQL
使用命令:
docker ps
查找出刚才创建的PostgreSQL容器的ID:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dcf5e3c0ff7f postgres:latest "docker-entrypoint.s…" 13 hours ago Up 13 hours (healthy) 0.0.0.0:5432->5432/tcp postgres-expr
获得container_id = dcf5e3c0ff7f
,接着我们使用以下命令进入容器的bash
中,方便在操作容器:
docker exec -it dcf5e3c0ff7f /bin/bash
注意,如果是在Windows下执行这条命令的时候,使用
Git Bash
来执行可能会因为终端的一些问题执行失败,此时需要更换一下执行命令的终端,比如:PowerShell。
进入到容器中是这个样子的:
> docker exec -it dcf5e3c0ff7f /bin/bash
root@dcf5e3c0ff7f:/#
第一行是在PowerShell中执行的,而第二行则是PostgreSQL容器中运行的bash进程。
接着我们就可以使用:
psql [OPTION]... [DBNAME [USERNAME]]
这里介绍连接数据库需要使用的OPTION选项,具体的你可以使用psql --help
来查看:
-h
指定PostgreSQL数据库的IP地址。-p
指定PostgreSQL数据库的端口号。-U
指定登录到数据库的用户名,不指定默认就是root
。-w
从不提示输入密码,字面意思,不需要输入密码来进行访问数据库,默认是不需要输入密码的。-W
强制密码输入。
按照这个用法,我们可以用以下两种方式连接数据库:
# 这里由于我们在创建容器的时候指定的特权用户是aderversa,因此root被挤占掉了
# 用户名对于我这里来说是必须设置的。
psql -p 127.0.0.1 -p 5432 -U aderversa testdb
或者省事一点,直接使用:
psql testdb aderversa
执行成功后我们就能够进入psql
的命令行:
psql (17.2 (Debian 17.2-1.pgdg120+1))
Type "help" for help.
testdb=#
psql的使用
这里我们并不知道如何使用这个命令行,它提示我们可以使用help
来获得帮助,那么就执行一波help,得到了以下信息:
You are using psql, the command-line interface to PostgreSQL.
Type: copyright for distribution terms
h for help with SQL commands
? for help with psql commands
g or terminate with semicolon to execute query
q to quit
这里它告诉我们:
-
copyright
,可以PostgreSQL DDMS的一些条款,里面大概是说:不管你出于何种目的,该软件和其文档都是允许你使用、复制、修改和发布的,并且是不需要任何费用,不需要修改的同意…看起来是非常宽松的声明,毕竟PostgreSQL遵循的是BSD协议。 -
h
显示SQL命令,比如CREATE TABLE
ALTER TABLE
…。 -
?
显示psql的命令,这里面还是非常多命令的,大多都是用来查看数据库的状态的,比如存在什么表、数据库、视图之类的。这里介绍一些常用的、简单的命令:l
,列出所有数据库;c[onnect]
,连接到数据库某个数据库,如果先前有连接到某个数据库那么这个操作就是更换连接的数据库;dt
,查看正在使用的数据库中存在哪些表(注意,默认创建的表似乎是不会列出来的);
-
g
执行psql的上一个命令。 -
q
退出psql。
以上就是psql的基本用法了,你可以按照自己的在上面执行SQL语句,比如:
create table user ( id int primary key );
注意SQL命令以;
结尾就可以了。
创建完成后可以使用:
dt
来查看你是否创建成功。
接下来就是你发挥创造力的时候了,自己尝试着使用psql吧。
补充postgres容器的环境变量
POSTGRES_PASSWORD
,必要的环境变量。这个环境变量将设置PostgreSQL容器中特权用户的密码。如果你要使用PostgreSQL镜像,让它以容器的形式的运行,那么这个环境变量就必须要设置,它一定不能够为空或者未定义。默认的特权用户将由POSTGRES_USER
来定义。POSTGRES_USER
,可选的环境变量。设置PostgreSQL容器中的特权用户名,需要与POSTGRES_PASSWORD
一起使用,以此设置好特权用户的名字和密码。如果该环境变量未被指定,那么默认的特权用户名为postgres
。POSTGRES_DB
,可选的环境变量。定义容器首次运行创建的默认数据库的名字。如果该环境变量未被使用,那么该环境变量的值等于POSTGRES_USER
的值。POSTGRES_INITDB_ARGS
,可选的环境变量。大概最终是以这种方式被利用:postgres initdb ${POSTGRES_INITDB_ARGS}
。POSTGRES_INITDB_WALDIR
,可选的环境变量。定义PostgreSQL事务日志的位置。默认的事务日志的位置是PostgreSQL主数据文件夹(PGDATA
指定)下的一个子文件夹。POSTGRES_HOST_AUTH_METHOD
,可选的环境变量。(个人理解,似乎是与密码摘要相关的东西,这一般不需要我们关注,如果有兴趣可以去PostgreSQL: Documentation: 14: 21.5. Password Authentication了解一下)。PGDATA
,可选的环境变量。定义PostgreSQL主数据文件夹的位置,默认是/var/lib/postgresql/data
,如果有调整位置的需求那么可以按需求设置该变量的值。