可以用docker代替虚拟机,运行生产服务器吗?
正面回答这个问题之前,先看看虚拟机和Dcoker的区别。
总结一下虚拟机和Docker的区别:
再正面回答一下“Docker可以代替虚拟机运行生产服务器么”?
应用部署到服务器上的过程: 因为我是做java开发的,就拿一个正常的java项目举例。首先需要在服务器上搭建基础环境:
这只是一个简单的项目的部署前的配置,之后把您的项目打包发送的tomcat,运行即可。那如果有十几个服务器需要部署呢?是不是就要配置环境十多次,那人不是崩溃了。而且还会出现开发那边运行没问题,部署上去有问题的事情。所以这个时候docker出来了。
应用部署到docker上的过程:
两步搞定,不需要配置复杂的环境。如果有十多个容器需要部署怎么办?直接远程下载镜像即可,是不是很简单。
docker适合平台统一在linux的大单位用,服务越多越好,比如几百、几千、几万。配合k8s调度和微服务改造、加上自动化运维,能够实现弹性扩容和缩容,达到on demand的效果,典型的用例是互联网内容提供商。
对于一般中小企业,只有几十台服务器的,平台不统一的,投资docker不如虚拟机。
除了不能跨os平台,docker的另一个缺陷是隔离度不够。
先说答案:可以,但是没有必要。
容器技术是虚拟化技术的应用,使用容器代替虚拟机运行程序自然是可以的,容器在持续集成方面相对虚拟机还有一定的优势,但是如果仅仅是为了用容器而用容器,则没有必要。
容器技术最大的优势是容器编排,可以实现线上服务的无缝扩容,缩容,降级,熔断等自动化操作,极大的降低运维成本。所以,如果不用容器编排,则无须急着迁移。
理论上完全可以的,但目前我所接触到的生产方案基本上都是docker在虚机集群上跑。
看系统的要求了。docker不可能完全替代全部,windows服务器不可以,软件系统没有使用docker重新加载的,也是很难的。
用docker需要配合自动化,否则那是给自己找麻烦
1、 centos7 环境下,安装docker后服务器断开ssh连接
原因及处理方法1 : 通过ip addr 命令查看 docker0 的ip段是否同当前主机的网络内外网段是否相同
如果相同,修改/etc/docker目录下daemonjson文件里面添加如下内容:
{
"bip": "1921682001/24"
}
然后进行重启:
sudo systemctl daemon-reload
sudo systemctl restart dockerservice
原因及处理方法2: 内核和版本不匹配
a) 通过uname -r 查看内核版本,从docker官网上查看对应的日志信息,对比安装相应版本docker
b) 或者通过升级系统内核,重新安装docker处理 服务器-centos7 内核升级 -
1、[root@docker~]列出的信息有镜像名、标签、镜像id、创建的时间、大小。
2、启动docker服务器后,使用dockerimages命令。返回当前所有的镜像,使用dockerps查看正在运行的容器,使用dockerps-a查看docker中所有容器。
3、如果你要查看这里面的进项内容的话,你只要打开镜像就可以看到了。
服务器虚拟化的三种架构模型分别是Type 1 Hypervisor、Type 2 Hypervisor和容器化。
详细解释如下:
1 Type 1 Hypervisor
也被称为“原生”或“裸机”Hypervisor。这种虚拟化架构直接在物理硬件上运行,无需底层操作系统支持。因此,Type 1 Hypervisor能提供更高的性能和更好的安全性。在这种模型中,虚拟服务器有直接的硬件访问权,可以达到接近物理服务器的性能。一个典型的例子是基于KVM(Kernel-based Virtual Machine)的虚拟化解决方案。
2 Type 2 Hypervisor
Type 2 Hypervisor在宿主操作系统上运行,因此也被称为“托管”Hypervisor。它通过宿主操作系统来管理和访问物理硬件资源。由于需要额外的一层操作系统,因此Type 2 Hypervisor在性能方面可能会比Type 1稍差一些。但是,它的安装和配置通常更简单,更易于管理。VMware Workstation和VirtualBox就是Type 2 Hypervisor的典型例子。
3 容器化
虽然容器化和Hypervisor虚拟化在技术上有所不同,但它也是一种重要的服务器虚拟化方法。在容器化中,应用程序及其依赖项被打包到一个独立的“容器”中,然后这个容器可以在任何Linux环境中运行。这种方式允许在同一操作系统上运行多个隔离的应用程序,提高了资源利用率和部署速度。Docker是目前最流行的容器化技术。
以上就是服务器虚拟化的三种主要架构模型。各种模型都有其优缺点,选择哪种模型取决于你的具体需求,例如性能、安全性、资源利用率、部署和管理复杂度等因素。在选择虚拟化技术时,你需要对这些因素进行权衡,以找到最适合你的解决方案。
回答之前,先反问一个问题:为什么不用Docker呢?
Docker出现之前,有现在还在用的VMWare虚拟机,有Ghost,部分解决了服务器安装配置的琐碎工作,但是没有解决运行环境的问题。比如常见的环境不一致的问题:开发环境能运行,测试生产环境有bug?还有就是每次新服务器、新环境搭建时无穷无尽的问题。
那么Docker出现后,整个环境被打包起来,也就是将所有安装配置代码化自动化了,结合资源编排和云服务,可以秒启一个集群化的web服务系统,如果没有容器技术是做不到的。Docker是使用最普遍的容器技术,事实上的容器技术标准。
推荐看一个Docker秒启Web服务的视频:https://wwwixiguacom/i6799872807397229068/
我可以举几个例子,就可理解为什么要用docker
用传统的方式上线一个WEB项目,我们的一般做法是在线上服务器中,安装WEB服务器,然后装好数据库,装好其他需要的软件最后把本地己打包好的代码上传至服务器,然后重启就好了。
如果一台服务器上要部署多个项目,每个项目之间无论是在资源的使用,还是之间的冲突。都会让人崩溃。更别提有不同的开发语言和开发团队。
现在我们有docker ,可以用docker把应用直接打包封装到一个容器中。容器之间有着进程之间的隔离,在容器中操作不会影响到其他容器的使用。
以前开发一套应用,必须开发机上安装环境,测试机上安装环境,然后部署的服务器上安装环境,而且由于使用的机器不是同样的操作系统,所以有时会出现在本机上没问题,测试时有出问题,甚至开发测试都没问题,一上线就BUG满满。估计大家遇到过与测试之间撕B的场景。
用上docker,无论是在开发机,测试机,生产环境以容器运行,使应用在三种环境下保持一致。
对比虚拟机,docker占用资源更小。而且可以提高服务器的资源利用率。
Docker可以将复杂的应用程序运行环境部署打包,这样就避免开发人员或者运维人员反复部署相同的应用程序运行环境。在如今云计算盛行的情况下,分布式应用和管理变得简单了。基本上云计算服务平台都提供了现成的群集计算服务,这些群集服务无一例外都是基于docker镜像构建的。群集应用的要求就是每个节点的应用程序版本以及环境要一致,一个docker镜像就是一个虚拟主机,只要放到容器中即可实现单机独立运行的效果,大大简化了分布式群集应用的实现过程
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
云计算、大数据,移动技术的快速发展,加之企业业务需求的不断变化,导致企业架构要随时更改以适合业务需求,跟上技术更新的步伐。毫无疑问,这些重担都将压在企业开发人员身上;团队之间如何高效协调,快速交付产品,快速部署应用,以及满足企业业务需求,是开发人员亟需解决的问题。Docker技术恰好可以帮助开发人员解决这些问题。
为了解决开发人员和运维人员之间的协作关系,加快应用交付速度,越来越多的企业引入了DevOps这一概念。但是,传统的开发过程中,开发、测试、运维是三个独立运作的团队,团队之间沟通不畅,开发运维之间冲突时有发生,导致协作效率低下,产品交付延迟, 影响了企业的业务运行。Docker技术将应用以集装箱的方式打包交付,使应用在不同的团队中共享,通过镜像的方式应用可以部署于任何环境中。这样避免了各团队之间的协作问题的出现,成为企业实现DevOps目标的重要工具。以容器方式交付的Docker技术支持不断地开发迭代,大大提升了产品开发和交付速度。
此外,与通过Hypervisor把底层设备虚拟化的虚拟机不同,Docker直接移植于Linux内核之上,通过运行Linux进程将底层设备虚拟隔离,这样系统性能的损耗也要比虚拟机低的多,几乎可以忽略。同时,Docker应用容器的启停非常高效,可以支持大规模的分布系统的水平扩展,真正给企业开发带来福音。
Docker很大程度上解决了上述问题,提高开发和运维的工作效率,提高企业的工作效率。
任何一项新技术的出现,都需要一个发展过程,比如云计算为企业所接受用了将近五年左右时间,OpenStack技术也经历了两、三年才受到人们的认可。因此,虽然Docker技术发展很快,但技术还不够成熟,对存储的灵活的支持、网络的开销和兼容性方面还存在限制,这是Docker没有被企业大范围使用的一个主要原因。另外一个原因是企业文化是否与DevOps运动一致,只有企业支持DevOps,才能更大地发挥Docker的价值。最后一个原因就是安全性问题,Docker对于Linux这一层的安全的隔离还有待改进,才能进一步得到企业的认可。
当服务器运行多个应用程序时,为了防止应用程序之间所需的环境依赖产生冲突或误操作影响,所以需要做好隔离,最大限度利用服务器资源环境,docker就把它变成了一个个沙盒。沙盒与沙盒之间互不影响
这是一个容器,为了防止一个项目的程序运行异常影响其他项目程序的正常运行,可以理解为隔离不同项目的程序,简单来说类似于一个虚拟的盒子或系统,里面运行独立的项目程序,共享系统底层资源。
docker跟项目有什么关系,运维玩就行了
实验室的服务器上,使用Docker部署环境已经有一段时间了,收到的反响还不错。接下来,以Rstudio Server的官方镜像为例子,学习Docker的基本使用方法。
直接来到Rstudio在DockerHub上的官方地址: https://hubdockercom/r/rocker/rstudio ,在一台安装了Docker,但没有容器运行的机器上,直接输入Quickstart下面的一行命令:
机器上若没有 rocker/rstudio 镜像,会花一点时间,将镜像拉到本地。
之后,输入 XXXXXXXXXX:8787 (XXX等表示服务器等IP地址,8787是Rstudio Server的端口),熟悉的登录界面出现,容器运行成功!
根据官方文档说明,此时以用户名 rstudio ,密码 yourpasswordhere ,即可成功登录Rstudio Server。
成功登录Rstudio,命令行开头第一句话 R version 403 (2020-10-10) -- "Bunny-Wunnies Freak Out" 。可是,我们使用的很多R包并没有适配4版本的R,还是需要旧版本的R包。而Rstudio官方提供了带不同R版本的镜像供使用,点击 https://hubdockercom/r/rocker/rstudio/tags 即可查看:
例如,我们要使用36版本的R,只需把命令末尾的 rocker/rstudio 替换为 rocker/rstudio:361 即可。 rocker/rstudio 不添加其他后缀,则默认等效为 rocker/rstudio:latest 。
Docker是什么?
简单得来说,Docker是一个由GO语言写的程序运行的“容器”(Linux containers, LXCs); 目前云服务的基石是操作系统级别的隔离,在同一台物理服务器上虚拟出多个主机。Docker则实现了一种应用程序级别的隔离; 它改变我们基本的开发、操作单元,由直接操作虚拟主机(VM),转换到操作程序运行的“容器”上来。
Docker是为开发者和系统管理员设计的,用来发布和运行分布式应用程序的一个开放性平台。由两部分组成:
Docker Engine: 一个便携式、轻量级的运行环境和包管理器。(注 单OS vs 单线程,是不是跟NodeJS特别像?)
Docker Hub: 为创建自动化工作流和分享应用创建的云服务组成。(注 云端镜像/包管理 vs npm包管理,是不是跟npm特别像?)
从2013年3月20日,第一个版本的Docker正式发布到 2014年6月Docker 10 正式发布,经历了15个月。 虽然发展历程很短,但Docker正在有越来越流行的趋势。
其实Container技术并非Docker的创新,HeroKu, NodeJitsu 等云服务商都采用了类似这种轻量级的虚拟化技术,但Docker是第一个将这这种Container技术大规模开源并被社区广泛接受的。
好的部分
Docker相对于VM虚拟机的优势十分明显,那就是轻量和高性能和便捷性, 以下部分摘自:KVM and Docker LXC Benchmarking with OpenStack
快
运行时的性能可以获取极大提升(经典的案例是提升97%)
管理操作(启动,停止,开始,重启等等) 都是以秒或毫秒为单位的。
敏捷
像虚拟机一样敏捷,而且会更便宜,在bare metal(裸机)上布署像点个按钮一样简单。
灵活
将应用和系统“容器化”,不添加额外的操作系统,
轻量
你会拥有足够的“操作系统”,仅需添加或减小镜像即可。在一台服务器上可以布署100~1000个Containers容器。
便宜
开源的,免费的,低成本的。由现代Linux内核支持并驱动。注 轻量的Container必定可以在一个物理机上开启更多“容器”,注定比VMs要便宜。
生态系统
正在越来越受欢迎,只需要看一看Google的趋势就知道了,docker or LXC
还有不计其数的社区和第三方应用。
云支持
不计其数的云服务提供创建和管理Linux容器框架。
有关Docker性能方面的优势,还可参考此IBM工程师对性能提升的评测,从各个方面比VMs(OS系统级别虚拟化)都有非常大的提升。转载,仅供参考。
0条评论