点击围观!腾讯 TAPD 助力金融行业研发提效、敏捷转型最佳实践! 了解详情
写点什么

Docker 与 PostgreSQL 11.5 系列文章(三):数据持久化

  • 2019-08-30
  • 本文字数:4622 字

    阅读完需:约 15 分钟

Docker 与 PostgreSQL 11.5系列文章(三):数据持久化

在学习完第一篇《Docker与PostgreSQL 11.5系列文章(一)Docker的安装》和第二篇《Docker与PostgreSQL 11.5系列文章(二)postgreSQL 11.5安装》之后,继续讨论容器的持久化。“持久化” 简单理解,就是容器被关闭后 PostgreSQL 数据库的数据是否还存在?

容器持久化概述

容器在本质上是短暂的。它们有自己的文件系统。当容器死亡时,存储在其文件系统中的本地数据也会消失。PostgreSQL 等有状态应用程序不能作为 Docker 容器运行,因为当容器崩溃、死亡或被删除时,存储在其数据库中的数据将丢失。


在 Docker 容器中装载持久存储卷有两种不同的方法。


方法 1:


您可以在主机中创建一个新的持久存储卷,并将其装载到 Docker 容器中的目录或文件夹下。Docker 容器可以独占访问存储卷。存储在卷中的数据不容易从主机上读取、操作或损坏。卷的原理图如下:



方法 2:


您可以将主机中的本地目录作为 Docker 容器内的持久存储卷装载,以便在主机和 Docker 容器之间共享数据。如果主机希望访问或定期备份在 Docker 容器内运行的 DB 服务器写入文件夹的数据或数据库,则此方法非常有用。

创建并运行容器

数据存在 docker 自己管理的卷(volume)里面(路径在/var/lib/docker/volumes 下),现在大多推荐使用 volume。


[root@tar1 ~]# docker run -v volnamepg:/root/data --name dockerPG11 -e POSTGRES_PASSWORD=Xzzp2008 -p 54322:5432 -d postgres:11.5acb5bf2a4a26b525b8ef4327efcea31963bde8f8ed78ee57f4bc98d8be391f4c
复制代码


volnamepg 是卷的名字,卷会被自动创建。


/root/data 是容器中的目录。


卷(volume)是绕过容器的文件系统,直接将数据写到 host 主机上,只是 volume 是被 docker 管理的,docker 下所有的 volume 都在 host 机器上的指定目录下/var/lib/docker/volumes。


[root@tar1 volumes]# ll /var/lib/docker/volumes总用量 32drwxr-xr-x. 3 root root    19 8月  23 18:27 14145904c49f663d8345ef789a9c352046a6a6d1ccd49f4d9e2dfd1a141f6707drwxr-xr-x. 3 root root    19 8月  23 21:26 54943648b14cc92532aa20c95e8c7d70404a344eb427750aefd873b1b2003c74drwxr-xr-x. 3 root root    19 8月  23 17:40 59aca22a107ede60abc1795edd9d7a46ff5799850a43f536a91598f74ffa7e01drwxr-xr-x. 3 root root    19 8月  23 17:46 666f867e5062405683033d419458a85944568a007d6e82720149f48d306c4741drwxr-xr-x. 3 root root    19 8月  23 17:26 7b3400e3155b8a3f3950f6a495883532de20270c9811de7ea0ab5e31d944a165drwxr-xr-x. 3 root root    19 8月  23 17:42 8f56e930685166205e4d9fa5730f844aa7b0e0d1dc503e4ec4dd529023a5e17adrwxr-xr-x. 3 root root    19 8月  23 17:43 9cc314ca59489507b54a0f9122d9ce4fc929c99a885dab2bcd8b42df516cfa27drwxr-xr-x. 3 root root    19 8月  23 17:48 c5c58f45d54442366d2dff3d939988601a9b46c57d2a750ebeb3c087d1e27d10drwxr-xr-x. 3 root root    19 8月  23 19:43 d07687b3480ad42bc1d66fc7f609e831d10e917dbc6f95447af69113e8448d56-rw-------. 1 root root 65536 8月  23 21:26 metadata.dbdrwxr-xr-x. 3 root root    19 8月  23 19:43 volnamepg
复制代码

