社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

docker化你的java应用(上)

Java编程精选 • 7 年前 • 881 次点击  


作者丨张丰哲

https://www.jianshu.com/p/66d611657ed6


前言


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


走进docker


docker是什么?


docker logo


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


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


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

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


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


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


理解docker logo


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


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


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


以前,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官网给我们提供的远程仓库地址,当然公司内部一般会有自己的私有镜像中心。


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


【无门槛免费领】

535G超强程序员编程

0基础从入门到精通自学视频教程!

 

  

  

  

    

万水千山总是情,点个 “在看” 行不行
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/32866