docker化你的java应用(上)

前言

在各类技术大会(互联网架构,云计算等等),哪都少不了docker的身影。docker为啥这么火?由于它解决了大部分企业的痛点:快速的持续集成,服务的弹性伸缩,部署简单,方便了运维,并且为企业节省了机器资源,下降了成本。如今在不少企业(腾讯/京东/阿里/小红书等等)都大规模使用docker。做为开发工程师,我们或多或少须要接触docker,由于我们的程序运行在docker容器当中,了解docker,有益无害。下面咱们就进入docker的世界吧~java

走进docker

docker是什么?

docker logolinux

docker的官网是:https://www.docker.com/,上图是docker的logo:一条鲸鱼驮着一些集装箱在大海中遨游!(这个logo很是有意思,蕴含了docker的核心思想,稍后分析)nginx

docker官网对docker的一句话定义是:web

“Docker is the world’s leading software containerization platform.”spring

(docker是全球领先的软件容器化平台)docker

大白话就是:docker是一个用来装应用的容器,就像杯子能够装水,书包能够放书,笔筒能够放笔....你能够把任何你想获得的程序放到docker中!macos

docker是跨平台的,支持linux/macos/windows,不过docker是在ubuntu系统上开发的,对于ubuntu支持最好。ubuntu

理解docker logo

docker logo里面是一条鲸鱼驮着一些集装箱在海中遨游。windows

想一下,若是没有集装箱,那么货物是零散的存放,运输过程当中说不定出现破损或者丢失,若是采用集装箱,由于是密闭的,标准的,货物运输会很安全。api

鲸鱼,游到码头拿货(取集装箱),而后出发,运输集装箱到目的地。这种存储货物/运输货物的方式很标准,保证从一个地方到另外一个地方,不会出现问题。

之前,A机器上运行的程序想部署一套到其余机器上去,若是采起传统到方式进行文件拷贝等,有可能出现问题,采用集装箱的方式进行运输就能够避免。

既然,集装箱是标准的,就是说它的操做也是标准的,好比打开,关闭。这就意味着咱们对应用的启动、中止等将是统一的命令。(不管是nginx,tomcat等等,它们的启动,中止都将是统一的命令!这里说的就是docker的api接口的标准化)

集装箱和集装箱之间有隔离性,就好像虚拟机似的。咱们知道虚拟机能够有本身的内存/CPU/硬盘/网卡等,docker差很少,不过docker的容器更佳轻量级,它的建立、销毁很是快。【docker的隔离性最底层仍是依赖linux的lxc(Linux Container容器是一种内核虚拟化技术)机制来实现的】

docker思想

docker的思想解决了哪些问题?

“程序在我这里运行好好的,咋在你那里就不行了呢?”

一个普通的java web程序跑起来,须要哪些依赖?

操做系统os/jdk/webserver/代码/配置文件/...

好比,程序中调用了系统命令,如今os变了;

好比,jdk版本,编译使用的是1.8版本,机器上安装的是jdk1.6,没法识别class版本;

好比,tomcat版本,有些旧版本的配置新版本不支持;...

针对这种问题,docker的处理方式是,把os/jdk/webserver/代码等等一个个的放到集装箱中去,打包放到鲸鱼上,由鲸鱼给咱们送到目的地去,也就是说docker解决了运行环境不一致带来的问题!

“哪一个大哥又写死循环了,系统又变慢了...”

传统的方式中,咱们一台机器上部署了不少服务,极可能因为其余服务出现死循环占领cpu,日志狂打磁盘爆满等状况致使咱们本身的服务出现异常。

而docker的隔离性能够彻底避免这样的问题,由于docker在启动的时候,就给限定了最大能使用的cpu,内存,硬盘,若是超出就kill掉。

“双十一来了,又要部署几千台服务,过完节后,还得下线这么多,累死了...”

对于大部分系统而言,流量并非均匀的,好比电商系统,在11.11大促期间,就须要临时扩容机器,以后在下掉,若是是成百上千台,那就给运维带来很是大的工做量,有了docker就变得简单了,从5台服务器变成500台,5000台...都是分分钟的事情。(也就是说docker解决了快速扩容,弹性伸缩)

docker的三大核心概念

在上面咱们大白话说了那么多,如今咱们须要用专业术语来揭开docker的3大核心概念了:镜像/仓库/容器。

镜像(images),就是上面咱们说的集装箱;

仓库(repository),就是码头;

容器(container),就是运行程序的地方;

docker运行一个程序的过程是:去仓库把镜像拉到本地,而后用命令把镜像运行起来,变成容器!(build构建镜像;ship运输镜像;run运行的镜像就是一个容器)

 

简单示例它们之间的关系

本质来讲,镜像就是一系列的文件,docker利用linux的ufs(联合文件系统)机制进行存储来达到分层的效果。好比/test1目录下有a和b两个文件,test2目录下有c和d两个文件,那么利用ufs能够达到/test下有a、b、c、d四个文件,即ufs是一种分层的文件系统,能够将不一样的目录挂到同一个虚拟文件系统下。每一层镜像层加载完毕后,会被当作同一个目录,至关于只有一个文件系统,docker的这种文件系统就被称做为镜像。

容器,上面已经说起过,就是一个进程,能够把容器想象成一个虚拟机,会有本身的文件系统。注意容器是可写的,而镜像是只读的,由于运行中的程序大部分有写的需求,好比写日志,修改一些文件什么的。若是容器须要对镜像层的某些文件做修改,该如何处理呢?那么就把镜像层中的文件拷贝到容器中,在容器中进行修改,当咱们的应用读取文件的时候,是从对顶层容器开始查找,若是没有才会开始查找下一层(这样咱们就能读取到修改的文件了。)

仓库,这里有点相似maven仓库的概念,其实就是为了传输镜像。https://hub.docker.com/这个是docker官网给咱们提供的远程仓库地址,固然公司内部通常会有本身的私有镜像中心。

上图中,能够清楚的看到,同一个镜像能够生成多个容器运行,容器之间是相互独立的。

 

好了,到这里,本篇博客为你们介绍了docker的一些初步知识,下一篇将带你们实践docker以及分析一个springboot项目的docker化。

相关文章
相关标签/搜索