查看容器

[root@tar1 ~]# docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMESacb5bf2a4a26        postgres:11.5       "docker-entrypoint..."   9 seconds ago       Up 8 seconds        0.0.0.0:54322->5432/tcp   dockerPG11[root@tar1 ~]#
复制代码


这里要特别注意端口映射关系,54322 是对外暴漏的端口。

登录容器数据库

bash-4.2$ psql -U postgres -d postgres -h 127.0.0.1 -p 54322用户 postgres 的口令:psql (11.5)输入 "help" 来获取帮助信息.postgres=#
复制代码

创建表并插入数据

postgres=# CREATE TABLE season (id int, name varchar(80));CREATE TABLE                 ^postgres=# INSERT INTO season (id,name) VALUES (1, 'March');INSERT 0 1postgres=# SELECT * FROM season; id | name  ----+-------  1 | March(1 行记录)
postgres=# CREATE TABLE t_test (x numeric);CREATE TABLEpostgres=# INSERT INTO t_test SELECT random()postgres-# FROM generate_series(1, 50000000);INSERT 0 50000000postgres=# select * from t_test limit 5; x -------------------- 0.0994161088019609 0.887578224763274 0.232774924486876 0.416146846953779 0.557969538029283(5 行记录)
复制代码

重启容器

[root@tar1 ~]# docker stop dockerPG11dockerPG11[root@tar1 ~]# docker start dockerPG11dockerPG11
复制代码


dockerPG11 是容器的名字。

查看数据是否丢失

postgres=# \quit-bash-4.2$ psql -U postgres -d postgres -h 127.0.0.1 -p 54322用户 postgres 的口令:psql (11.5)输入 "help" 来获取帮助信息.
postgres=# SELECT * FROM season; id | name ----+------- 1 | March(1 行记录)
复制代码


从上面可以看出,容器重启以后,数据并没有丢失,说明数据持久化成功。

查看卷的情况

列出所有的卷

[root@tar1 ~]# docker volume lsDRIVER              VOLUME NAMElocal               14145904c49f663d8345ef789a9c352046a6a6d1ccd49f4d9e2dfd1a141f6707local               59aca22a107ede60abc1795edd9d7a46ff5799850a43f536a91598f74ffa7e01local               666f867e5062405683033d419458a85944568a007d6e82720149f48d306c4741local               7b3400e3155b8a3f3950f6a495883532de20270c9811de7ea0ab5e31d944a165local               8f56e930685166205e4d9fa5730f844aa7b0e0d1dc503e4ec4dd529023a5e17alocal               9cc314ca59489507b54a0f9122d9ce4fc929c99a885dab2bcd8b42df516cfa27local               c5c58f45d54442366d2dff3d939988601a9b46c57d2a750ebeb3c087d1e27d10local               d07687b3480ad42bc1d66fc7f609e831d10e917dbc6f95447af69113e8448d56local               volnamepg
复制代码


volnamepg 就是前面我们指定的,用于持久化的卷。

查看指定的卷的基本信息

[root@tar1 ~]# docker volume inspect volnamepg[    {"Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/volnamepg/_data","Name": "volnamepg","Options": {},"Scope": "local"    }
复制代码

查看卷的大小

卷的数据的默认存储位置是/var/lib/docker/volumes/


