从开发到部署——docker浅体验
听说docker很diao?我们来调戏一下它吧~
到底什么是docker呢?
如果github做的是代码管理的工作,那么docker做的就是环境管理的工作。
Docker是一种虚拟化技术,下面是docker和虚拟机的的差别(右边是docker)
对比虚拟机与Docker
“Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源”(百度的)
好的好的,道理我都懂,但是他能帮我解决什么问题呢?
使用前:每次拿到新的linux服务器就是配置环境,安装依赖,代码部署,就很烦!
使用后:不管什么linux服务器,sudo docker pull your-image搞定一切,一劳永逸!
哇那不就很棒棒啊?
接下来就是带大家走一遍流程啦,教大家怎么基于一个已有的lamp镜像建立一个自己的镜像并且发布
前期准备:
1.操作系统:window 10
2.安装docker并且注册docker帐号 官网:http://www.docker.com
3.一个实验项目(这边用一个之前写的辣鸡mvc)https://github.com/kingkun233/KinPHP
4.一个ubuntu虚拟机(用作服务器)
开始之前要讲三样东西
1.镜像
2.容器
3.仓库
这三样是我们在使用容器是最常接触到的东东;
上面这张图是三者之间的关系,看不懂不要紧,打个比方,用面向对象来理解的话,镜像就是类,容器就是对象,仓库就类似于github,这里是dockerhub。这样应该好理解很多吧!通过下面的实践相信会加深你们的理解。
第一步:
在docker官网注册帐号
第二步:
下载docker并且安装
安装成功后会有这两个图标
打开下面那个出现下图就说明安装成功了
第三步:
拉取别人已经做好的lamp环境,这里推荐tutum做的lamp镜像
查看你本地有哪些镜像
第五步:根据镜像建立容器
查看正在运行的容器
第六步:在浏览器测试
在终端的开始的地方会有ip地址(这个针对window开发用的,ubuntu的话就直接回环测试)
如果出现如下界面说明容器正常运行啦~~
唉?怎么把项目代码放到容器里面啊?其实也很简单
在建立容器的时候加上 -v /c/Users/Kingkun/project/KinPHP:/app/KinPHP,其中冒号前面的是本地地址,后者是容器里面的地址,这样就把本地代码目录和容器目录挂载在一起了。(注意,在window下只能挂c盘不能挂d盘)
挂载之后我们来测试一下
唉?有个sql报错?原来是容器里的mysql刚刚新鲜出炉,还没有密码。
第七步:进入容器给mysql设置密码
用exec命令就可以调出终端啦~
Tutum/lamp镜像的linux用的是ubuntu14.04,但是已经把用户默认设为root了,所以命令都不用加sudo了~
默认mysql的root账户的不用密码登录的
进入mysql:
修改mysql的root密码
这样就修改好了
下面是我项目的数据库连接设置
再来看看
提示没有kinPHP数据库,说明已经连接上了,只是现在的mysql so fresh,没有数据库,好我们就给他加一个
再看
successed
第八步:安装phpmyadmin
常规的apt-get update走一下
apt-get install phpmyadmin
ln -s /usr/shared/phpmyadmin /var/www/html(软连接去网站根目录)
看一下
successed
第九步:发布镜像(包含phpmyadmin的镜像)
先登录docker账户
根据容器构建镜像
看到commit是不是想到什么啊
没错,和github非常像
然后发布到dockerhub仓库
在dockerhub上面看看
successed
第10步:在服务端拉取自己的镜像进行测试
这里用虚拟机做服务器
查看ip地址
Ubuntu上安装docker也是很简单,apt-get update&&apt-get install docker.io
首先拉取我们已经做好的镜像
然后把github上的项目拉下来
根据镜像创建容器并且和clone下来的项目目录进行挂载
用本地浏览器测试
phpmyadmin也有了,这是在tutum/lamp没有的,也就是说我们配置的环境上传成功了
再来看看项目KinPHP是否能运行
黑人问号.jpg?发现我们mysql的root是没有密码的,可是我们刚刚不是在本地已经配置了吗?百度到的答案如下
还是举个面向对象的例子,文章上面说过,镜像就像是一个类,你可以为这个类添加一属性(例如phpmyadmin),但是这个属性的值是不会添加到类里面的!由于服务器端的容器是一个“新的对象”,所以mysql现在是全新的,我们设置root密码和添加数据库的操作都没掉了(个人理解,欢迎指正)。那有没有解决的方法呢?问题总是能解决的。
方法一:再次设置密码和添加数据库;
方法二:如上面回答,与本地目录进行挂载;
方法三:写shell(这个的话感兴趣的可以去看一下dockerfile,是除了commit之外另外一种非常灵活的构建镜像的方法,这里就不细说);
我用的是第一种方法,因为懒。。。
好的,当我再次配置好了mysql密码和建立好数据库之后再看看
这样我们就走了一遍用docker从本地开发到远端部署的过程了
思考:我们是不是真的需要docker?
Docker真的能提高我们的工作效率吗?我觉得要看情况,如果是一个小项目的话,用docker的必要并不大,毕竟学习成本就放在这里;不过如果是大型项目(以后会不断扩展功能和强调性能),docker就很棒棒了。至于更加深入的东西就要你们自己探索啦,毕竟我看了两三天而已,溜了溜了