Docker篇(一):为什么要用Docker?


点击蓝字关注我们
大家好,我是杰哥
对于Docker,一个近几年比较新兴的玩意~自己之前只是学习了一段时间,然后在自己的电脑上跑了一些常用的软件在用而已,还没机会系统化地梳理过。这不,最近项目中正式要用到Docker了,于是就要老老实实地总结一遍咯
大家也知道杰哥的套路:引入一个新技术,往往是先通过几个问题,让大家对它有一个大概的印象。而带着问题进行学习,对于已经有一点点基础的你,效果会更好。所以,Docker的开篇,我们也是从以下几个问题开启~
 
1、Docker 是什么?
2、为什么会出现?解决了哪些问题
3、为什么会比虚拟机快?有哪些优势?
4、学习docker的思路-对比学习
5、Docker的架构
6、Docker的三大核心概念
7、DockerFile是什么?
8、实例入门hello-world
一 认识
Docker 是什么?
官网上如此说:
Docker是一个用于开发、发布和运行应用程序的开放平台。
它使你能够将你的应用程序从你的基础设施中分离出来,这样你就可以快速地交付软件。
使用Docker,你可以像管理应用一样管理你的基础设施。
通过利用Docker快速发布、测试和部署代码的方法,您可以显著减少编写代码和在生产环境中运行代码之间的延迟
稍微有点抽象,先别管,没理解也很正常,怎么理解呢?继续往下走
传统的项目
我们知道,传统的软件项目:从开发到运维,程序员会将自己的程序包打好交给运维,然后由运维人员再进行部署,包括环境的部署、应用程序使用到的依赖组件以及后端程序的部署
而部署之后的环境,要是与开发环境稍微有点差别,或者项目的某个配置项的不同,都有可能出现开发常喊的:“在我这边是没有问题的啊!”等系列问题,进而会有一些争论,不仅会浪费时间,还会引起不必要的争端~
Docker的出现
开发人员只要在本地测试完全没有问题了,直接把本地的环境(包括程序包和程序包中依赖的所有组件)统一打包成一个镜像,交给运维人员。运维人员拿到这个镜像包,直接运行,一模一样的环境,一模一样的配置,那将必然是没有问题的咯

大致了解了吧?我觉得有一个例子用来形容传统和使用Docker的交付过程比较形象:就是鱼和鱼缸的关系
假如你要买一条金鱼,传统的方式是只是把鱼卖给你了,这种可能会因为生活环境不一样了,鱼往往很容易死掉;而使用了Docker,就是连同鱼缸一起给你了,你说哪种模式的问题少一些呢?
现在再回过头来去看官网的解释,有没有稍微好理解一点?
二 解惑
Docker解决了什么问题?
Docker到底为什么会出现?它究竟解决了什么问题?这往往是我们在了解一个新技术必须了解清楚的点。只有了解清楚这个技术解决了什么问题,你才会有兴趣进行进一步的学习
先来看这一句:
借助 Docker,您可将容器当做轻巧、模块化的虚拟机使用。同时,您还将获得高度的灵活性,从而实现对容器的高效创建、部署及复制,并能将其从一个环境顺利迁移至另一个环境,从而有助于您针对云来优化您的应用
首先在上一节,我讨论了传统的和使用docker进行交付两种方式的对比,了解了Docker大大提升了交付过程的效率,降低了复杂性。带来了极大的便利
再比如,一个系统做完之后,需要部署在8台机器上。假如应用程序使用到了10个依赖组件,那就需要把80个组件的全部安装配置正确,这8套服务才算是成功部署
若使用了Docker,就只需要对已经打好的镜像进行复制就可以了
不得不说,当我了解到这一点之后,就觉得Docker是真香呢!
三 比较
为什么会比虚拟机快?

虚拟机与Docker的区别在于:docker利用的是宿主机的内核,而不需要Guest OS,而且它有着比虚拟机更少的抽象层。也就是说:Docker 守护进程取代了Hypervisor和Guest OS这两层
那么在运行性能方面,虚拟机上操作系统额外的CPU和内存消耗会影响性能,而Docker几乎无额外的性能损失
再者,虚拟机上的镜像比较庞大,使用Docker开发,使用的镜像比较小,相对来说,Docker的传输速度也会快很多
这些就是为何Docker比虚拟机快的原因了。只能感叹,Docker的设计思路可谓是创造性的!
四 类比
学习docker的思路
在学习过程中,你会发现其实很多东西的设计思路都是相通的
比如说,Docker本身与Java语言的设计就如出一辙,即一次编译,处处运行
还有,类似于github的思想,Docker将镜像也上传到仓库(docker hub)中,其他地方要是想要使用,可以直接pull下来。之后,还可以对这个镜像进行定制化修改,再重新构建成一个特定的镜像包,然后提交(docker commit)
五 架构
docker的架构了解
先来看看Docker架构

