发展

下图给出了应用部署发展的阶段,即从传统部署到硬件虚拟化,再到容器化。这里我们首先介绍其中的硬件虚拟化技术。

硬件虚拟化

在早期的时候,应用都是直接被安装在操作系统中的。在进行扩展时,我们需要在新的物理机器上安装操作系统,再安装应用,这种方式的问题在于当多个应用共享物理资源时,一个应用可能占用过多的资源,从而影响其他应用的性能。另外,这种方式进行扩展的速度也很慢,需要从物理机器开始,无法快速响应业务的需求。

硬件虚拟化技术的出现,为扩展提供了新的解决方案,硬件虚拟化指的是对计算机的虚拟化,虚拟化对用户隐藏了计算平台的物理特征,仅提供一个抽象的计算平台。

用来控制虚拟化的程序称为 Hypervisor,它可以创建和运行虚拟机。在虚拟机上我们可以安装不同类型的操作系统,包括 Windows、Linux 和 MacOS,虚拟机实例共享虚拟化的硬件资源。Hypervisor 通常分成两类:第一类 Hypervisor 直接在硬件上运行,如 Xen 和微软的 Hyper-V;第二类 Hypervisor 运行在已有的操作系统上,如 VMware Workstation、VMware Player、VirtualBox 和 QEMU。

硬件虚拟化使得我们可以更充分的利用硬件资源,在创建集群时,可以用少数大型服务器替换掉数量较多的小型服务器。在这些服务器上运行 Hypervisor,并根据需要创建和运行虚拟机;在虚拟机上运行操作系统,而在操作系统上运行应用。

在创建虚拟机时我们可以限制虚拟机的 CPU、内存和硬盘等资源,硬件虚拟化可以更好的支持扩展。Hypervisor 可以从镜像文件中快速创建出虚拟机实例,当需要增加应用实例时,我们可以从保存的镜像中创建虚拟机并运行。处理应用的失败也变得简单,只需要创建新的虚拟机实例替换掉出错的即可。

硬件虚拟化的不足之处在于只能以操作系统为单位来进行扩展,操作系统本身也需要占用资源。当虚拟机的数量增加时,很多资源都被虚拟机中的操作系统占用。操作系统级别的虚拟化,也就是容器化,可以在隔离的容器中运行程序。容器中运行的程序只能访问操作系统的部分资源,包括 CPU、内存、文件系统和网络等。目前最流行的容器化实现是 Docker,除此之外,还有 LXC 和 Container Linux 等其他实现。

容器化技术

容器化技术提供了一种更简洁的方式来描述可运行的应用,可运行对运维来说至关重要。以 Java 应用为例,开发人员在本地环境上进行开发和调试,通过持续集成构建出可部署的 JAR 文件。但对运维团队来说,这些 JAR 文件并不是可运行的,因为它们还缺少所依赖的运行时支持,最基本的运行时依赖是 JDK,Java 应用对依赖的 JDK 版本是有要求的,除此之外,Java 应用启动时还可能需要额外的参数,这些信息并不包含在 JAR 文件中。因此运维团队需要从开发团队中获取这些信息,开发团队通常使用文档来说明如何运行应用,而文档本身很容易与代码产生不一致。

使用容器化技术所创建的镜像包含了应用所依赖的全部内容。一个 Java 应用的镜像,除了包含应用本身的 JAR 文件之外,还包含所需的 JDK 和如何启动应用的信息。容器的镜像是自包含的,同时也是可运行的。运维团队所做的仅仅是从镜像中创建容器并运行。这就进一步明确开发和运维团队的职责,开发团队负责创建应用对应的镜像,而运维团队只负责管理基础设施和容器的运行。

如下图所示,在容器化的部署方式中,应用镜像是开发团队和运维团队的唯一交集。

容器镜像的最大优势是不可变,不可变性在运维中的作用巨大,这一点和虚拟机镜像类似,但是容器镜像更加轻量级。在进行版本更新时,如果出现未预期的问题,只需要用上一个版本的镜像重新运行容器,就可以快速回退。当在生产环境中发现问题时,开发人员可以在本地环境上运行同样版本的镜像来重现问题。

