暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL安装(一): 再简单点儿,用Docker?

数据库杂记 2023-03-17
164

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可能只需要一个命令就可以了。对于平时的开发测试环境的配置来说,非常方便。


文章转载自数据库杂记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论