抽象在计算机科学中非常重要。抽象使得编写一个大型程序成为可能,将其划分为小而且容易理解的部分,用 C 这样的高级语言编写程序不用考虑汇编,用汇编写代码不用考虑逻辑门,用逻辑门来构建处理器不用太多考虑晶体管。
Docker是对应用及其运行环境依赖的抽象,Docker 主要改善了应用程序开发、部署和运行的流程,它使得应用程序能够在其他系统上轻松部署且可以完全控制运行环境。它将应用程序与系统虚拟化,使得可以有效地管理集群资源,实现资源的灵活分配。此外,它还可以有效地减少云环境中的资源管理成本、优化应用程序的部署效率以及加快应用程序的开发/测试周期。云原生时代的到来,开发人员必须紧跟技术趋势,是时候将自己的开发工作迁移在容器化的环境中了!
本文介绍Docker方式安装PostgreSQL数据库,之所以选择数据库作为案例,是因为Docker容器是无状态的,Docker容器从创建到删除的生命周期过程中,其产生的存储数据也会随之创建与删除,而针对数据库而言显然数据是必须要持久存在的,需要用到卷来实现存储的持久化。在开始实践之前需要您已安装好Docker环境,安装方法可参见windows系统下docker开发环境搭建文章中的步骤,下面就开始本章的内容吧。
拉取镜像
很多人写文档时会选择使用Word文档模板来创建自己的文档,而一旦建立好了完整的文档模板就不会随意地修改;在模板市场中,用户可以搜索到自己喜爱的模板,进而建立自己的文档。Docker镜像就相当于 Docker容器的模板,开发者可以通过这些Docker镜像来创建 Docker 容器,不同的Docker镜像就对应着不同的应用;Docker 镜像的官方市场是hub.docker.com,它汇集了大量公司和开发者制作的Docker镜像,供用户选择和下载使用,类似于软件市场。PostgreSQL是有官方镜像的,因此首先是使用docker pull命令从官方市场中拉取Docker镜像。
# 不指定具体版本的话,默认下载最新版镜像postgres:latest
docker pull postgres
镜像拉取成功后,可以通过docker image ls命令查看到存在名为postgres的镜像
从镜像运行容器
docker run --name postgres -e POSTGRES_PASSWORD=Abc1234% -p 5432:5432 -v /home/zx/postgres/data:/var/lib/postgresql/data -d postgres
- --name postgres:指定容器的名称;
- -e POSTGRES_PASSWORD=Abc1234%:设置环境变量,这里为设定PostgreSQL数据库的密码;
- -p 5432:5432:指定端口映射,前者为宿主机访问端口,后者为容器内端口。如果不指定端口映射,只有在容器内可以访问数据库,外部是无法访问的;
- -v /home/zx/postgres/data:/var/lib/postgresql/data:v是volume的简写,即绑定一个卷,冒号前的路径为宿主机的路径(如果指定路径不存在会自动创建目录),冒号后为容器内路径。容器会把宿主机的目录映射到容器内的路径,这样容器运行中生成的数据实际上就是写到了宿主机的指定路径上,即使容器删除了,此路径的文件也不会删除,这样就做到了数据库的持久化存储。还可以通过docker volume提供的相关命令显式地创建volume,然后再挂载到容器上,这里不做介绍,请自行查询相关内容;
- -d:表示后台运行容器;
- postgres:表示镜像的名称,docker基于上步拉取的镜像创建出容器;
查看容器信息
docker ps命令可以查看运行中的容器信息,容器运行成功可以发现存在名为postgres的容器,状态为Up
docker ps
"docker inspect 容器ID/容器名称"命令还可以查看容器的详情信息,因内容较长,这里未提供截图,可自行执行命令查看结果
docker inspect postgres
连接PostgreSQL数据库
接下来,我们来测试一下数据库能否正常连接
容器内连接数据库
docker exec -it postgres /bin/bash
- exec:在容器中运行命令
- postgres:为容器名称
- -it:表示在当前终端为容器分配一个伪终端
- /bin/bash:容器内运行/bin/bash终端
宿主机连接数据库
退出容器,这里使用支持PostgreSQL的可视化客户端,连接参数如下,测试可以正常连接数据库
小结
使用 Docker 安装 PostgreSQL 数据库可以节省安装和配置时间,并且可以很容易地将其从本地机器上搬到云上。它还提供了一个在多台服务器上构建可扩展应用的方法。建议在开始动手之前,先理解Docker中非常重要的镜像、容器、卷等概念,以及它们之间的关联,有了这些整体的认识之后再上手操作就能做到胸中自有丘壑,即使中途遇到问题也更容易梳理出关键点,快速找到解决问题的办法。
参考文献
- Docker Volumes: How to Create & Get Started (phoenixnap.com)
- docker安装postgresql_胡八一 的博客-CSDN博客
- 《深入浅出Docker》奈吉尔·波尔顿著;