欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

tyro系列之六:初学Docker

程序员文章站 2022-03-30 10:19:37
玩法不一样了 2011年刚开始上班的时候,常驻客户现场。当时项目组采用的架构是小型机+WebLogic+Oracle。开发运维泾渭分明、各司其职。 生产环境的密码,项目经理和运维经理各执一半。正常情况下,运维团队定期过来维护,大致是“一月一小维、三月一大维”。数据库厂商也要负责维护数据库,他们还定期过来给开发人员开课,讲解数据库知识。我这种开发小啰啰,连测试环境几乎都不能动,生产环境就看都看不到了。 在安全、稳定是第一要务,在几年才出一个新版本的情况下,在不差钱的大客户那里,小型机+We......

玩法不一样了

    2011年刚开始上班的时候,常驻客户现场。当时项目组采用的架构是小型机+WebLogic+Oracle。开发运维泾渭分明、各司其职。 生产环境的密码,项目经理和运维经理各执一半。正常情况下,运维团队定期过来维护,大致是“一月一小维、三月一大维”。数据库厂商也要负责维护数据库,他们还定期过来给开发人员开课,讲解数据库知识。我这种开发小啰啰,连测试环境几乎都不能动,生产环境就看都看不到了。

    在安全、稳定是第一要务,在几年才出一个新版本的情况下,在不差钱的大客户那里,小型机+WebLogic+Oracle是不错的选择。开发人员多轻松啊,你写你的代码就行,什么都不用操心。

但这种好日子一去不复返了。时代的潮流是“去ioe”,实际上2011年的时候云计算已经风风火火。

虚拟机

我在2014年为了搞测试环境,利用ESXi直接在硬件上装虚拟机。后来换了东家,也在用ESXi一台服务器,摇身一变十来台服务器,把它们当成测试环境,一个开发组分几台。基本上还可以用。但是大家都不满意。太慢了。每个组的人都想多分一点儿内存给他们的虚拟机。

Docker横空出世

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 开启远程连接

我参考这篇文章开启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)

tyro系列之六:初学Docker

本文地址:https://blog.csdn.net/w90/article/details/107178963