为什么需要Docker?
前言
只有光头才能变强。
文本已收录至我的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下安装的是
- 现在,Windows和Mac都已经原生支持Docker了。但需要一些安装的条件,详情可以查看官网
- 比如Windows:
Docker for Windows requires 64bit Windows 10 Pro and Microsoft Hyper-V
- 比如Windows:
参考资料:
- Windows 原生 Docker 正式商用
三、虚拟机和Docker
说到应用隔离和镜像,我就想起了虚拟机。今年下半年(此处省略.....),文体两开花(此处省略.....),要是我写文章写得不好,我是需要向XX谢罪的。
估计大家都用过虚拟机,虚拟机也能实现对应用的隔离,安装特定的镜像也能跑出我们想要的环境。虚拟机已经发展了很久了,为什么我们还需要Docker呢?
这部分内容在官网也有相关的介绍:

一句话总结:Docker容器比虚拟机轻量多了!
最后
Docker可以干嘛?
- 将一整套环境打包封装成镜像,无需重复配置环境,解决环境带来的种种问题。
- Docker容器间是进程隔离的,谁也不会影响谁。
其实这篇文章主要是讲为什么我们需要Docker(在学习一项技术之前,必须要知道这项技术是用来干嘛的),Docker的一些概念和命令我还没介绍(留到下一篇啦)。如果还没看过【生活现场】从搬家到容器技术docker应用场景解析,可以先去看看~
我在学习Docker的时候也找到了不少的资源,想要获取Docker入门资源的同学可在公众号下回复“Docker”
乐于分享和输出干货的Java技术公众号:Java3y。关注即可领取海量的视频资源!

觉得我的文章写得不错,不妨点一下赞!
为什么需要Docker?的更多相关文章
- docker——容器安装tomcat
写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- Docker 第一篇--初识docker
已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...
- 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)
环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...
- docker for mac 学习记录
docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...
- scrapy爬虫docker部署
spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...
- [原][Docker]特性与原理解析
Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...
- 开发者的利器:Docker 理解与使用
困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
- 微服务与Docker介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
随机推荐
- 使用ssh keys实现免验证登陆远程服务
使用ssh keys实现免验证登陆远程服务========================Created 星期四 10 五月 2018 引言------------------程序员或者服务器运维人员 ...
- ImportError: numpy.core.multiarray failed to import
1. ImportError: numpy.core.multiarray failed to import pip install -U numpy http://stackoverflow.com ...
- Java移位运算符详解实例
移位运算符它主要包括:左移位运算符(<<).右移位运算符(>>>).带符号的右移位运算符(>>),移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处 ...
- spring data redis 理解
前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...
- ZooKeeper的安装
一.准备 需要提前安装好Java 准备好zookeeper的软件包:软件包地址 二.部署 解压zookeeper压缩包到指定目录 执行如下命令: .tar.gz -C /opt/ 三.修改配置 ...
- Spring的两种任务调度Scheduled和Async
Spring提供了两种后台任务的方法,分别是: 调度任务,@Schedule 异步任务,@Async 当然,使用这两个是有条件的,需要在spring应用的上下文中声明<task:annotati ...
- SQL—对数据表内容的基本操作
数据表 students id name sex age address 101 张汉 男 14 杭州 102 欧阳钦 男 13 杭州 103 吴昊 男 14 北京 104 钱进进 男 1 ...
- GitHub 系列之「向GitHub 提交代码」
1.SSH 你拥有了一个 GitHub 账号之后,就可以自由的 clone 或者下载其他项目,也可以创建自己的项目,但是你没法提交代码.仔细想想也知道,肯定不可能随意就能提交代码的,如果随意可以提交代 ...
- django(权限、认证)系统——第三方组件实现Object级别权限控制
在我的系列blog<Django中内置的权限控制>中明确提及到,Django默认并没有提供对Object级别的权限控制,而只是在架构上留了口子.在这篇blog中,我们探讨一个简单流行的Dj ...
- Dubbo中集群Cluster,负载均衡,容错,路由解析
Dubbo中的Cluster可以将多个服务提供方伪装成一个提供方,具体也就是将Directory中的多个Invoker伪装成一个Invoker,在伪装的过程中包含了容错的处理,负载均衡的处理和路由的处 ...