Docker 前几年席卷了整个互联网,Docker 在互联网很多业务场景都有使用。最近一两年,一些传统行业也在尝试使用,并且看到不少案例。另外,我们一直担心,容器影响数据库的性能,根据近些年的亲身实践,容器对数据库性能的影响很小,也不会影响数据库的并行性。因此,想写一系列文章,简单介绍 PostgreSQL 在容器中的实践。
Docker 基本概念
什么是 Docker
Docker 是一个软件平台,让您可以快速构建、测试和部署应用程序。Docker 将软件打包成名为容器的标准化单元,这些单元具有运行软件所需的所有功能,包括库、系统工具、代码和运行时。使用 Docker,您可以将应用程序快速部署和扩展到任何环境中,并且知道您的代码将运行。
Docker 镜像
Docker 镜像是定义容器的只读模板。该镜像包含将运行的代码,包括这些代码需要的任何库和依赖关系的所有定义。
Docker 容器
Docker 镜像一旦实例化,就变成了容器。容器是正在运行的。
Docker 和虚拟机的区别
两者的区别主要是下面两点:
多个 Docker 可以共享操作系统内核,而虚拟机不行。
虚拟机更加耗费资源
内核要求
Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看 CentOS 版本是否支持。
[root@tar1 ~]# uname -r
3.10.0-957.el7.x86_64
[root@tar1 ~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
更新软件包
[root@tar1 ~]# yum -y update
Determining fastest mirrors
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
base | 3.6 kB 00:00:00
---> 软件包 kernel-devel.x86_64.0.3.10.0-957.27.2.el7 将被 安装
---> 软件包 kernel-headers.x86_64.0.3.10.0-957.el7 将被 升级
---> 软件包 kernel-headers.x86_64.0.3.10.0-957.27.2.el7 将被 更新
---> 软件包 kernel-tools.x86_64.0.3.10.0-957.el7 将被 升级
---> 软件包 kernel-tools.x86_64.0.3.10.0-957.27.2.el7 将被 更新
---> 软件包 kernel-tools-libs.x86_64.0.3.10.0-957.el7 将被 升级
---> 软件包 kernel-tools-libs.x86_64.0.3.10.0-957.27.2.el7 将被 更新
---> 软件包 kexec-tools.x86_64.0.2.0.15-21.el7 将被 升级
---> 软件包 kexec-tools.x86_64.0.2.0.15-21.el7_6.4 将被 更新
---> 软件包 krb5-devel.x86_64.0.1.15.1-34.el7 将被 升级
---> 软件包 krb5-devel.x86_64.0.1.15.1-37.el7_6 将被 更新
---> 软件包 krb5-libs.x86_64.0.1.15.1-34.el7 将被 升级
---> 软件包 krb5-libs.x86_64.0.1.15.1-37.el7_6 将被 更新
---> 软件包 krb5-workstation.x86_64.0.1.15.1-34.el7 将被 升级
---> 软件包 krb5-workstation.x86_64.0.1.15.1-37.el7_6 将被 更新
---> 软件包 libatomic.x86_64.0.4.8.5-36.el7 将被 升级
---> 软件包 libatomic.x86_64.0.4.8.5-36.el7_6.2 将被 更新
创建仓库
[root@tar1 ~]# cat /etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
[root@tar1 ~]#
清理 yum 缓存
[root@tar1 ~]# yum clean all
已加载插件:fastestmirror, langpacks
正在清理软件源: base dockerrepo extras pgdg10 pgdg11 pgdg94 pgdg95 pgdg96 updates
Cleaning up list of fastest mirrors
[root@tar1 ~]#
缓存 yum 仓库
[root@tar1 ~]# yum makecache
已加载插件:fastestmirror, langpacks
Determining fastest mirrors
* base: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.huaweicloud.com
* updates: mirrors.huaweicloud.com
base | 3.6 kB 00:00:00
dockerrepo | 2.9 kB 00:00:00
extras | 3.4 kB 00:00:00
pgdg10 | 3.6 kB 00:00:00
pgdg11 | 3.6 kB 00:00:00
安装 Docker 包
[root@tar1 ~]# yum install -y docker-engine
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.huaweicloud.com
* updates: mirrors.huaweicloud.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 docker-engine.x86_64.0.17.05.0.ce-1.el7.centos 将被 安装
--> 正在处理依赖关系 docker-engine-selinux >= 17.05.0.ce-1.el7.centos,它被软件包 docker-engine-17.05.0.ce-1.el7.centos.x86_64 需要
--> 正在检查事务
---> 软件包 docker-engine-selinux.noarch.0.17.05.0.ce-1.el7.centos 将被 安装
--> 解决依赖关系完成
依赖关系解决
====================================================================
Package 架构 版本 源 大小
====================================================================正在安装:
docker-engine x86_64 17.05.0.ce-1.el7.centos dockerrepo 19 M
为依赖而安装:
docker-engine-selinux noarch 17.05.0.ce-1.el7.centos dockerrepo 28 k
事务概要
====================================================================
安装 1 软件包 (+1 依赖软件包)
总下载量:20 M
安装大小:70 M
Downloading packages:
警告:/var/cache/yum/x86_64/7/dockerrepo/packages/docker-engine-selinux-17.05.0.ce-1.el7.centos.noarch.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID 2c52609d: NOKEY
docker-engine-selinux-17.05.0.ce-1.el7.centos.noarch.rpm 的公钥尚未安装
(1/2): docker-engine-selinux-17.05.0.ce-1.el7.centos.noarch.rpm | 28 kB 00:00:01
(2/2): docker-engine-17.05.0.ce-1.el7.centos.x86_64.rpm | 19 MB 00:00:09
--------------------------------------------------------------------
总计 2.0 MB/s | 20 MB 00:00:10
从 https://yum.dockerproject.org/gpg 检索密钥
导入 GPG key 0x2C52609D:
用户ID : "Docker Release Tool (releasedocker) <docker@docker.com>"
指纹 : 5811 8e89 f3a9 1289 7c07 0adb f762 2157 2c52 609d
来自 : https://yum.dockerproject.org/gpg
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : docker-engine-selinux-17.05.0.ce-1.el7.centos.noarch 1/2
Re-declaration of type docker_t
Failed to create node
Bad type declaration at /etc/selinux/targeted/tmp/modules/400/docker/cil:1
/usr/sbin/semodule: Failed!
restorecon: lstat(/var/lib/docker) failed: No such file or directory
warning: %post(docker-engine-selinux-17.05.0.ce-1.el7.centos.noarch) scriptlet failed, exit status 255
Non-fatal POSTIN scriptlet failure in rpm package docker-engine-selinux-17.05.0.ce-1.el7.centos.noarch
正在安装 : docker-engine-17.05.0.ce-1.el7.centos.x86_64 2/2
验证中 : docker-engine-17.05.0.ce-1.el7.centos.x86_64 1/2
验证中 : docker-engine-selinux-17.05.0.ce-1.el7.centos.noarch 2/2
已安装:
docker-engine.x86_64 0:17.05.0.ce-1.el7.centos
作为依赖被安装:
docker-engine-selinux.noarch 0:17.05.0.ce-1.el7.centos
启动 Docker 服务
启动 Docker 服务
[root@tar1 ~]# systemctl start docker.service
验证 Docker 是否已经启动
[root@tar1 ~]# systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since 三 2019-08-21 11:31:44 CST; 1min 5s ago
Docs: https://docs.docker.com
Main PID: 21109 (dockerd)
Tasks: 17
Memory: 58.9M
CGroup: /system.slice/docker.service
├─21109 /usr/bin/dockerd
└─21116 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 -...
8月 21 11:31:43 tar1 dockerd[21109]: time="2019-08-21T11:31:43.985321498+08:00" level=info msg="Loading containers: start."
8月 21 11:31:44 tar1 dockerd[21109]: time="2019-08-21T11:31:44.299547028+08:00" level=info msg="Default bridge (doc...dress"
8月 21 11:31:44 tar1 dockerd[21109]: time="2019-08-21T11:31:44.536150388+08:00" level=info msg="Loading containers: done."
8月 21 11:31:44 tar1 dockerd[21109]: time="2019-08-21T11:31:44.611884624+08:00" level=info msg="Daemon has complete...ation"
8月 21 11:31:44 tar1 dockerd[21109]: time="2019-08-21T11:31:44.611917359+08:00" level=info msg="Docker daemon" comm...5.0-ce
8月 21 11:31:44 tar1 dockerd[21109]: time="2019-08-21T11:31:44.626618666+08:00" level=info msg="API listen on /var/....sock"
8月 21 11:31:44 tar1 systemd[1]: Started Docker Application Container Engine.
8月 21 11:32:34 tar1 dockerd[21109]: time="2019-08-21T11:32:34.826419224+08:00" level=warning msg="Error getting v2...ders)"
8月 21 11:32:34 tar1 dockerd[21109]: time="2019-08-21T11:32:34.827115930+08:00" level=info msg="Attempting next end...ders)"
8月 21 11:32:34 tar1 dockerd[21109]: time="2019-08-21T11:32:34.827176510+08:00" level=error msg="Handler for POST /...ders)"
Hint: Some lines were ellipsized, use -l to show in full.
看到“running”字样,表示启动成功。
验证 docker 是否成功安装
[root@tar1 yum.repos.d]# docker run hello-world
WARNING: IPv4 forwarding is disabled. Networking will not work.
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
查看 docker 其他基本信息
查看版本信息
[root@tar1 ~]# docker version
Client:
Version: 17.05.0-ce
API version: 1.29
Go version: go1.7.5
Git commit: 89658be
Built: Thu May 4 22:06:25 2017
OS/Arch: linux/amd64
Server:
Version: 17.05.0-ce
API version: 1.29 (minimum version 1.12)
Go version: go1.7.5
Git commit: 89658be
Built: Thu May 4 22:06:25 2017
OS/Arch: linux/amd64
Experimental: false
查看其他信息
[root@tar1 ~]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 17.05.0-ce
Storage Driver: overlay
Backing Filesystem: xfs
Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9048e5e50717ea4497b757314bad98ea3763c145
runc version: 9c2d8d184e5da67c95d601382adf14862e4f2228
init version: 949e6fa
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-957.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 991.2MiB
Name: tar1
ID: BBHS:KT7X:XGDO:ZRYJ:O6CH:GVW5:DLQR:TLRJ:JOCV:2XXH:Y5K7:MTBO
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Docker 的启动和关闭
docker stop pg11
docker start pg11
pg11 是 docker 的名字。
总结
一开始可能很难理解容器化相关概念,您只需尝试安装使用,概念便逐渐清楚了。
作者介绍:
赵振平,PostgreSQL 中文社区主席、计算机畅销书作家、贵州省省管专家、太阳塔科技 CTO、国家首批大数据高级职称、腾讯最具价值专家(TVP)、电子工业出版社签约作家、出版了技术专著《Oracle 数据库精讲与疑难解析》、出版了技术专著《成功之路:Oracle 11g 学习笔记》、出版了技术专著《IT 架构实录》。
更多内容推荐
实战题目解析:盛水最多的容器、爬楼梯
2022-09-30
01|如何将业务代码构建为容器镜像?
这节课,我会带你从 0 开始认识作为云原生基石的容器镜像,让你在实践中理解镜像和容器的概念,也在这个过程中构建你的第一个容器镜像。
2022-12-12
GreatSQL 社区月报 | 2023.04
GreatSQL 是一个开源的 MySQL 技术路线数据库社区,社区致力于通过开放的社区合作,构建国内自主 MySQL 版本及开源数据库技术,推动中国开源数据库及应用生态繁荣发展。
2023-05-12
中秋加餐|《商业思维案例笔记》推荐书单
除了我们身边发生的这些鲜活的案例,我想你也一定希望学习更多相关的商业知识,拓展认知。所以,我特地为你准备了这篇加餐,从启蒙、思路、创新、颠覆、底层这5个维度,给你推荐几本我看过的书籍。
2022-09-09
Navicat Premium 15 for Mac(数据库开发软件)v15.0.30 中文版
Navicat Premium 15 mac是一款数据库开发工具,Navicat Premium 15 Mac版可以让你以单一程序同時连接到 MySQL、MariaDB、SQL Server、SQLite、Oracle 和 PostgreSQL 数据库。
2023-09-06
Spring Boot 如何使用 Undertow 容器?超级详细,建议收藏
一文教你学会Spring Boot使用Undertow容器?超级详细,建议收藏
2023-04-21
500 行代码手写 docker- 实现硬件资源限制 cgroups
本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。
2023-05-30
500 行代码手写 docker- 以新命名空间运行程序
本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。
2023-05-25
After Returning Advice Schema-based 实现 - <aop:after-returning/>
2021-03-18
Spring AOP Advice 类型:Spring AOP 丰富了哪些 AOP Advice 呢?
2020-12-17
500 代码行代码手写 docker- 设置网络命名空间
本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。
2023-05-29
Node.js 安全专题:Node.js 安全开发技术
2020-10-29
墨天轮 2022 年度数据库获奖名单
总结过往,展望未来,墨天轮以38个客观中立的指标进行遴选,评选出2022年的中国数据库重要奖项,点击查看具体获奖名单!
2023-03-01
500 行代码代码手写 docker- 将 rootfs 设置为只读镜像
本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。
2023-05-26
MatrixOne 入选艾瑞数据库研究报告啦~
近期,艾瑞咨询正式发布《2022中国数据库研究报告》。据艾瑞统计,2021年中国数据库市场总规模达286.8亿元,同比增长16.1%。
2023-01-17
针对容器层的五种攻击手段
对容器应用的安全攻击有多种形式,大概有以下五种攻击手段。
2023-05-03
GreatSQL 社区月报 | 2023.03
GreatSQL 是一个开源的 MySQL 技术路线数据库社区,社区致力于通过开放的社区合作,构建国内自主 MySQL 版本及开源数据库技术,推动中国开源数据库及应用生态繁荣发展。
2023-04-10
Nodejs+Redis 实现简易消息队列
消息队列是存储数据的一个中间件,可以理解为一个容器。生产者生产消息投递 到队列中,消费者可以拉取消息进行消费,如果消费者目前没有消费的打算,则消息队列会保留消息,直到消费者有消费的打算。
2023-02-27
精彩回顾|【ACDU 中国行·杭州站】数据库主题交流活动成功举办!
8月19日下午,【ACDU 中国行·杭州站】在杭州西溪万怡酒店圆满落下帷幕。六位数据库行业领军人物聚焦数据库技术的核心要素、数据库降本增效、智能运维等热门话题展开了精彩的分享。
2023-08-23
推荐阅读
中国数据库前世今生第 5 集:2020 年代 / 国产数据库“百团大战”
4 大焕新,华为云 CCE 带你感受容器化上云体验
2023-10-12
2、Spring Security 核心原理解析
2023-09-27
中国数据库前世今生第 3 集:2000 年代 / 数据库分型及国产数据库开端
中国数据库前世今生第 1 集:1980 年代 / 起步
13. INSERT:MySQL UPSERT 基本实现
2023-09-26
11. 结构型 - 组合模式 Compose
2023-02-15
电子书
大厂实战PPT下载
换一换 陆树燊 | 行者慎思科技 创始人兼 CEO
马腾 | 微软(中国)有限公司 全渠道事业部架构师团队/资深云解决方案架构师
张登 | 前圆通 科技架构负责人
评论