[root@tar1 ~]# ll /var/lib/docker/volumes/总用量 32drwxr-xr-x. 3 root root    19 8月  23 18:27 14145904c49f663d8345ef789a9c352046a6a6d1ccd49f4d9e2dfd1a141f6707drwxr-xr-x. 3 root root    19 8月  23 21:26 54943648b14cc92532aa20c95e8c7d70404a344eb427750aefd873b1b2003c74drwxr-xr-x. 3 root root    19 8月  23 17:40 59aca22a107ede60abc1795edd9d7a46ff5799850a43f536a91598f74ffa7e01drwxr-xr-x. 3 root root    19 8月  23 17:46 666f867e5062405683033d419458a85944568a007d6e82720149f48d306c4741drwxr-xr-x. 3 root root    19 8月  23 17:26 7b3400e3155b8a3f3950f6a495883532de20270c9811de7ea0ab5e31d944a165drwxr-xr-x. 3 root root    19 8月  23 17:42 8f56e930685166205e4d9fa5730f844aa7b0e0d1dc503e4ec4dd529023a5e17adrwxr-xr-x. 3 root root    19 8月  23 17:43 9cc314ca59489507b54a0f9122d9ce4fc929c99a885dab2bcd8b42df516cfa27drwxr-xr-x. 3 root root    19 8月  23 17:48 c5c58f45d54442366d2dff3d939988601a9b46c57d2a750ebeb3c087d1e27d10drwxr-xr-x. 3 root root    19 8月  23 23:46 cf103a7ead15ff3e25f42e83703f06544cfbf018fe469d577002dff9f692bb6fdrwxr-xr-x. 3 root root    19 8月  23 19:43 d07687b3480ad42bc1d66fc7f609e831d10e917dbc6f95447af69113e8448d56drwxr-xr-x. 3 root root    19 8月  23 22:52 fcb160da07e922021bec2f23d8b6b065fa389b83207f7e07538b5621b045966f-rw-------. 1 root root 65536 8月  25 12:04 metadata.dbdrwxr-xr-x. 3 root root    19 8月  23 19:43 volnamepg
复制代码

删除卷

如果卷不需要,可以使用下面的命令删除卷,volnamepg 就是卷的名字。


docker volume rm volnamepg
复制代码

容器问题集锦

问题 1:DNS 解析有问题

[root@tar1 yum.repos.d]# docker run hello-worldUnable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-world
复制代码

问题 2:Networking will not work

[root@tar1 yum.repos.d]# docker run --name dockerPG11 -e POSTGRES_PASSWORD=Xzzp2008 -p 54322:54355 -d postgres:11.5WARNING: IPv4 forwarding is disabled. Networking will not work.df222cdf3efb532da55c33d63ec98d0d01f10b9927dc7d4f9704633e42669874

复制代码


解决办法:


vim  /usr/lib/sysctl.d/00-system.conf
复制代码


添加如下代码:


net.ipv4.ip_forward=1
复制代码


重启 network 服务


# systemctl restart network
复制代码

问题 3:容器 ID 冲突

[root@tar1 yum.repos.d]# docker run --rm --name dockerPG11 -e POSTGRES_PASSWORD=Xzzp2008 -p 54322:54355 -d postgres:11.5docker: Error response from daemon: Conflict. The container name "/dockerPG11" is already in use by container "df222cdf3efb532da55c33d63ec98d0d01f10b9927dc7d4f9704633e42669874". You have to remove (or rename) that container to be able to reuse that name.See 'docker run --help'.

复制代码


解决办法:


得到容器 ID


docker ps –a
复制代码


删除容器


docker rm df222cdf3efb
复制代码

问题 4:driver failed programming external connectivity

[root@tar1 yum.repos.d]# docker run --name dockerPG11 -e POSTGRES_PASSWORD=Xzzp2008 -p 5432:54355 -d postgres:11.5973e9066cefee0747fc51458060ec37168039a005a23b406f787e5ad9dee146adocker: Error response from daemon: driver failed programming external connectivity on endpoint dockerPG11 (00b10c3636525f1a7c7c9ee8c30ad74c9d153be32d93fb02b01e028b05f3db55):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5432 -j DNAT --to-destination 172.17.0.2:54355 ! -i docker0: iptables: No chain/target/match by that name. (exit status 1)).
复制代码


解决办法:


重启 docker 和重启实例


service docker restart
复制代码

问题 5:卷不能被删除

[root@tar1 ~]# docker volume rm cf103a7ead15ff3e25f42e83703f06544cfbf018fe469d577002dff9f692bb6fError response from daemon: unable to remove volume: remove cf103a7ead15ff3e25f42e83703f06544cfbf018fe469d577002dff9f692bb6f: volume is in use - [83fd1e1408100846bc19348f6f01f5250a8881831d2383047a72fa9b26672701][root@tar1 ~]#
复制代码


