前言
将postgresql运行的环境打包形成docker容器运行,服务运行随着容器的启动和关闭没什么问题,但是对于数据来说,我们是希望能够持久化的,不能删除容器,数据也被删除了,通过容器数据卷可以有效解决这个问题。
什么是容器数据卷?
卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此即使容器删除了,挂载的数据卷也不会被删除。
数据卷特点
- 数据卷可在容器之间共享或重用数据。
- 卷中的更改可以直接生效。
- 数据卷中的更改不会影响到原来的镜像。
- 数据卷的生命周期一直持续到没有容器使用它为止。
创建文件夹
# 创建数据卷文件夹
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