我们可以看到,Docker使用客户端-服务器架构。图中包含客户端(Client)、Docker所在的主机(DOCKER_HOST)以及Docker注册仓库。Docker客户端与Docker守护进程进行对话,该守护进程完成构建,运行和分发Docker容器的繁重工作
所以,一般情况,我们下载好Docker之后,首先需要配置Docker的仓库地址,然后执行docker pull 镜像名(从仓库)下载镜像,镜像运行之后,就生成了一个容器号,变成了容器。这时,我们就可以直接使用了
对Docker架构有了印象,再来理解Docker的核心概念就so easy啦
六 核心
docker的三大核心概念
关于docker,大家常说的三大核心概念:镜像、容器以及仓库,该如何来理解呢?
1)镜像和容器
就相当于是java中的类和对象,如下所示:
Student stu = new Student();
这里,Student就相当于Docker中的镜像,只有一份,而stu就相当于Docker中的容器,可以创建多份
2)仓库与镜像
而仓库,就类似于maven仓库,用来存储这些类信息(只不过maven仓库存储的粒度不会直接是类,而是一个个依赖,但依赖中就包含各个类),Docker的仓库则用来存储镜像
3)总结
那么,我们总结一下
镜像:打包好的运行环境
容器:通过镜像创建的实例
仓库:存放镜像的地方
我们使用docker pull将镜像从仓库拉到本地,然后通过docker run命令启动镜像,启动以后就生成了一个实例,也就是我们的容器,所以,容器也是一个运行时环境
七 构建
Dockerfile是什么?
那么大家常说的DockerFile究竟是用来干什么的呢?
类似于Hello.class是对Hello.java源码文件的描述,DockerFile也是用来描述镜像的文件。一般情况会使用DockerFile来进行镜像的构建
它与镜像和容器组合起来,组成Docker体系的三大基石

八 实战
hello-world走起
接下来我们通过一个hello world的小实战,来实际验证一下上述docker的理念和特性。首先,需要先保证本地安装了Docker
1 安装docker
参考官网进行安装
注意:
安装成功以后,记得配置私有仓库,否则仓库就默认为最大的仓库:https://hub.docker.com/,部署在国外的服务器,你懂得-巨慢
我们进行hello-world的镜像拉取以及运行步骤,来熟悉一下Docker的使用方式
2 查看本地镜像
通过docker images命令,查看本地的镜像有哪些

由于我本身已经安装了三个镜像,因此就会显示这三个镜像信息,而且并没有目标镜像:hello-world
3 拉取镜像

通过docker pull hello-world命令,下载hello-world镜像
4 查看镜像列表
再次运行docker images命令

此时,发现本地已经有了hello-world镜像了
5 运行docker
执行docker run 镜像名称,运行 hello-world 镜像

若显示图中所示信息,则表示成功运行!
6 查看运行情况
由于hello-world镜像,是Docker官方我们提供的用来测试Docker是否安装正确的镜像,实际不会有什么用处,因此在启动完之后,它就自动关闭了(类似于单元测试案例的执行)
那么,直接执行docker ps(查看当前已启动的容器),就看不到hello-world 镜像

那么,怎样能够查看到我们已经启动过的镜像的容器号呢?
别担心,docker也为我们提供了方法:执行docker ps -a 即可~

九 总结
总而言之
好了,Docker篇的第一次推送就结束啦~
技术总是在快速进步,新一门技术的出现,往往要么是会弱化之前的新技术之后的一些漏洞,比如服务治理组件的出现,就是为了解决微服务管理的问题。要么就是让某一部分的东西变得越来越简单,比如Docker。将每个组件的容器,变成一个个精简的linux系统,从开发到运维,连同应用程序包的运行环境一块打包运行,大大简化了我们的交付流程。
那么再温习一遍,Docker是什么?
一次封装,到处运行。在任何地方,发布构建任何应用
嗯,就这样。每天学习一点,时间会见证你的强大~
下期预告:
Docker篇(二):Docker实战,命令解析

往期精彩回顾

SpringCloud篇章
Spring Cloud(十三):Feign居然这么强大?
Spring Cloud(十):消息中心篇-Kafka经典面试题,你都会吗?
Spring Cloud(九):注册中心选型篇-四种注册中心特点超全总结
Spring Cloud(四):公司内部,关于Eureka和zookeeper的一场辩论赛
Spring Cloud(一):我与导师的对话:你真的了解zookeeper吗?
..........
Spring Boot篇章
Spring Boot(八):Spring Boot的监控法宝:Actuator
Spring Boot(七):你不能不知道的Mybatis缓存机制!
Spring Boot(六):那些好用的数据库连接池们
Spring Boot(四):让人又爱又恨的JPA
SpringBoot(一):特性概览
..........
前端篇
使用 CSS 提升页面渲染速度
.........
职业、生活感悟
你有没有想过,旅行的意义是什么?
程序员的职业规划
让程序员崩溃的十个瞬间!第6个简直不能忍!
聊聊这次换工作经历
欢迎大家关注们的公众号,一起持续性学习吧~

     
到顶部