当前位置: 首页 > news >正文

d1.Docker 介绍和基础操作

Docker 介绍和基础操作

    • 1. Docker 介绍
      • 1.1 Docker 的主要目标
      • 1.2 使用Docker 容器化封装应用程序的意义
      • 1.3 容器和虚拟机技术比较
      • 1.4 容器和虚拟机表现比较
      • 1.5 Docker 的组成

1. Docker 介绍

容器是一种 IT 技术。容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装 箱一样,把你的应用装起来。这样,应用与应用之间就有了边界而不会相互干扰;同时装在沙盒里面的应 用,也可以很方便的被搬来搬去,这也是 PaaS 想要的最理想的状态(可移植性,标准化,隔离性)。

容器是软件工业上的集装箱的技术,集装箱的标准化,减少了包装成本,大大提高货物运输和装卸效 率,是传统运输行业的重大变革。早期的软件项目中软件更新,发布低效,开发测试发布周期很长,很 难敏捷。有了容器技术,就可以利用其标准化的特点,大幅提高生产效率。

容器技术是虚拟化、云计算、大数据之后的一门新兴的并且是炙手可热的新技术, 容器技术提高了硬件 资源利用率、 方便了企业的业务快速横向扩容(可以达到秒级快速扩容)、 实现了业务宕机自愈功能 (配合K8S可以实现,但OpenStack无此功能),因此未来数年会是一个容器愈发流行的时代 ,这是 一 个对于 IT 行业来说非常有影响和价值的技术,而对于IT行业的从业者来说, 熟练掌握容器技术无疑是一 个很有前景的行业工作机会。

Docker (码头工人)是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司(后由于 Docker 开 源后大受欢迎就将公司改名为 Docker Inc ,总部位于美国加州的旧金山)内部的一个开源的 PAAS 服务 (Platform as a ServiceService )的业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入 了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。

Docker 是基于 Linux 内核实现,Docker 最早采用 LXC 技术 ,LXC 是 Linux 原生支持的容器技术 ,可 以提供轻量级的虚拟化 ,可以说 docker 就是基于 LXC 发展起来 的,提供 LXC 的高级封装,标准的配 置方法,在LXC的基础之上,docker提供了一系列更强大的功能。而虚拟化技术 KVM(KernelKernelbased Virtual Machine Machine) 基于 模块实现, 后来Docker 改为自己研发并开源的 runc 技术运行 容器,彻底抛弃了LXC。

Docker 相比虚拟机的交付速度更快,资源消耗更低,Docker 采用客户端/服务端架构,使用远程API来 管理和创建容器,其可以轻松的创建一个轻量级的、可移植的、自给自足的容器,docker 的三大理念是 build(构建)、ship(运输)、 run(运行),Docker遵从apache 2.0协议,并通过(namespace及cgroup 等)来提供容器的资源隔离与安全保障等,所以Docke容器在运行时不需要类似虚拟机(空运行的虚拟 机占用物理机6-8%性能)的额外资源开销,因此可以大幅提高资源利用率,总而言之Docker是一种用了新颖方式实现的轻量级虚拟机.类似于VM但是在原理和应用上和VM的差别还是很大的,并且docker的专 业叫法是应用容器(Application Container)。

1.1 Docker 的主要目标

Build, Ship and Run Any App, Anywhere,即通过对应用组件的封装(Packaging)、分发 (Distribution)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的 “一次封装,到处运行”。这里的应用组件,既可以是一个Web应用,也可以是一套数据库服务,甚至是 一个操作系统。将应用运行在Docker 容器上,可以实现跨平台,跨服务器,只需一次配置准备好相关的 应用环境,即可实现到处运行,保证研发和生产环境的一致性,解决了应用和运行环境的兼容性问题, 从而极大提升了部署效率,减少故障的可能性

1.2 使用Docker 容器化封装应用程序的意义

  • 统一基础设施环境-docker环境

    • 硬件的组成配置
    • 操作系统的版本
    • 运行时环境的异构
  • 统一程序打包(装箱)方式-docker镜像

    • java程序
    • python程序
    • nodejs程序

  • 统一程序部署(运行)方式-docker容器
    • java-jar…→ docker run…
    • python manage.py runserver… → docker run…
    • npm run dev … → docker run…

