PG中文社区 /

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

原作者:赵振平  创作时间:2019-08-28 14:27:44+08
wangliyun 发布于2019-08-29 08:07:44           评论: 3   浏览: 6570   顶: 718  踩: 710 

作者简介

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

背景介绍

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

容器持久化概述

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

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

方法1:

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

CENTER_PostgreSQL_Community

方法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.5
acb5bf2a4a26b525b8ef4327efcea31963bde8f8ed78ee57f4bc98d8be391f4c

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

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

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

[root@tar1 volumes]# ll /var/lib/docker/volumes
总用量 32
drwxr-xr-x. 3 root root    19 8月  23 18:27 14145904c49f663d8345ef789a9c352046a6a6d1ccd49f4d9e2dfd1a141f6707
drwxr-xr-x. 3 root root    19 8月  23 21:26 54943648b14cc92532aa20c95e8c7d70404a344eb427750aefd873b1b2003c74
drwxr-xr-x. 3 root root    19 8月  23 17:40 59aca22a107ede60abc1795edd9d7a46ff5799850a43f536a91598f74ffa7e01
drwxr-xr-x. 3 root root    19 8月  23 17:46 666f867e5062405683033d419458a85944568a007d6e82720149f48d306c4741
drwxr-xr-x. 3 root root    19 8月  23 17:26 7b3400e3155b8a3f3950f6a495883532de20270c9811de7ea0ab5e31d944a165
drwxr-xr-x. 3 root root    19 8月  23 17:42 8f56e930685166205e4d9fa5730f844aa7b0e0d1dc503e4ec4dd529023a5e17a
drwxr-xr-x. 3 root root    19 8月  23 17:43 9cc314ca59489507b54a0f9122d9ce4fc929c99a885dab2bcd8b42df516cfa27
drwxr-xr-x. 3 root root    19 8月  23 17:48 c5c58f45d54442366d2dff3d939988601a9b46c57d2a750ebeb3c087d1e27d10
drwxr-xr-x. 3 root root    19 8月  23 19:43 d07687b3480ad42bc1d66fc7f609e831d10e917dbc6f95447af69113e8448d56
-rw-------. 1 root root 65536 8月  23 21:26 metadata.db
drwxr-xr-x. 3 root root    19 8月  23 19:43 volnamepg

查看容器