容器化解决了不同环境之间的一致性问题,开发团队产出的应用镜像,经过测试团队的测试之后,被部署到生产环境中。开发、测试和生产环境使用的是同样的不可变镜像,这样的一致性对于应用的更新至关重要。

虽然容器对所运行的进程数量没有限制,但是一般容器只运行一个进程。为了运行应用,除了应用本身的容器之外,应用所需的其他服务也运行在各自的容器中,这就要求协调不同容器的运行。容器编排工具的作用就是解决这个问题,常见的容器编排工具包括 Kubernetes、Docker Swarm 和 Apache Mesos。

Docker

在众多容器化技术中,Docker 是最流行的一个,采用客户端 — 服务器的架构。服务器端是 Docker 后台程序,负责构建、运行和分发容器;客户端则通过 REST API 与 Docker 后台程序交互。

Docker 中两个最重要的概念是镜像和容器,镜像是创建容器的只读模板,可以从 Docker 注册表中下载,也可以创建自定义镜像。Docker Hub 是默认的镜像注册表,包含了非常多可用的镜像,企业内部也可以搭建自己私有的注册表。镜像虽然是不可变的,但是可以在已有的镜像上进行定制,得到新的镜像,这也是通常创建镜像的方式。容器是镜像的可运行实例,从镜像中创建出来的容器,可以被启动、暂停、停止和删除。

Docker的安装
Docker 的安装很简单。在本地开发环境中,Windows 和 MacOS 可以安装 Docker Desktop,对于 Docker Desktop 不支持的 Windows 版本,可以安装 Docker Toolbox;在 Linux 上则需要安装 Docker Engine。

安装完成之后,相关的操作可通过 docker 命令来执行。

运行容器
当使用 docker run 命令运行容器时需要指定镜像的名称。下面的代码是运行 Nginx 对应的镜像,nginx 是镜像的名称;镜像名称前面没有注册表的地址,默认从 Docker Hub 获取,镜像名称之后的 1.17 是镜像的标签,用来区分不同的版本;–name 参数用来指定容器的名称。

$ docker run --name nginx nginx:1.17

docker run 运行的容器默认在前台运行,我们也可以使用 -d 参数让容器在后台运行。容器启动之后,可通过 docker ps 命令来查看运行容器的状态,容器运行之后,我们可以使用 docker exec 在容器中执行命令。下面的命令在名为 nginx的 容器中执行 hostname 命令。

$ docker exec nginx hostname

对于运行的容器,则可以通过 docker logs 命令来查看日志,如 docker logs nginx。

有些镜像在创建时提供了可以进行配置的环境变量。在运行容器时,可以使用 -e 参数来传递环境变量。下面的命令运行的是 MySQL 8 容器,并指定了 root 用户的密码和数据库名称。

$ docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=myrootpassword -e MYSQL_DATABASE=demo mysql:8

镜像创建

在应用开发中,我们通常需要从已有的镜像中创建自定义的镜像,镜像的创建方式可通过 Dockerfile 文件来描述。以 Java 应用为例,我们需要以 OpenJDK 的镜像为基础,把 JAR 文件作为镜像的一部分,并设置正确的启动参数。

以 Spring Boot 应用为例,下面的 Dockerfile 文件被用来创建该应用的镜像。在 Dockerfile 中:
FROM 声明了基础的镜像名称;
ADD 用来添加应用的 JAR 文件到指定目录;
CMD 声明了容器启动时执行的命令。