1.3 容器和虚拟机技术比较

  • 传统虚拟机是虚拟出一个主机硬件,并且运行一个完整的操作系统 ,然后在这个系统上安装和运行软 件
  • 容器内的应用直接运行在宿主机的内核之上,容器并没有自己的内核,也不需要虚拟硬件,相当轻量化
  • 每个容器间是互相隔离,每个容器内都有一个属于自己的独立文件系统,独立的进程空间,网络空间,用 户空间等,所以在同一个宿主机上的多个容器之间彼此不会相互影响

1.4 容器和虚拟机表现比较

  • 资源利用率更高: 开销更小,不需要启动单独的虚拟机OS内核占用硬件资源,可以将服务器性能压榨 至极致.虚拟机一般会有5-20%的损耗,容器运行基本无损耗,所以生产中一台物理机只能运行数十个 虚拟机,但是一般可以运行数百个容器
  • 启动速度更快: 可以在数秒内完成启动
  • 占用空间更小: 容器一般占用的磁盘空间以MB为单位,而虚拟机以GB
  • 集成性更好: 和 CI/CD(持续集成/持续部署)相关技术结合性更好,实现打包镜像发布测试可以一 键运行,做到自动化并快速的部署管理,实现高效的开发生命周期

使用虚拟机是为了更好的实现服务运行环境隔离,每个虚拟机都有独立的内核,虚拟化可以实现不同操 作系统的虚拟机,但是通常一个虚拟机只运行一个服务,很明显资源利用率比较低且造成不必要的性能 损耗,我们创建虚拟机的目的是为了运行应用程序,比如Nginx、PHP、Tomcat等web程序,使用虚拟 机无疑带来了一些不必要的资源开销,但是容器技术则基于减少中间运行环节带来较大的性能提升。

根据实验,一个运行着CentOS的KVM虚拟机启动后,在不做优化的情况下,虚拟机自己就需要占用 100~200 MB内存。此外,用户应用运行在虚拟机里面,它对宿主机操作系统的调用就不可避免地要经 过虚拟化软件的拦截和处理,这本身又是一层性能损耗,尤其对计算资源、网络和磁盘I/O的损耗非常 大。

比如: 一台96G内存的物理服务器,为了运行java程序的虚拟机一般需要分配8G内存/4核的资源,只能 运行13台左右虚拟机,但是改为在docker容器上运行Java程序,每个容器只需要分配4G内存即可,同样 的物理服务器就可以运行25个左右容器,运行数量相当于提高一倍,可以大幅节省IT支出,通常情况下 至少可节约一半以上的物理设备

1.5 Docker 的组成

  • Docker 主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机, node节点
  • Docker 服务端(Server): Docker守护进程,运行docker容器
  • Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用docker API Docker 镜像(Images): 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
  • Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库 harbor
  • Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中 的程序启动后生成的进程

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Springboot集成Proguard生成混淆jar包
  • 生成式AI及其对API和软件开发的影响
  • 大数据面试SQL(五):查询最近一笔有效订单
  • 基于树莓派4B设计的智能家居控制系统(阿里云IOT)(203)
  • 【Vue】Echarts渲染数据,残留脏数据问题处理
  • k8s笔记之应用创建
  • Apache Tomcat服务器版本号隐藏
  • Qt之Gui
  • springboot二手书资源管理系统-计算机毕业设计源码26338
  • [VBA]使用VBA在Excel中 操作 形状shape 对象
  • 全屏组件封装(react18+antd)
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • 【实现开机自动下载原神(bat脚本)1.0】
  • PythonStudio 控件使用常用方式(十六)TButtonedEdit
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【2.4】导出RKNN模型(第一部分:模型修改)更多内容见视频
  • 分享一款快速APP功能测试工具
  • [nginx文档翻译系列] 控制nginx
  • “大数据应用场景”之隔壁老王(连载四)
  • ES6--对象的扩展
  • gcc介绍及安装
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Laravel 中的一个后期静态绑定
  • laravel5.5 视图共享数据
  • Next.js之基础概念(二)
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • React系列之 Redux 架构模式
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vue2.x学习三:事件处理生命周期钩子
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 好的网址,关于.net 4.0 ,vs 2010
  • 聊聊flink的BlobWriter
  • 你不可错过的前端面试题(一)
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 深度学习中的信息论知识详解
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​人工智能书单(数学基础篇)
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #QT(智能家居界面-界面切换)
  • (4)事件处理——(7)简单事件(Simple events)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (libusb) usb口自动刷新
  • (搬运以学习)flask 上下文的实现
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (全注解开发)学习Spring-MVC的第三天
  • .aanva
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net core 管理用户机密