[root@tar1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
acb5bf2a4a26        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 1
postgres=# SELECT * FROM season;
 id | name  
----+-------
  1 | March
(1 行记录)

postgres=# CREATE TABLE t_test (x numeric);
CREATE TABLE
postgres=# INSERT INTO t_test SELECT random()
postgres-# FROM generate_series(1, 50000000);
INSERT 0 50000000
postgres=# select * from t_test limit 5;
         x          
--------------------
 0.0994161088019609
  0.887578224763274
  0.232774924486876
  0.416146846953779
  0.557969538029283
(5 行记录)

重启容器

[root@tar1 ~]# docker stop dockerPG11
dockerPG11
[root@tar1 ~]# docker start dockerPG11
dockerPG11

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 ls
DRIVER              VOLUME NAME
local               14145904c49f663d8345ef789a9c352046a6a6d1ccd49f4d9e2dfd1a141f6707
local               59aca22a107ede60abc1795edd9d7a46ff5799850a43f536a91598f74ffa7e01
local               666f867e5062405683033d419458a85944568a007d6e82720149f48d306c4741
local               7b3400e3155b8a3f3950f6a495883532de20270c9811de7ea0ab5e31d944a165
local               8f56e930685166205e4d9fa5730f844aa7b0e0d1dc503e4ec4dd529023a5e17a
local               9cc314ca59489507b54a0f9122d9ce4fc929c99a885dab2bcd8b42df516cfa27
local               c5c58f45d54442366d2dff3d939988601a9b46c57d2a750ebeb3c087d1e27d10
local               d07687b3480ad42bc1d66fc7f609e831d10e917dbc6f95447af69113e8448d56
local               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/
总用量 32
drwxr-xr-x. 3 root root    19 8月  23 18:27 14145904c49f663d8345ef789a9c352046a6a6d1ccd49f4d9e2dfd1a141f6707
drwxr-xr-x. 3 root root    19 8月  23 21:26 54943648b14cc92532aa20c95e8c7d70404a344eb427750aefd873b1b2003c74
drwxr-xr-x. 3 root root    19 8月  23 17:40 59aca22a107ede60abc1795edd9d7a46ff5799850a43f536a91598f74ffa7e01
drwxr-xr-x. 3 root root    19 8月  23 17:46 666f867e5062405683033d419458a85944568a007d6e82720149f48d306c4741
drwxr-xr-x. 3 root root    19 8月  23 17:26 7b3400e3155b8a3f3950f6a495883532de20270c9811de7ea0ab5e31d944a165
drwxr-xr-x. 3 root root    19 8月  23 17:42 8f56e930685166205e4d9fa5730f844aa7b0e0d1dc503e4ec4dd529023a5e17a
drwxr-xr-x. 3 root root    19 8月  23 17:43 9cc314ca59489507b54a0f9122d9ce4fc929c99a885dab2bcd8b42df516cfa27
drwxr-xr-x. 3 root root    19 8月  23 17:48 c5c58f45d54442366d2dff3d939988601a9b46c57d2a750ebeb3c087d1e27d10
drwxr-xr-x. 3 root root    19 8月  23 23:46 cf103a7ead15ff3e25f42e83703f06544cfbf018fe469d577002dff9f692bb6f
drwxr-xr-x. 3 root root    19 8月  23 19:43 d07687b3480ad42bc1d66fc7f609e831d10e917dbc6f95447af69113e8448d56
drwxr-xr-x. 3 root root    19 8月  23 22:52 fcb160da07e922021bec2f23d8b6b065fa389b83207f7e07538b5621b045966f
-rw-------. 1 root root 65536 8月  25 12:04 metadata.db
drwxr-xr-x. 3 root root    19 8月  23 19:43 volnamepg

删除卷

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

docker volume rm volnamepg

容器问题集锦

问题1:DNS解析有问题

DNS解析有问题

[root@tar1 yum.repos.d]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: 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.5
WARNING: 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.5
docker: 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.5
973e9066cefee0747fc51458060ec37168039a005a23b406f787e5ad9dee146a
docker: 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 cf103a7ead15ff3e25f42e83703f06544cfbf018fe469d577002dff9f692bb6f
Error response from daemon: unable to remove volume: remove cf103a7ead15ff3e25f42e83703f06544cfbf018fe469d577002dff9f692bb6f: volume is in use - [83fd1e1408100846bc19348f6f01f5250a8881831d2383047a72fa9b26672701]
[root@tar1 ~]#

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

docker rm dockerPG11

总结

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

CENTER_PostgreSQL_Community


评论:3   浏览: 6570                   顶: 718  踩: 710 

请在登录后发表评论,否则无法保存。

1# __ xcvxcvsdf 回答于 2025-01-03 14:07:59+08
http://ouyu.hftcbmw.cn/xjyl/ http://wutai.cqtcxxw.cn/jiaxing/ http://js.sytcxxw.cn/dehong/ http://ly.shtcxxw.cn/wuhan/ http://ruanwen.xztcxxw.cn/fujian/ http://bjtcxxw.cn/dxq/ http://nalei.zjtcbmw.cn/hljhrb/ http://xinguang.sctcbmw.cn/shfengxian/ http://gx.lztcxxw.cn/fjx/ http://cf.lstcxxw.cn/fysj/ http://ruanwen.xztcxxw.cn/bbq/ http://huilong.sctcbmw.cn/scpzh/ https://honglan.tiancebbs.cn/dingxi/ http://shenghuo.china-bbs.com/qyzp/ http://fuyang.tjtcbmw.cn/pudongsh/ https://xlgl.tiancebbs.cn/ https://sanya.tiancebbs.cn/

2# __ xcvxcvsdf 回答于 2024-10-15 16:25:16+08
https://zulin.tiancebbs.cn/sh/3594.html https://sy.tiancebbs.cn/qths/464532.html https://changshushi.tiancebbs.cn/hjzl/464007.html https://www.tiancebbs.cn/ershouwang/472521.html https://nj.tiancebbs.cn/qths/451508.html https://www.tiancebbs.cn/ershoufang/472237.html https://su.tiancebbs.cn/hjzl/472940.html https://mdj.tiancebbs.cn/xzrszp/57028.html https://zulin.tiancebbs.cn/sh/263.html https://zulin.tiancebbs.cn/sh/2683.html https://www.tiancebbs.cn/ershoufang/468389.html https://aihuishou.tiancebbs.cn/sh/2479.html https://maogangqu.tiancebbs.cn/qths/462143.html https://zulin.tiancebbs.cn/sh/4491.html https://cx.tiancebbs.cn/qths/464743.html https://zulin.tiancebbs.cn/sh/1882.html https://shundequ.tiancebbs.cn/qths/458742.html

3# __ xiaowu 回答于 2024-04-24 10:37:09+08
跳蚤市场口号:https://www.nanss.com/yulu/19192.html 领导干部述廉报告:https://www.nanss.com/gongzuo/19129.html 送元二使安西诗意:https://www.nanss.com/xuexi/19470.html 装修合同书:https://www.nanss.com/gongzuo/18786.html 暂停营业通知:https://www.nanss.com/gongzuo/18644.html 鱼香肉丝的家常做法:https://www.nanss.com/yinshi/19849.html 月亮是什么星:https://www.nanss.com/shenghuo/18552.html 临床试验方案:https://www.nanss.com/gongzuo/18868.html 普通话的由来:https://www.nanss.com/shenghuo/18444.html 孙膑怎么死的:https://www.nanss.com/wenti/18337.html 水玻璃是什么:https://www.nanss.com/wenti/19027.html 巴西的首都是哪里:https://www.nanss.com/wenti/18238.html 冰心原名是什么:https://www.nanss.com/shenghuo/19050.html 桂花泡水喝有什么作用与功效:https://www.nanss.com/wenti/19510.html 小学教师专业发展规划:https://www.nanss.com/gongzuo/19072.html 论文提纲格式:https://www.nanss.com/xuexi/18602.html 文艺委员竞选稿:https://www.nanss.com/xuexi/19357.html 词牌名大全:https://www.nanss.com/xuexi/18452.html 远大前程读后感:https://www.nanss.com/xuexi/19643.html 杜牧是哪个朝代的诗人:https://www.nanss.com/shenghuo/18532.html 珠穆朗玛峰有多高:https://www.nanss.com/wenti/19796.html 知了的营养价值和功效:https://www.nanss.com/yinshi/19503.html 梦见给人剪头发:https://www.nanss.com/xingzuo/19756.html 四字词语大全:https://www.nanss.com/xuexi/18577.html 问卷调查报告:https://www.nanss.com/xuexi/18865.html 地球属于什么星:https://www.nanss.com/shenghuo/18528.html 重阳节的由来简介:https://www.nanss.com/shenghuo/18255.html 拔河比赛新闻稿:https://www.nanss.com/xuexi/18697.html 炖鱼多长时间:https://www.nanss.com/yinshi/19541.html 以青春为话题作文:https://www.nanss.com/xuexi/18632.html



发表评论:
加入我们
QQ群1:5276420
QQ群2:3336901
QQ群3:254622631
文档群:150657323
文档翻译平台:按此访问
社区邮件列表:按此订阅
扫码关注
© PostgreSQL中文社区 ... (自2010年起)