FROM openjdk:8
ADD target/*.jar /opt/app.jar
CMD java -jar /opt/app.jar

完成之后我们再通过 docker build 命令构建镜像,-t 参数为创建的镜像指定名称和标签,在构建时需要提供 Dockerfile 所在的目录,命令中的“.”表示当前目录。

$ docker build -t myapp:1.0 .

镜像创建完成之后,我们通过 docker run 命令来运行:

$ docker run myapp:1.0

参考:拉勾教育

容器化技术和Docker相关推荐

  1. 容器化技术(Docker相关)

    容器化技术的背景是什么? 在软件开发过程中环境配置永远是最让人头疼的在开发之前我们需要准备各种运行环境.IDE及辅助工具同时软件部署也为程序员的谢顶助力三分. 搭建不同语言.不同技术栈适配的运行环境还 ...

  2. 容器化技术之Docker入门

    一.Docker简介 1.1 什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器.网络.内存及存储等,予以抽象.转换后呈现出来 ...

  3. Docker容器化技术教程,24小时快速入门

    Docker介绍 Docker简介和安装 Docker是什么 为什么使用Docker 和普通虚拟机的对比 打包.分发.部署 小结 Docker部署的优势 Docker通常用来做什么 重要概念:镜像.容 ...

  4. 容器化技术最佳实践1--容器化技术简介与Docker入门

    容器化技术最佳实践1–容器化技术简介与Docker入门 文章目录 容器化技术最佳实践1--容器化技术简介与Docker入门 容器化简介 通过虚拟化了解容器化 对开发和运维的好处 容器化部署特点 什么情 ...

  5. Linux 容器化技术详解(虚拟化、容器化、Docker)

    虚拟化是过去用来充分利用物理资源的最常用方法.早年间,我们可以用一台服务器运行一个操作系统,处理一个任务,带来的问题是资源利用率极其不足,计算机的潜能并不能完全发挥,而后多道批处理系统.分时系统相继出 ...

  6. 万字长文带你探究 Docker 容器化技术背后的黑科技

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 容器的优势 传统模式的部署,直接将多个应用运行在物理服务器上,如果其中一个应用占用了大部分资源,可能会导致其他应用 ...

  7. Docker 容器化技术(介绍)

    1 虚拟化技术 因为 Docker 的容器化技术是虚拟化的一种体现形式,因此 我们要学习容器化技术之前,需要先来了解一下什么是虚拟化技术: 1.1 什么是虚拟化技术 在计算机中,虚拟化(英语:Virt ...

  8. Docker容器化技术

    一.虚拟机与容器的比较 在容器化技术出来之前,使用的是虚拟机技术,虚拟机和Docker容器技术都是一种虚拟化技术 虚拟机包含的是整个操作系统的原生镜像,非常的庞大,而docker的镜像只包含最核心的环 ...

  9. 容器化技术与微服务结合---docker(一)

    目录 系列 微服务 docker场景 mac上docker安装 系统要求 安装 linux上docker安装 Docker的一些命令 springcloud结合docker部署 docker buil ...

最新文章

  1. 【node】Sequelize常用操作、基本增删改查
  2. 记一次 解决 vue 兼容ie11 的问题
  3. SpringBoot的配置详解application
  4. DataGrid动态绑定模板列
  5. 弄潮儿数据_SINX 信息数据的“弄潮儿”
  6. 搜狗浏览器收藏夹在哪_chrome谷歌浏览器收藏夹在哪_chrome收藏夹在电脑什么位置...
  7. 敏捷开发般若敏捷系列之四:如何推广敏捷(上)(无我,无人,无众生)
  8. 直接获取Program Files目录的API
  9. 五步构建经营指标,拒绝分析不接地气
  10. 微服务: 立志做个伟大的项目
  11. 外币兑换c语言编程,货币转换 C
  12. 在有n个学生的成绩表里,每条信息由姓名与分数组成,要求:1按分数高低次序,输出每个学生的名字,分数相同的为同一名次,2按名次输出每个学生的姓名与分数。
  13. org.springframework.jdbc.BadSqlGrammarException: Error updating database
  14. python中shape[0~3]的意思
  15. java如何虚拟ip_Linux建立虚拟ip的方法
  16. Unity 的协程的原理
  17. UE4灰度图生成地图记录blender生成城市地形
  18. 学习笔记19—dpabi错误集
  19. APK应用程序的解包、修改、编辑、打包及应用(三)
  20. F2FS源码分析-2.3 [F2FS 读写部分] F2FS的一般文件读流程分析

热门文章

  1. iis日志分析 seo必备技能
  2. php和html关于读取文件的小项目
  3. JavaScript简介及JavaScript中的关键保留字、变量和数据类型
  4. 100M和1000M网线做法
  5. Go语言GoFrame开发框架
  6. ora-00600 [25027]
  7. mysql查询和更改时区
  8. CityMaker学习教程14 水面图层的创建
  9. 心血漏洞(OpenSSL升级)
  10. AQS是什么?都是怎么用的?