天天看点

Docker部署postgresql挂载数据卷

作者:千语码农

前言

将postgresql运行的环境打包形成docker容器运行,服务运行随着容器的启动和关闭没什么问题,但是对于数据来说,我们是希望能够持久化的,不能删除容器,数据也被删除了,通过容器数据卷可以有效解决这个问题。

什么是容器数据卷?

卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此即使容器删除了,挂载的数据卷也不会被删除。

数据卷特点

  1. 数据卷可在容器之间共享或重用数据。
  2. 卷中的更改可以直接生效。
  3. 数据卷中的更改不会影响到原来的镜像。
  4. 数据卷的生命周期一直持续到没有容器使用它为止。

创建文件夹

# 创建数据卷文件夹
mkdir -p /data-volume/pgsql-volume/data /data-volume/pgsql-volume/logs
           

部署

# 拉取官方指定版本Postgresql镜像
docker pull postgres:12.4

# 运行镜像并挂载宿主机路径
docker run -it -d --name postgresql12 -v /data-volume/pgsql-volume/data:/var/lib/postgresql/data -p 54321:5432 -e POSTGRES_PASSWORD=1qazZSE$ postgres:12.4

# 将数据库日志同步到宿主机文件
docker logs -f postgresql12 >> /data-volume/pgsql-volume/logs/pgsql.log &

# 进入容器
docker exec -it postgresql12 /bin/bash
           

镜像本地保存与载入

# 保存
docker save -o postgresql12-4.tar postgres:12.4 
#-o:指定保存的镜像的名字;postgresql12-4.tar:保存到本地的镜像名称;postgres:12.4:镜像名字和版本号,可通过"docker images"查看

# 载入
docker load --input postgresql12-4.tar 或 docker load < postgresql12-4.tar
           

阿里镜像

需要注册阿里云账号
登录后,[容器镜像服务/实例列表/镜像仓库/命名空间] => 创建命名空间
[镜像仓库/仓库名称] => 创建仓库名称(我这里创建的名称是docker)
创建成功后,[镜像仓库/基本信息]中包含镜像拉取、推送等说明
docker login --username=XXXXXXXX registry.cn-qingdao.aliyuncs.com

#从Registry中拉取镜像
docker pull registry.cn-qingdao.aliyuncs.com/XXXXXXXX/docker:[镜像版本号]
例:
docker pull registry.cn-qingdao.aliyuncs.com/XXXXXXXX/docker:12.4

#将镜像推送到Registry
docker tag 492fb9ae4e7a registry.cn-qingdao.aliyuncs.com/mythsawyer/docker:12.4
# 说明:492fb9ae4e7a是docker images命令查看的image id, 12.4是版本
docker push registry.cn-qingdao.aliyuncs.com/XXXXXXXX/docker:12.4
           

知识补充

# 设置容器自启停
docker run --restart=always
# 如果容器已经启动,可以通过update命令进行设置,--restart=no(关闭)
docker update --restart=always <CONTAINER ID>

例:
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED        STATUS          PORTS                                         NAMES
e8043fe7101f   alpine:latest   "/bin/sh"                2 hours ago    Up 38 seconds   0.0.0.0:8088->80/tcp, :::8088->80/tcp         php7.2-alpine
318302849dc6   postgres:12.4   "docker-entrypoint.s…"   22 hours ago   Up 3 seconds    0.0.0.0:54321->5432/tcp, :::54321->5432/tcp   postgresql12

# 设置第一个容器自启停
docker update --restart=always e8043fe7101f

#重启后,设置的容器自动启动
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE           COMMAND     CREATED       STATUS        PORTS                                   NAMES
e8043fe7101f   alpine:latest   "/bin/sh"   2 hours ago   Up 1 second   0.0.0.0:8088->80/tcp, :::8088->80/tcp   php7.2-alpine