关于Docker的基本原理
原理上, 深入浅出Docker 一文讲的语言会更科学,我只捡不一定准确但直观而符合表面理解的一些讲一下。
Docker提供了基于操作系统级和应用级虚拟化的应用部署解决方案。它的出现让在服务器上部署应用免去了操作系统,支持系统等一系列的搭建,而把它们简化为镜像,容器,实现快速部署。
Docker将应用所需要的底层系统支持,操作系统支持,数据库支持,应用本身和应用的数据分离开来,可以从任意层级上在一个拥有docker技术的电脑上对应用进行部署。每一层被抽象成了镜像(image),而镜像跑在服务器上便成了容器(container),相当于虚拟机。跑起一个应用级别的容器,会自动获取它所需要的向下级别的镜像。这些都可以通过云端大量现成的资源和几行脚本命令实现。
Docker解决了服务器应用快速部署的问题。仅需要一个dockerfile或是一两行命令,便可以将一个应用部署到服务器上并立刻投入使用。存在的问题也有一些,比如数据层迁移的命令蹩脚,容器启动后不能重新端口绑定,目前只能跑在linux上等。还有许多有待我这个刚入手没多久的小白还要探索的问题。
安装docker
在正题之前,你需要:
安装docker
确定docker镜像服务器已经跑在你的服务器上
两点其实是一点,但是两者各有侧重。笔者在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。否则也会提示找不到。
在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也经常被设计成只读的,作为应用程序的初始状态。其实这么复制挺麻烦的,还需要新建一个数据卷。向上面那个例子里,“家里的电脑”其实没用。教程里甚至提供了即时创建并删除容器的命令只为保存一个数据卷和容器名称的对应关系,日后挂载方便。