卷正在被容器使用,要先删除容器


docker rm dockerPG11
复制代码

总结

这是一系列文章的最后一部分,着重讲了数据持久化,还讲了 PostgreSQL 安装部署,运维中遇到的一部分问题。也许将来,会在这三篇文章的基础之上,添加一系列文章。


作者简介:


赵振平,PostgreSQL 中文社区主席、计算机畅销书作家、贵州省省管专家、太阳塔科技 CTO、国家首批大数据高级职称、腾讯最具价值专家(TVP)、电子工业出版社签约作家、出版了技术专著《Oracle 数据库精讲与疑难解析》、出版了技术专著《成功之路:Oracle 11g 学习笔记》、出版了技术专著《IT 架构实录》。


2019-08-30 09:008173

评论

发布
暂无评论
发现更多内容

NCF 如何对接三方的功能(五)

MartyZane

支付 短信 签约计划第二季 NCF DDD框架

使用golang开发数据库周边工具

lixiaofeng

签约计划第二季

8千长文解决前端资源下载全场景问题

梁龙先森

签约计划第二季

Maven 如何打包 Spring Boot 项目

HoneyMoose

Maven 3 进行安装

HoneyMoose

《PyTorch 深度学习实战》复习7

IT蜗壳-Tango

28天写作 12月日更

每个前端都值得拥有自己的组件库,就像每个冬天都拥有春秋裤⛄️

速冻鱼

前端 组件库 签约计划第二季 12月日更

2021年最委屈的一件事

将军-技术演讲力教练

C++ 三种智能指针的使用场景

行者孙

c++ smart pointer 签约计划第二季

20行Python scrapy 代码,去采集【蓝桥】训练营

梦想橡皮擦

12月日更

Python Qt GUI设计:QMdiArea和QMdiSubWindow类实现多文档界面(拓展篇—3)

不脱发的程序猿

Python qt GUI设计 Qt Company 多文档界面

尝试

Nydia

C++的explicit关键字

行者孙

c++ 签约计划第二季 explicit

Python Qt GUI设计:QScrollBar类实现窗口水平或垂直滑动条效果(拓展篇—4)

不脱发的程序猿

Python qt GUI设计 Qt Company 滑动条效果

聊聊 Kafka: Consumer 源码解析之 ConsumerNetworkClient

老周聊架构

签约计划第二季

Maven 如何打包 Spring Boot 项目打包的发布 Jar 名字

HoneyMoose

用 Go + Redis 实现分布式锁

万俊峰Kevin

微服务 高并发 分布式锁 go-zero Go 语言

Confluence 如何在页面中显示目录

HoneyMoose

C++实现unique_ptr

行者孙

c++ DIY 签约计划第二季 unique_ptr

数据大体系(四)——标签

圣迪

大数据 标签 标签体系 数据体系

NCF 实战应用合集全解析

MartyZane

实战 内容合集 签约计划第二季 NCF DDD框架

线程方法:sleep( )、wait()、join( )、yield( )的区别

JavaEdge

C++软件开发中的时间

行者孙

c++ 签约计划第二季 chrono datetime iso8601

C++构造那些事:三五O法则

行者孙

c++ 签约计划第二季

关于分布式事务的思考

yuexin_tech

Prometheus Exporter (二十五)HAProxy Exporter

耳东@Erdong

Prometheus 28天写作 exporter 12月日更 HAProxy

[Pulsar] Broker处理消息确认

Zike Yang

Apache Pulsar 12月日更

Dubbo 框架学习笔记三

风翱

dubbo 12月日更

聊聊 Kafka: Consumer 源码解析之 Consumer 如何加入 Consumer Group

老周聊架构

签约计划第二季

NCF框架如何实现WebApi(四)

MartyZane

实战 签约计划第二季 NCF DDD框架 WebApi

【docker 总结】第一篇 - docker 简介和安装

Brave

Docker 12月日更

Docker 与 PostgreSQL 11.5系列文章(三):数据持久化_数据库_赵振平_InfoQ精选文章