使用docker部署PostgreSQL数据库

关于Docker的基本原理

原理上, 深刻浅出Docker 一文讲的语言会更科学,我只捡不必定准确但直观而符合表面理解的一些讲一下。linux

Docker提供了基于操做系统级和应用级虚拟化的应用部署解决方案。它的出现让在服务器上部署应用免去了操做系统,支持系统等一系列的搭建,而把它们简化为镜像,容器,实现快速部署。git

Docker将应用所须要的底层系统支持,操做系统支持,数据库支持,应用自己和应用的数据分离开来,能够从任意层级上在一个拥有docker技术的电脑上对应用进行部署。每一层被抽象成了镜像(image),而镜像跑在服务器上便成了容器(container),至关于虚拟机。跑起一个应用级别的容器,会自动获取它所须要的向下级别的镜像。这些均可以经过云端大量现成的资源和几行脚本命令实现。github

Docker解决了服务器应用快速部署的问题。仅须要一个dockerfile或是一两行命令,即可以将一个应用部署到服务器上并马上投入使用。存在的问题也有一些,好比数据层迁移的命令蹩脚,容器启动后不能从新端口绑定,目前只能跑在linux上等。还有许多有待我这个刚入手没多久的小白还要探索的问题。sql

安装docker

在正题以前,你须要:docker

  • 安装docker数据库

  • 肯定docker镜像服务器已经跑在你的服务器上windows

两点实际上是一点,可是二者各有侧重。笔者在mac上安装docker时,下载了官网提供的docker toolbox。安装了docker服务器自己,快速启动命令以及Virtualbox来管理虚拟机。在安装Virtualbox的时候安装程序挂了。至今不知为什么。解决方案是本身装一个服务器

brew install Caskroom/cask/virtualbox

第二点,确保docker镜像服务器跑起来。在mac下须要运行quickstart,你会注意到它其实就是启动一个脚本,让linux虚拟机的服务器能够经过虚拟网络被mac访问到。若是直接打开命令行,会提示网络

Cannot connect to the Docker daemon. Is the docker daemon running on this host?

在linux上,docker指令必须sudo。不然也会提示找不到。app

在mac上或者windows上尤为注意一点。docker服务器跑在linux虚拟机上。因此后续牵扯到目录挂载的时候最好能够直接进入虚拟机写指令。

如何快速部署数据库

在docker上快速部署Postgresql数据库,其实能够直接参考https://hub.docker.com/_/postgres/,这里提供了docker-postgres的官方解决方案。
其实核心只有一句话。

docker run --name yourappname -e POSTGRES_PASSWORD=mysecretpassword -e POSTGRES_USER=xxx -d -p xxxx:5432 postgres

其中的-p 的意思是端口绑定。这是docker里很重要的概念。docker能够理解为虚拟机。你须要将真机的端口和虚拟机端口进行绑定,这样能够经过访问docker镜像服务器在真机上的端口,访问到psql数据库端口5432,进入docker镜像之中。若是不指定-p,外界是没法访问docker内部,没法对数据库增删改查。

这时服务器会新建一个卷目录用来存放真正的数据库内容。换句话说,这个卷是只读的,经过容器备份提交什么的根本没法保留数据库数据,甚至是表的结构。这个时候就须要介绍一个docker的新概念:数据卷。相似于linux挂载的概念。

具体能够参考https://github.com/widuu/chinese_docker/blob/master/userguide/dockervolumes.md

这里只说怎么快速部署。

第一步:在任意机子上创建一个镜像,指定数据卷位置,并将其挂载到虚拟机上

docker run --name yourappname -e POSTGRES_PASSWORD=xxx -e POSTGRES_USER=xxx\
    -v ./data:/var/lib/postgresql/data/pgdata -d -p xxxx:5432 postgres

多的这一句

-v ./data:/var/lib/postgresql/data/pgdata

意思是:讲本机当前目录下新建一个data目录,与虚拟机里的数据库目录对应起来。注意这里必须是linux下的目录。若是在mac或者windows上操做务必注意。若是你把mac/windows目录映射到了“虚拟机的虚拟机”里,会由于访问权限不足而让docker崩掉。

第二步:按照你指定的端口访问数据库,作数据初始化。包括建表和插入初始数据。

第三步:备份数据卷。也就是上面的./data目录。

第四步,将这个数据卷放到你的服务器上

第五步和第一步同样。可是此时,你的数据卷里面已经有以前保存的内容了。

让我来通俗地阐释一下这个过程。其实至关于你在家里电脑插个空U盘,放点歌在里面,而后带到单位去就能够听了。家里的电脑和单位的电脑都是WindowsXP的系统,都装了什么音乐播放器,可是歌曲必定是放在优盘里,由于电脑是只读的。

相似。docker也常常被设计成只读的,做为应用程序的初始状态。其实这么复制挺麻烦的,还须要新建一个数据卷。向上面那个例子里,“家里的电脑”其实没用。教程里甚至提供了即时建立并删除容器的命令只为保存一个数据卷和容器名称的对应关系,往后挂载方便。

docker的最佳实践

dockerfile最佳实践

相关文章
相关标签/搜索