docker化你的java应用(上)
前言
在各种技术大会(互联网架构,云计算等等),哪都少不了docker的身影。docker为啥这么火?因为它解决了大部分企业的痛点:快速的持续集成,服务的弹性伸缩,部署简单,方便了运维,而且为企业节省了机器资源,降低了成本。现在在很多企业(腾讯/京东/阿里/小红书等等)都大规模使用docker。作为开发工程师,咱们或多或少需要接触docker,因为咱们的程序运行在docker容器当中,了解docker,有益无害。下面我们就进入docker的世界吧~
走进docker
docker是什么?
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的思想解决了哪些问题?
“程序在我这里运行好好的,咋在你那里就不行了呢?”
一个普通的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化。
作者:张丰哲
链接:https://www.jianshu.com/p/66d611657ed6
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
docker化你的java应用(上)相关推荐
- docker化你的java应用(下)
前言 在<docker化你的java应用(上)>中,我们已经初步接触了docker的核心概念与思想,本篇博客将对docker进行实践,会介绍一些docker常用的命令,并通过docker化 ...
- 「实战篇」开源项目docker化运维部署-后端java部署(七)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:「实战篇」开源项目docker化运维部署-后端java部署(七) 本节主要说说后端的部署需要注意的点,本身renren-fas ...
- SpringBoot项目Docker化并上传DockerHub的使用过程
. springboot项目 docker化 添加依赖 代码片段:<plugin><groupId>com.spotify</groupId><artifac ...
- 【Docker学习之旅】手把手教你Java应用进行Docker化
手把手教你Java应用进行Docker化 简介:简介:Docker是一个使用Go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的机器上. 一 ...
- 安装 esl php 模块,ESL系统的Docker化部署
ESL需要四台服务器:分别是数据库Mysql服务器,Redis服务器,EMQ服务器,以及Spring Boot所在web服务器.Docker化部署就是将这四台服务器全部放在container中运行,通 ...
- 如何Docker化任意一个应用
网上有很多关于如何将应用Docker化的教程,为什么我还要再写一个呢? \\ 我见过的大部分教程都是限定在某种特定技术(例如Java或者Python),可能无法满足读者的需求.同时,这些教程也没有说清 ...
- Docker化Spring Boot应用程序
你好朋友, 在本教程中,我们将看到如何对Spring Boot应用程序进行Docker化.通过dockerizing意味着我们将以Docker容器的形式运行应用程序. 以下是涉及的步骤: 1.创建一个 ...
- Docker学习总结(18)——阿里超大规模Docker化之路
12月6-7日,由阿里巴巴集团.阿里巴巴技术发展部.阿里云云栖社区联合主办,以"2016双11技术创新"为主题的阿里巴巴技术论坛上,阿里巴巴研究员林昊分享了阿里超大规模Docker ...
- 游戏研发与运营环境Docker化
在泛娱乐时代,游戏行业特殊的业务特点为技术团队提出了更高的要求,而Docker对游戏研发的运营环境带来了很多好处.发展至今,游戏研发的行业现状是怎么样的?Docker和架构改进之间如何应用?通过Doc ...
最新文章
- 人工智能 有信息搜索 (启发式)
- R语言ggplot2可视化分面图(facet_wrap)、使用size参数自定义设置分面图标签栏(灰色标签栏)中的标签文本的字体大小
- Java JFrame 和 Frame 的区别
- 计算机一级考试考网络什么,计算机一级考试内容 一级考试难不难
- strace调试(Linux Device Driver)
- 【JVM】垃圾回收器
- python命令行模式和交互模式区别_对命令行模式与python交互模式介绍
- onSingleTapUp()和onSingleTapConfirmed()的区别
- linux 命令行下导出查询的数据
- 你们要的终极指南! 交易API接口
- mysql front 连接类型_mysql-front 怎么连接数据库
- Flink 实时数仓伪分布虚拟机 (所有组件部署完成)
- 内网穿透之Http穿透(让全网都可以访问你的项目)
- 大一作业HTML网页作业:中华传统文化题材网页设计(纯html+css实现)
- swissprot评论区_【分享】SWISS-PROT简介
- uni-app如何使用vant-ui
- tkinter绘制组件(18)——菜单
- 打开网络显示连接的服务器在哪里找,电视网络与服务器连接设置在哪里找
- 基于tensorflow+RNN的新浪新闻文本分类
- flink从入门到精通-flink简介