2011年刚开始上班的时候,常驻客户现场。当时项目组采用的架构是小型机+WebLogic+Oracle。开发运维泾渭分明、各司其职。 生产环境的密码,项目经理和运维经理各执一半。正常情况下,运维团队定期过来维护,大致是“一月一小维、三月一大维”。数据库厂商也要负责维护数据库,他们还定期过来给开发人员开课,讲解数据库知识。我这种开发小啰啰,连测试环境几乎都不能动,生产环境就看都看不到了。
在安全、稳定是第一要务,在几年才出一个新版本的情况下,在不差钱的大客户那里,小型机+WebLogic+Oracle是不错的选择。开发人员多轻松啊,你写你的代码就行,什么都不用操心。
但这种好日子一去不复返了。时代的潮流是“去ioe”,实际上2011年的时候云计算已经风风火火。
我在2014年为了搞测试环境,利用ESXi直接在硬件上装虚拟机。后来换了东家,也在用ESXi。一台服务器,摇身一变十来台服务器,把它们当成测试环境,一个开发组分几台。基本上还可以用。但是大家都不满意。太慢了。每个组的人都想多分一点儿内存给他们的虚拟机。
Docker诞生于2013年。Docker的构想是要实现“Build,Ship and Run Any App,Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的“一次封装,到处运行”。
Docker早已大行其道。我大致是2016年听说Docker。一直没有时间去学,在deadline的压力下,我骑着个自行车奋力前行,再怎么卖力也跑不赢汽车(全是给自己找借口啊)。相反,那些轻松一点儿公司,给时间去学习新技术,就可能找到更好的解决方案,工作效率和最终效果反而好很多,看似增加了成本实则节约了成本。
直到现在,才真正静下心来,看了一本关于docker的书《Docker 从入门到实践》,我是当当云阅读看的。这是一本好书。而且好心的作者开源了部分内容https://vuepress.mirror.docker-practice.com/。
常言道:“光说不练假把式”。光看是不行的,得练练手。于是乎,我把我的个人博客https://www.ningsoft.com/ 容器化了。具体怎么做的呢?在centos8中,把 nginx、redis、mysql和两个web应用,全部用容器运行。就这么点儿操作,竟然就花了三四天时间。
运行了第一个容器,马上就进去看看,结果发现好多命令都不能用。我就想知道它是什么操作系统,我想把命令装上。折腾了一下,才明白容器不是虚拟机。
虚拟机先需要虚拟一个物理环境,然后构建一个完整的操作系统,再搭建一层Runtime,然后供应用程序运行。
“对于容器环境来说,不需要安装主机操作系统,直接将容器层(比如LXC或libcontainer)安装在主机操作系统之上。在安装完容器层之后,就可以从系统可用计算资源当中分配容器实例了,并且企业应用可以被部署在容器当中。但是,每个容器化应用都会共享相同的操作系统(单个主机操作系统)。容器可以看成一个装好了一组特定应用的虚拟机,它直接利用了宿主机的内核,抽象层比虚拟机更少,更加轻量化,启动速度极快。”
初学Docker,看到网上的教程,启动容器的时候一般会加参数-rm,容器一退出马上就把容器删掉。我很纳闷,为什么要删掉,容器里的数据怎么办呢?直到看到《Docker 从入门到实践》中的这段话:
“按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。”
“数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。”
我在运行nginx容器时,采用的“绑定宿主目录”的方式。如下所示:
docker container run -d --rm -p 80:80 -p 443:443 --name mynginx -v /data/nginx/log:/var/log/nginx -v /data/nginx/conf:/etc/nginx/conf\.d -v /data/nginx/cert:/etc/nginx/cert nginx
Nginx容器中配置的upstream是另一个web容器的访问地址,刚开始我这样配:
upstream blog {
server 127.0.0.1:8443 max_fails=3 fail_timeout=10s;
}
这样是不行的,127.0.0.1是当前容器而不是宿主机。应该用172.17.0.1,这个才是宿主机的地址。
我参考这篇文章开启docker远程连接:https://www.jianshu.com/p/0bd482bd6012
参考这篇文章在idea中安装docker插件:https://www.jianshu.com/p/6ce91051d24c
但这样连太危险了,连mysql的密码都看得到。
可以参考《idea使用证书链接docker》:https://blog.csdn.net/oceanyang520/article/details/1015633099
Docker Compose、Swarm、Kubernetes这些当然要学。但毕竟闭关时间有限。我想,我还是专注于面向对象的分析与设计,学好怎么做一个信息管理系统吧。大数据、云计算、人工智能这些,太难了。但是还是要了解一下。于是,我买了一本华东师大出版社的《人工智能基础(高中版)》。如果不学,我觉得自己很快就会连高中生都不如。据报道外国已经发明出了砌墙机器人,我们以后可能想在工地上当个搬砖工人,老板都不要了。
参考资料:
杨保华 戴王剑 曹亚伦 《Docker 从入门到实践》
rkit https://www.cnblogs.com/rkit/p/9237696.html
-----------------------------------------------------------------------------------------
我的公众号:永宁河(peace_river)