项目为什么用docker?
项目为什么要用 docker,需要了解 docker 的优势,结合项目的实际情况来决定是否需要使用 docker,千万不能"为了使用而使用"或者"跟风使用 docker"。
使用 docker 是为了快速交付
和传统的虚拟机相比,docker 具有所用的资源更少、性能更高、隔离级别更高、安全性方面也更强等特点,让我们看看下面几个场景,估计你会有更深的体会。
01. 移植性更强
相信开发人员都会遇到这样的问题:代码在本地跑的好好的,但是一发布到测试环境怎么就有问题了呢?
通常我们的的代码包需要依赖于环境中的很多因素,比如配置文件、依赖库、中间件的配置等等,其中一项有问题可能都会导致我们代码出现问题;对于开发人员来说,最希望的就是我们的代码能够一次创建,在任意地方都能运行。
而使用 docker 之后,可以实现开发、测试、运维环境的标准化,镜像文件直接做为交付物,避免了因为环境不同导致的各种问题。
02. 更容易扩展
docker 容器可以在任意平台运行,不管是物理机还是虚拟机,不管是公有云还是私有云,甚至是个人电脑,所以我们的项目容易做迁移和扩展。
比如我们应用部署了两台机器,当我们想再扩展第三台机器的时候,我们需要先搭建好代码运行所需的环境,尽管虚拟机也有一些快速 copy 的技术,但是这个过程依然是很慢的,而且有些环境配置还容易出错,而有了 docker,只需要构建镜像然后运行即可,非常方便快速。
因为 docker 快速的构建方式,也让我们的项目可以实现自动且快速的扩容和缩容。
03. 更加轻量
在 docker 出现之前,通常会采用物理机上部署多台虚拟机,每个应用都部署在一个虚拟机中;但是虚拟机非常的重,虚拟机的构建速度通常都是按照分钟计算,占用的资源比较多。
而 docker 的速度很快,秒级,并且使用的资源更少,性能更高;同样一个物理机器,docker 运行的镜像数量远多于虚拟机的数量。
使用 docker 只是快速交付的一部分
docker 的优点这么多,那是不是用了 docker 之后,我们的交付速度更快了呢?
我见过一个项目,他们号称已经微服务化了,当然他们确实也做到了:把一个项目拆成了数个服务,每个服务在生产环境上部署了多套,算下来就是 N * M 个应用包(七八十个),都做了容器化...
但是他们依然是人肉运维,也是就是他们每次提测和上线需要手动部署,没有自动化测试和发布;
生产环境发生问题的时候,需要手动去拿日志跟踪问题,开发和运维依然是两个团队,甚至是所属两个不同的部门,沟通的成本很高;
他们虽然实现了容器化,但其实并没有实现快速交付,甚至比传统的方式更慢了。
所以,不要为了 docker 而 docker;如果你们的项目环境配置复杂,每来一个新人配置环境都需要一两天;每次提测和上线,经常问题都是运行环境的问题;开发人员的开发环境不统一;开发能力强,运维能力弱的时候,甚至公司比较穷,想实现资源使用的最大化,都可以考虑使用 docker,不过像要做微服务化+容器化,当容器集群规模比较大的时候,还需要工具做容器的自动化管理和编排,自动化测试及部署等等。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。
docker 可以说是一大神器。从15年开始工作,就可以接触 docker ,到现在已历时5年,从最开始的原生部署,docker run 启动,到 jekenis 自动化部署,到如今公司的自研自动部署平台,作为研发,实际接触 docker 的机会越来越少,但间接接触 docker的几乎每时每刻。申请测试环境,运维侧会给你一个docker容器,线上部署应用,还是 n 多的 docker ,申请弹性数据库,还是一组 docker 集群。docker基本上已融入互联网公司的角角落落。那我简单来说说为什么使用 docker 。
其一,环境部署更快捷。搭建一个 java web运行的环境,需要安装 jdk ,安装 tomcat,有时还需要安装 nginx,而使用docker,直接从docker仓库【https://www.docker.com/】中拉取一个包含 jdk+tomcat+nginx的基础镜像,把我们的应用代码打入,就可以启动,其速度更快捷。
其二,更轻松的迁移。我们在测试环境中部署了我们的应用,测试通过,可以很轻松的把我们的应用镜像移植到线上环境中,而不用考虑环境不一致的问题。
其三,使用 docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。所有的东西都在Dockerfile上,所有的人员都可以通过Dockerfile查看其中的依赖。
除上述的原因外,docker 高效的利用系统资源、快速的启动时间以及轻松的维护和扩展等特性也是赞誉一片。比如docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。
而随着docker容器化的发展,集群化、基础化的特点突出,一个微服务集群,成百上千的docker,大公司一般都是通过开源或者自研的方案解决其自动化部署和容器管理的问题,研发接触docker的机会也越来越少,但是其中的技术原理应该了解,并能够自己构建镜像并部署容器,这对个人的发展有一定的好处。
作者:夕阳雨晴,欢迎关注我的头条号:偶尔美文,主流Java,为你讲述不一样的码农生活。
Docker可以将复杂的应用程序运行环境部署打包,这样就避免开发人员或者运维人员反复部署相同的应用程序运行环境。在如今云计算盛行的情况下,分布式应用和管理变得简单了。基本上云计算服务平台都提供了现成的群集计算服务,这些群集服务无一例外都是基于docker镜像构建的。群集应用的要求就是每个节点的应用程序版本以及环境要一致,一个docker镜像就是一个虚拟主机,只要放到容器中即可实现单机独立运行的效果,大大简化了分布式群集应用的实现过程
一个非常好的问题,我是工作多年的Web应用架构师,来回答一下这个问题。欢迎关注我,了解更多IT专业知识。
回答之前,先反问一个问题:为什么不用Docker呢?
Docker出现之前,有现在还在用的VMWare虚拟机,有Ghost,部分解决了服务器安装配置的琐碎工作,但是没有解决运行环境的问题。比如常见的环境不一致的问题:开发环境能运行,测试生产环境有bug?还有就是每次新服务器、新环境搭建时无穷无尽的问题。
那么Docker出现后,整个环境被打包起来,也就是将所有安装配置代码化自动化了,结合资源编排和云服务,可以秒启一个集群化的web服务系统,如果没有容器技术是做不到的。Docker是使用最普遍的容器技术,事实上的容器技术标准。
推荐看一个Docker秒启Web服务的视频:https://www.ixigua.com/i6799872807397229068/
Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker特性Automating the packaging and deployment of applications(使应用的打包与部署自动化)Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)Docker解决的问题应用更新发布及部署低效
云计算、大数据,移动技术的快速发展,加之企业业务需求的不断变化,导致企业架构要随时更改以适合业务需求,跟上技术更新的步伐。毫无疑问,这些重担都将压在企业开发人员身上;团队之间如何高效协调,快速交付产品,快速部署应用,以及满足企业业务需求,是开发人员亟需解决的问题。Docker技术恰好可以帮助开发人员解决这些问题。环境一致性难以保证
为了解决开发人员和运维人员之间的协作关系,加快应用交付速度,越来越多的企业引入了DevOps这一概念。但是,传统的开发过程中,开发、测试、运维是三个独立运作的团队,团队之间沟通不畅,开发运维之间冲突时有发生,导致协作效率低下,产品交付延迟, 影响了企业的业务运行。Docker技术将应用以集装箱的方式打包交付,使应用在不同的团队中共享,通过镜像的方式应用可以部署于任何环境中。这样避免了各团队之间的协作问题的出现,成为企业实现DevOps目标的重要工具。以容器方式交付的Docker技术支持不断地开发迭代,大大提升了产品开发和交付速度。不同环境迁移成本高
此外,与通过Hypervisor把底层设备虚拟化的虚拟机不同,Docker直接移植于Linux内核之上,通过运行Linux进程将底层设备虚拟隔离,这样系统性能的损耗也要比虚拟机低的多,几乎可以忽略。同时,Docker应用容器的启停非常高效,可以支持大规模的分布系统的水平扩展,真正给企业开发带来福音。
Docker很大程度上解决了上述问题,提高开发和运维的工作效率,提高企业的工作效率。Docker的未来
任何一项新技术的出现,都需要一个发展过程,比如云计算为企业所接受用了将近五年左右时间,OpenStack技术也经历了两、三年才受到人们的认可。因此,虽然Docker技术发展很快,但技术还不够成熟,对存储的灵活的支持、网络的开销和兼容性方面还存在限制,这是Docker没有被企业大范围使用的一个主要原因。另外一个原因是企业文化是否与DevOps运动一致,只有企业支持DevOps,才能更大地发挥Docker的价值。最后一个原因就是安全性问题,Docker对于Linux这一层的安全的隔离还有待改进,才能进一步得到企业的认可。
项目为什么用docker?
我们来看看使用docker有什么好处:环境隔离
我在没有用docker之前部署服务器环境的时候,部署一个服务可能会需要安装一些依赖的程序,比如用到ImageMagick进行图片处理,这样的服务和依赖多了以后,如果突然有一个服务我不再用了,它使用到的依赖程序我没办法确定能不能删除了,因为很可能其它服务也用到了这个依赖。
还有如果两个服务需要用到同一个程序的不同版本,这个时候没有docker的话要安装也会很麻烦。
使用docker可以将某个服务的依赖全部安装在一个docker镜像中,不需要的时候直接删除这个docker实例。环境统一
以前做负载均衡部署服务到不同的服务器,有时候会碰到因为某些莫名其妙的原因,在有的服务器上运行就是会出bug。
使用docker服务需要的依赖都在镜像中设置好,使用的都是统一的版本,这样就不会出现这些问题。同时,开发,测试,发布的环境都可以统一,减少了因为环境不同导致的bug。部署方便
使用docker可以把需要用到的依赖都安装打包成镜像,写好部署脚本,部署的时候运行脚本安装,简单方便,不需要在每一个服务器去下载、编译、安装各种依赖。
这在服务体量很大,需要很多服务器做负载均衡的时候特别方便,尤其是配合Kubernetes。DevOps
使用docker配合其它工具搭建DevOps环境,持续开发、测试、部署,可以减少中间环节,提高企业效率。
以上就是使用docker带来的好处,当然docker也不是唯一的解决方案,但它是现在的主流方案。
希望可以帮到你
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 跟传统的虚拟化方式相比具有众多的优势,如下列出一些它的优势。更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。更轻松的移植
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。更好的隔离性
用上了docker容器后,将Docker可以将我们的应用程序打包封装到一个容器中。该容器包含了应用程序的代码、运行环境、依赖库、配置文件等必需的资源。容器之间达到进程级别的隔离,在容器中的操作,不会影响道宿主机和其他容器,这样就不会出现应用之间相互影响的情形。
我可以举几个例子,就可理解为什么要用docker?隔离性
用传统的方式上线一个WEB项目,我们的一般做法是在线上服务器中,安装WEB服务器,然后装好数据库,装好其他需要的软件最后把本地己打包好的代码上传至服务器,然后重启就好了。
如果一台服务器上要部署多个项目,每个项目之间无论是在资源的使用,还是之间的冲突。都会让人崩溃。更别提有不同的开发语言和开发团队。
现在我们有docker ,可以用docker把应用直接打包封装到一个容器中。容器之间有着进程之间的隔离,在容器中操作不会影响到其他容器的使用。可移植性
以前开发一套应用,必须开发机上安装环境,测试机上安装环境,然后部署的服务器上安装环境,而且由于使用的机器不是同样的操作系统,所以有时会出现在本机上没问题,测试时有出问题,甚至开发测试都没问题,一上线就BUG满满。估计大家遇到过与测试之间撕B的场景。
用上docker,无论是在开发机,测试机,生产环境以容器运行,使应用在三种环境下保持一致。高效轻量
对比虚拟机,docker占用资源更小。而且可以提高服务器的资源利用率。
前几天,公司一批服务器就要到期了,由于服务器是15年购买的,硬件的性能远比现在新出的云主机低,因此决定把所有服务器都换成新一代服务器,但是小编整准备动手迁移服务器时,内心一阵阵崩溃感涌上心头,仔细一算,每台服务器都要做同样的事情:安装jdk、Tomcat、nginx
2. 配置jdk环境变量和系统变量
3. 配置Tomcat
4. 配置nginx
5. 安装项目所需的视频解码组件
6. 导入项目所需的一些特殊字体
后来决定用docker部署的办法,在每台服务器都把docker安装之后,只需要在其中一台服务器中把Tomcat镜像从镜像仓库拉取下来,把这些配置都设置好,做成一个自己的镜像上传到镜像仓库中,之后在其他几台服务器都下载自己做的镜像,运行于docker中,把代码上传,就万事大吉了。
这是一个容器,为了防止一个项目的程序运行异常影响其他项目程序的正常运行,可以理解为隔离不同项目的程序,简单来说类似于一个虚拟的盒子或系统,里面运行独立的项目程序,共享系统底层资源。