共计 3125 个字符,预计需要花费 8 分钟才能阅读完成。
前言
只有光头才能变强。
文本已收录至我的 GitHub 仓库,欢迎 Star:https://github.com/ZhongFuCheng3y/3y
估计大家也可能听过 Docker 这项技术(在论坛上、招聘技能上、交流群上等等),要是不了解 Docker,都不好意思在网上冲浪的时候吹牛逼了。
所以这几天学了一下 Docker,总结了 Docker 入门的相关知识,分享给大家(好让我们一起吹牛逼)。
I need a doctor,call me a doctor. I need a doctor, doctor, to bring me back to life .
一、为什么需要 Docker
官方介绍(中文版):http://www.docker-cn.com/what-docker#/developers
Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。
1.1 环境 (切换 / 配置) 麻烦
一般我们写程序的,能接触到好几个环境:
自己写代码的环境叫做开发环境。
给测试去跑的环境叫做测试环境。
测试完可以对外使用的叫做生产环境。
其实我们在学习编程中,很多时间都浪费在“环境”上:
如果我现在重装了系统,我想要跑我的 war/jar 包,我得去安装一下 JDK、Tomcat、MySQL 等配置各种的环境变量才能跑起来。
开开心心地跟着博主给出的步骤去写 Demo,但总是有 Bug。(这里我将版本 / 依赖也归纳在环境的范畴里边)。
好不容易在测试环境下跑起来了,在生产环境就各种出错!
跟着教学视频做分布式 / 集群的项目,跑一堆的虚拟机,每个虚拟机都要安装对应的环境。
所以就有个笑话《千万不要跟程序员说,你的代码有 bug》:
他的第一反应是你的环境有问题,第二就是你是傻逼不会用吧。
你要跟他这么说:“这个程序运行的怎么运行的跟预期不一样,是我操作有问题吗?”。
这货就会第一反应“我擦,这是不是出 bug 了?”
1.2 应用之间需要隔离
比如我写了两个应用(网站),这两个应用部署在同一台服务器上,那可能会出现什么问题?
如果一个应用出现了问题,导致 CPU 占 100%。那另一个应用也会受到关联,跟着一起凉凉了。
这两个应用是完全不同技术栈的应用,比如一个 PHP,一个.NET。这两个应用各种的依赖软件都安装在同一个服务器上,可能就会造成各种冲突 / 无法兼容,这可能调试就非常麻烦了。
二、Docker 是如何解决上述的问题的
2.1 解决环境(切换 / 配置)
不知道大家有没有装过系统,比如说装 Linux 虚拟机,重装 Windows 系统,都是需要镜像的。
有了这个镜像,我们就可以运行这个镜像,来进行安装系统的操作(此处省略 N 个下一步),于是我们的系统就装好了。一般来说,我们去官方渠道下载的镜像,都是纯净的。比如去官方下载 Windows 镜像,装完后之后桌面只有一个回收站。
但有过了解装系统的同学可能就会知道,有的镜像装完可能还有 360 这些软件,但系统的的确确是变了。简单来说,就是这些镜像添加了其他的东西(比如 360 软件、腾讯、千千静听等等软件)。
Docker 也是这种思路,可以将我们的想要的环境构建 (打包) 成一个镜像,然后我们可以推送 (发布) 到网上去。想要用这个环境的时候,在网上拉取一份就好了。
有了 Docker,我们在搭环境的时候,跟以前的方式就不一样了。
之前:在开发环境构建出了一个 war 包,想跑到 Linux 下运行。我们得先在 Linux 下载好 Java、Tomcat、MySQL,配置好对应的环境变量,将 war 包丢到 Tomcat 的 webapps 文件夹下,才能跑起来。
现在:在 Linux 下直接拉取一份镜像(各种环境都配好了),将镜像运行起来,把 war 包丢进去就好了。
将 Docker 的镜像运行起来就是一两秒的事情而已,十分方便的。
2.2 解决应用之间隔离
说到这里,就得提出一个大家可能不认识的概念:LXC(Linux Containers)—>Linux 容器。
2.2.1Linux 容器
在 Linux 内核中,提供了 cgroups 功能,来达成资源的区隔化。它同时也提供了名称空间 (namespace) 区隔化的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括进程树,网络,用户 id,以及挂载的文件系统。
简单来说就是:LXC 是一个为 Linux 内核包含特征的用户接口。通过强大的 API 和简单的工具,它可以让 Linux 用户轻松的创建和托管系统或者应用程序容器。
2.2.2 回到 Docker
我们在翻看 Docker 的官方文档的时候,也很容易看见 cgroup 和 namespace 这两个名词:
来源维基百科:
Early versions of Docker used LXC as the container execution driver, though LXC was made optional in v0.9 and support was dropped in Docker v1.10.
lxc 是早期版本 docker 的一个基础组件,docker 主要用到了它对 Cgroup 和 Namespace 两个内核特性的控制。新的 Docker 版本已经移除了对 LXC 的 support。
2.2.3Docker 在 Windows 和 Mac
上面说了,Docker 底层用的 Linux 的 cgroup 和 namespace 这两项技术来实现应用隔离,那 Windows 和 Mac 用户能用 Docker 吗?
之前,Windows 和 Mac 使用 Docker 实际上就是跑了一层 Linux 虚拟机。
比如在 Windows 下安装的是 Docker Toolbox,它需要 Oracle Virtual Box 来跑 Docker
现在,Windows 和 Mac 都已经原生支持 Docker 了。但需要一些安装的条件,详情可以查看官网
比如 Windows:Docker for Windows requires 64bit Windows 10 Pro and Microsoft Hyper-V
参考资料:
Windows 原生 Docker 正式商用
http://blog.daocloud.io/windows-docker/
三、虚拟机和 Docker
说到应用隔离和镜像,我就想起了虚拟机。今年下半年(此处省略 …..),文体两开花(此处省略 …..),要是我写文章写得不好,我是需要向 XX 谢罪的。
估计大家都用过虚拟机,虚拟机也能实现对应用的隔离,安装特定的镜像也能跑出我们想要的环境。虚拟机已经发展了很久了,为什么我们还需要 Docker 呢?
这部分内容在官网也有相关的介绍:
http://www.docker-cn.com/what-container#/virtual_machines
一句话总结:Docker 容器比虚拟机轻量多了!
最后
Docker 可以干嘛?
将一整套环境打包封装成镜像,无需重复配置环境,解决环境带来的种种问题。
Docker 容器间是进程隔离的,谁也不会影响谁。
其实这篇文章主要是讲为什么我们需要 Docker(在学习一项技术之前,必须要知道这项技术是用来干嘛的),Docker 的一些概念和命令我还没介绍(留到下一篇啦)。如果还没看过【生活现场】从搬家到容器技术 docker 应用场景解析,可以先去看看~
我在学习 Docker 的时候也找到了不少的资源,想要获取 Docker 入门资源的同学可在公众号下回复“Docker”
乐于分享和输出干货的 Java 技术公众号:Java3y。关注即可领取海量的视频资源!
觉得我的文章写得不错,不妨点一下赞!