
1、前言介绍
PostgreSQL数据库的安装,官方文档上边介绍的确实蛮详细的。刚开始使用的用户,有的可能是没有耐心按步骤走,导致中途失败。本文介绍作为普通安装的一种补充,特别适用于需要快速搭建、快速销毁的使用场景。那就是使用Docker来安装搭建PostgreSQL环境。只要我们把Docker环境事先搭好,那么,安装和启动PostgreSQL是非常方便的事。
2、Docker环境准备
这里就以CentOS7.9连带(RedhatELS7.9)以及Ubuntu20.0为例简单介绍一下环境的准备工作。
2.1 Rhel上的安装
参考: https://docs.docker.com/engine/install/rhel/
1. 下载关于docker的依赖环境
yum -y install yum-utils device-mapper-persistent-data lvm2
2. 设置一下下载Docker的镜像源 如果不设置,默认会从官网下载
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 安装Docker Engine
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
yum install -y epel-release (optional, already installed in the previous step)
curl -SL https://github.com/docker/compose/releases/download/v2.9.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
4. 启动,并设置为开机自动启动,测试
#启动Docker服务
systemctl start docker
#设置开机自动启动
systemctl enable docker
#测试
docker run hello-world
最终大概会有下边这么个提示:
root@ubuntu-sean:/home/sean# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
这上边是RedhatELS。换作是CentOS,安装的时候可能有这样的提示: centos安装docker显示 No package docker-ce available (报此错时)。一般,可以清除所有的包,再走上边的1、2、3步,即可。
1) uname -r
2) 卸载老版本的 docker 及其相关依赖
yum remove docker docker-common container-selinux docker-selinux docker-engine
再走上边的1,2,3
2.2、Ubuntu 20.0上Docker的安装准备
再来看看Ubuntu上的准备工作。参考文档:
https://docs.docker.com/engine/install/ubuntu/
1) apt-get remove docker docker-engine docker.io containerd runc
2) apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
3) mkdir -p /etc/apt/keyrings
4) curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
5) echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
6) apt-get update
7) apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
8) docker run hello-world
注意:Docker-compose最后可能报错,
解决方法:workround:
from https://github.com/docker/compose/issues/6023)
sudo apt install gnupg2 pass
gpg2 --full-generate-key
至此,docker以及docker-compose-plugin就都准备好了。
3、PostgreSQL在Docker上安装
介绍两种情况:一种是直接原始image运行,另一种是使用docker-compose
3.1、原始Docker Image
[21:51:38-sean@/home/sean]$ sudo docker pull postgres:15.2
15.2: Pulling from library/postgres
3f9582a2cbe7: Pull complete
Digest: sha256:50a96a21f2992518c2cb4601467cf27c7ac852542d8913c1872fe45cd6449947
Status: Downloaded newer image for postgres:15.2
docker.io/library/postgres:15.2
这里是将15.2版本的PostgreSQL的image拉下来。紧接着试着启动它看看:
[21:51:55-sean@sean-rh1:/home/sean]$ sudo docker run --name postgres152 -e POSTGRES_PASSWORD=password -p 5580:5432 -d postgres:15.2
3a63f0a755c4928dd9e01a0893ae157445f02caec7a85e722b2e5703fd95e3fb
我们将默认的5432端口映身到5580。已经在运行着。可以记下container id值的前几位: 3a63f. 使用docker container list或者docker ps都可以得到相应的运行信息。
[21:55:29-sean@sean-rh1:/home/sean]$ sudo docker container list
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a63f0a755c4 postgres:15.2 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:5580->5432/tcp, :::5580->5432/tcp postgres152
[21:56:32-sean@sean-rh1:/home/sean]$ sudo docker ps
[sudo] password for sean:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a63f0a755c4 postgres:15.2 "docker-entrypoint.s…" 6 minutes ago Up 6 minutes 0.0.0.0:5580->5432/tcp, :::5580->5432/tcp postgres152
刚运行的时候,系统中的用户及用户数据库都还没有,可以进到容器中进行配置运行,如:使用命令docker exec -it <container_id> /bin/bash进入操作。
[22:01:54-sean@sean-rh1:/home/sean]$ sudo docker exec -it 3a63f /bin/bash
root@3a63f0a755c4:/# psql
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: role "root" does not exist
root@3a63f0a755c4:/# psql -U postgres
psql (15.2 (Debian 15.2-1.pgdg110+1))
Type "help" for help.
postgres=# create database mydb;
CREATE DATABASE
postgres=# create user mydb with password 'test123';
CREATE ROLE
postgres=# grant all privileges on database mydb to mydb;
GRANT
postgres=# \c mydb mydb
You are now connected to database "mydb" as user "mydb".
mydb=> create table t(id int);
ERROR: permission denied for schema public
LINE 1: create table t(id int);
^
mydb=> create table mydb.t(id int);
ERROR: schema "mydb" does not exist
LINE 1: create table mydb.t(id int);
^
mydb=> create schema mydb;
CREATE SCHEMA
mydb=> create table mydb.t(id int);
CREATE TABLE
mydb=> insert into mydb.t values(1), (2);
INSERT 0 2
mydb=> \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
mydb | t | table | mydb
(1 row)
接着可以在容器外进行连接验证, 使用映射的端口5580进行连接:
[22:10:02-postgres@sean-rh1:/var/lib/pgsql]$ psql -h 10.180.3.255 -p 5580 -U mydb -W
Password:
psql (14.5, server 15.2 (Debian 15.2-1.pgdg110+1))
WARNING: psql major version 14, server major version 15.
Some psql features might not work.
Type "help" for help.
mydb=> select * from t;
id
----
1
2
(2 rows)
以上能进行正常的连接查询。基本上环境算是搭建成功。进一步探测一下,看看容器把$PGDATA放到了哪里了?(比较重要)
[22:15:38-sean@sean-rh1:/home/sean]$ sudo docker volume ls
[sudo] password for sean:
DRIVER VOLUME NAME
local ec7b1069b8c632b8801a75435f39a717081edc9c8aad02cff9bbbc33dfb2efa0
[22:16:25-sean@sean-rh1:/home/sean]$ sudo docker volume inspect ec7b1069b8
[]
Error: No such volume: ec7b1069b8
[22:16:43-sean@sean-rh1:/home/sean]$ sudo docker volume inspect ec7b1069b8c632b8801a75435f39a717081edc9c8aad02cff9bbbc33dfb2efa0
[
{
"CreatedAt": "2023-03-15T21:55:29Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/ec7b1069b8c632b8801a75435f39a717081edc9c8aad02cff9bbbc33dfb2efa0/_data",
"Name": "ec7b1069b8c632b8801a75435f39a717081edc9c8aad02cff9bbbc33dfb2efa0",
"Options": null,
"Scope": "local"
}
]
至此,简单的Docker PG环境算是完成了。
3.2、使用docker-compose进一步简化
因为前边准备工作已经帮我们准备好了docker-compose。拿上来直接用就行了。先定义好对应的yaml元文件。如:
[22:21:46-sean@sean-rh1:/pgccc/docker]$ sudo mkdir pg5581
[22:21:51-sean@sean-rh1:/pgccc/docker]$ cd pg5581
sudo vi docker-compose.yml
version: '3.7'
services:
postgres:
image: postgres:15.2
container_name: pg5581
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_USER: postgres
POSTGRES_DB: postgres
POSTGRES_PASSWORD: password
ports:
- "5581:5432"
volumes: # add this section
pgdata:
同样用的是15.2的image,然后端口映射到:5581。使用docker-compose up将其启动。
[22:33:30-sean@sean-rh1:/pgccc/docker/pg5581]$ sudo docker-compose up -d
[sudo] password for sean:
[+] Running 2/2
⠿ Network pg5581_default Created 0.0s
⠿ Container pg5581 Started
后边初始化动作就基本上是相同的了。不再缀述。
想要停止docker进程:
普通的docker使用docker stop <container_id> ,如果用docker-compose,则进到元文件目标目录, 用"down"
[22:29:28-sean@sean-rh1:/pgccc/docker/pg5581]$ sudo docker-compose down
[+] Running 2/2
⠿ Container pg5581 Removed 0.2s
⠿ Network pg5581_default Removed 0.0s
[22:32:34-sean@sean-rh1:/pgccc/docker/pg5581]$ sudo docker stop 3a63f0
3a63f0
[22:33:20-sean@sean-rh1:/pgccc/docker/pg5581]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
有一点值得说明的是,注意volume的位置,得为它提供足够的空间。很多配置内容都在对应的目录里边。这又是另外一个话题了。
END
本文只作为一个非常简单的PG在Docker中的环境搭建的基本内容介绍。环境一旦准备好,那么安装PostgreSQL可能只需要一个命令就可以了。对于平时的开发测试环境的配置来说,非常方便。





