什么是docker?docker有什么优缺点?

2023-11-15

Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。

docker简介

Docker是一个开源的应用容器引擎,是一个轻量级容器技术。Docker支持将软件编译成一个镜像,然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使 用这个镜像,运行中的这个镜像称为容器,容器启动是非常快速的。

docker核心概念

docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);
docker客户端(Client):客户端通过命令行或者其他工具使用Docker
API(https://docs.docker.com/reference/api/docker_remote_api)
与 Docker 的守护进程通信
docker仓库(Registry):用来保存各种打包好的软件镜像;
docker镜像(Images):Docker 镜像是用于创建 Docker 容器的模板。
docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用
镜像是一种静态的结构,可以看成面向对象里面的类,而容器是镜像的一个实例。

docker与虚拟机的区别

虚拟机也是一种虚拟化技术,它与 Docker 最大的区别在于它是通过模拟硬件,并在硬件上安装操作系统来实现。

启动虚拟机需要先启动虚拟机的操作系统,再启动应用,这个过程非常慢;
而启动 Docker 相当于启动宿主操作系统上的一个进程。

虚拟机是一个完整的操作系统,需要占用大量的磁盘、内存和 CPU 资源,一台机器只能开启几十个的虚拟机。
而 Docker 只是一个进程,只需要将应用以及相关的组件打包,在运行时占用很少的资源,一台机器可以开启成千上万个 Docker。

docker优点

1、部署方便

你一定还有印象,在我们最开始学习编程的时候,搭建环境这一步往往会耗费我们好几个小时的时间,而且其中一个小问题可能需要找很久才能够解决。你还会得到关于环境搭建方面的团队其他成员的求助。而有了容器之后,这些都变得非常容易,你的开发环境就只是一个或者几个容器镜像的地址,最多再需要一个控制部署流程的执行脚本。或者进一步将你的环境镜像以及镜像脚本放入一个git项目,发布到云端,需要的时候将它拉到本地就可以了。

2、部署安全

当我们收到一个bug反馈的时候,很多时候心里面的第一反应一定是“我本地是好的啊”!这种情况的发生就在于环境的不一致,我们在开发过程中的调试往往不能保证其他环境的问题,但是我们却要为此买单,这真是一件令人苦恼的事情。有了容器之后,这将很少发生。我们可以通过容器技术将开发环境和测试环境以及生产环境保持版本和依赖上的统一,保证代码在一个高度统一的环境上执行。而测试环境的统一,也同样能解决CI流程对环境的要求。

3、隔离性好

不管是开发还是生产,往往我们一台机器上可能需要跑多个服务,而服务各自需要的依赖配置不尽相同,假如说两个应用需要使用同一个依赖,或者两个应用需要的依赖之间会有一些冲突,这个时候就很容易出现问题了。所以同一台服务器上不同应用提供的不同服务,最好还是将其隔离起来。而容器在这方面有天生的优势,每一个容器就是一个隔离的环境,你对容器内部提供服务的要求,容器可以自依赖的全部提供。

4、快速回滚

容器之前的回滚机制,一般需要基于上个版本的应用重新部署,且替换掉目前的问题版本。在最初的时代,可能是一套完整的开发到部署的流程,而执行这一套流程往往需要很长的时间。在基于git的环境中,可能是回退某个历史提交,然后重新部署。这些跟容器技术相比都不够快,而且可能会引起新的问题(因为是基于新版本的修改)。而容器技术天生带有回滚属性,因为每个历史容器或者镜像都会有保存,而替换一个容器或者某个历史镜像是非常快速和简单的。

5、成本低

这可能是一个最明显和有用的优点了,在容器出现之前,我们往往构筑一个应用就需要一台新的服务器或者一台虚机。服务器的购置成本和运维成本都很高,而虚机需要占用很多不必要的资源。相比之下,容器技术就小巧轻便的多,只需要给一个容器内部构建应用需要的依赖就可以了,这也是容器技术发展迅速的最主要原因。

6、管理成本更低

随着大环境的发展,docker等容器的使用和学习的成本也是愈发降低,成为更多开发者和企业的选择。

docker缺点

1、隔离性

基于hypervisor的虚机技术,在隔离性上比容器技术要更好,它们的系统硬件资源完全是虚拟化的,当一台虚机出现系统级别的问题,往往不会蔓延到同一宿主机上的其他虚机。但是容器就不一样了,容器之间共享同一个操作系统内核以及其他组件,所以在收到攻击之类的情况发生时,更容易通过底层操作系统影响到其他容器。当然,这个问题可以通过在虚机中部署容器来解决,可是这样又会引出新的问题,比如成本的增加以及下面要提到的问题:性能。

2. 性能

不管是虚机还是容器,都是运用不同的技术,对应用本身进行了一定程度的封装和隔离,在降低应用和应用之间以及应用和环境之间的耦合性上做了很多努力,但是随机而来的,就会产生更多的网络连接转发以及数据交互,这在低并发系统上表现不会太明显,而且往往不会成为一个应用的瓶颈(可能会分散于不同的虚机或者服务器上),但是当同一虚机或者服务器下面的容器需要更高并发量支撑的时候,也就是并发问题成为应用瓶颈的时候,容器会将这个问题放大,所以,并不是所有的应用场景都是适用于容器技术的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是docker?docker有什么优缺点? 的相关文章

  • 如何在 Linux 主机上的 docker 容器中挂载目录 [重复]

    这个问题在这里已经有答案了 我想将一个目录从 docker 容器挂载到本地文件系统 该目录是网站根目录 我需要能够使用任何编辑器在本地计算机上编辑它 我知道我可以跑docker run v local path container path
  • “grep -q”的意义是什么

    我正在阅读 grep 手册页 并遇到了 q 选项 它告诉 grep 不向标准输出写入任何内容 如果发现任何匹配 即使检测到错误 也立即以零状态退出 我不明白为什么这可能是理想或有用的行为 在一个程序中 其原因似乎是从标准输入读取 处理 写入
  • python:numpy 运行脚本两次

    当我将 numpy 导入到 python 脚本中时 该脚本会执行两次 有人可以告诉我如何阻止这种情况 因为我的脚本中的所有内容都需要两倍的时间 这是一个例子 usr bin python2 from numpy import print t
  • 如何更改“docker createvolume”命令的默认位置?

    当通过卷 API 创建卷时 也就是说 容器卷模式现在不一定是最佳实践 docker volume inspect test data Name test data Driver local Mountpoint var lib docker
  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • 为什么 tty 在命令完成后挂起?

    我想运行这样的命令 kubectl run busybox it rm restart Never image busybox command sh c env 预计运行命令并删除 pod 它打印变量 但随后终端冻结 尽管 pod 处于完成
  • 如何使用本地 nuget 包源进行 Dockerfile dotnet 恢复 [重复]

    这个问题在这里已经有答案了 我正在尝试使用本地 nuget 包进行 dotnet 恢复 我尝试按照本教程进行操作 无需互联网即可恢复 dotnet https blog bigfont ca dotnet restore without a
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • 如何获取 linux 实用程序 tail 的源代码?

    这个命令确实非常有用 但是我可以在哪里获取源代码以查看内部发生的情况 thanks tail 实用程序是 Linux 上 coreutils 的一部分 源压缩包 ftp ftp gnu org gnu coreutils coreutils
  • 如何用X11复制到剪贴板?

    使用 OS X 上的框架 我可以使用以下命令将 PNG 复制到粘贴板 在 C 中 显然我可以将 NSPasteboard 与 Cocoa 一起使用 include
  • 如何在我的 AWS EC2 实例上安装特定字体?

    我有一个在 AWS EC2 Amazon Linux Elastic Beanstalk 实例上运行的 Python 应用程序 该实例需要某些特定字体才能生成输出 并且想知道如何在部署或实例启动过程中安装它们 我的代码在本地计算机 OS X
  • 如何让 clangd 转向 c++20

    当没有其他信息时 如何让 clangd 回退到 c 20 例如 在第一次构建之前 cmake 可以生成一个 这是在带有最新 LLVM 的 Arch Linux 上 这是通过 Emacs LSP 运行的 但这应该没有什么区别 你可以加 Com
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • 无法安装 WWW::Curl::Easy: SZBALINT/WWW-Curl-4.17.tar.gz : make NO

    我正在尝试在我的 Fedora 26 机器上安装 WWW Curl Easy gcc c I usr include D REENTRANT D GNU SOURCE O2 g pipe Wall Werror format securit
  • 无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

    我正在尝试安装 pysam 执行后 python path to pysam master setup py build 这个错误的产生是 unable to execute x86 64 conda cos6 linux gnu gcc
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 无法在 Google Cloud Run 上部署 Ubuntu 20.04 Docker 容器

    我正在尝试通过 Google Cloud Run 部署一个基于 Ubuntu 20 04 的简单的基于 Python 的 Docker 容器 我已经成功构建了映像 但是当我尝试部署 Cloud Run 服务时 出现以下错误 省略了项目详细信

随机推荐

  • 微信小程序中实现车牌输入功能

    一 成品展示与介绍 在点击输入框的时候会弹出车牌输入键盘 二 相关思路解析 首先车牌号码由31位汉字 26位字母 10位数字组成的 开头第一位由省份简称的汉字 第二位字母根据省份下的城市或地区区分 最后的五位或者六位 是有字母和数字组成的
  • 开发工具篇 程序员计算器

    BYTE数据 到16进制 10进制
  • JVM--基础--27.2--工具--VisualVM--远程连接

    JVM 基础 27 2 工具 VisualVM 远程连接 1 准备工作 准备工作是为了测试使用 1 1 代码地址 https gitee com DanShenGuiZu learnDemo tree master visualvm lea
  • c#读取html 表格,c# – 如何将文本文件读取到DataTable

    我想从txt文件中提取数据并将其放入DataTable中 txt文件中的内容采用以下格式 sometext1 sometext2 sometext3 sometext4 sometext5 sometext6 sometext7 somet
  • java获取实时天气预报数据

    数据是从 www webxml com cn上免费获取的 有需要也可以去购买服务 api可以去该网站查看 这里用的是GET方式请求 每个城市citycode 也需要从这个网站上面去下载 解析xml用到的是xwork core 2 3 15
  • 月薪快6万了!

    和一位本科师兄约饭 比我大一级 当年他的成绩很好 完全能够保送更好高校的研究生 但在大家纷纷从众去读研的时候 他选择了直接工作 去了西二旗一家大厂 具体哪家这里就不明说了 圈子很小 很容易被定位 我问了下他目前的薪资情况 他说了几个数字 现
  • 第一章矩阵及其应用

    矩阵逆运算规律 由于矩阵运算默认不满足交换律 即AB BA 但若存在一钟矩阵B 满足AB BA 就满足了交换律 单位矩阵就是特殊的一种AB BA 单位矩阵定义是这样的 lt 设A为n阶方阵 则A aE aE A aA gt 也就是说 数量阵
  • Oracle 的drop table if exists功能

    Mysql 创建表之前判断表是否存在 如果存在则删除已有表 DROP TABLE IF EXISTS SH PLACARD INFO Oracle 创建表之前判断表是否存在 如果存在则删除已有表 declare num number beg
  • 如何使用JMeter进行压力测试

    一 前期准备 首先需要在官网下载jmeter 下载完之后打开bin目录下的jmeter bat 在jmeter bat中对所要压测的接口进行压力测试 二 具体步骤 1 创建线程组 在线程组中设置线程的个数 持续时间和循环次数 如下图所示 2
  • PMI632

    1 目录 drivers power supply qcom qpnp smb5 c charger driver drivers power supply qcom smb5 lib c 依赖的SMB library arch arm64
  • CTF_Web:php伪随机数mt_rand()函数+php_mt_seed工具使用

    CTF Web php伪随机数mt rand函数漏洞 0x00 问题描述 0x01 mt rand函数 0x02 CTF例题 0x03 php mt seed工具使用 0x04 参考文章 0x00 问题描述 最近在题目练习的时候遇到了一个伪
  • Gulp入门使用(一)

    Gulp入门使用教程 Gulp的简介 为什么是Gulp 安装Gulp 创建Gulp项目 目录结构 第一个Gulp任务 Gulp执行预处理 Node中的通配符 监听Sass文件 使用Browser Sync自动刷新 Gulp的简介 gulp
  • 开学c语言测试,初学c语言之开学第一次打卡

    近日开学 忙了好多事 因此隔了好久才写了这篇博客 话少 就直接进入正题了 数数字问题 这是题目 输入一个整数 输出每个数字对应的拼音 当整数为负数时 先输出fu字 十个数字对应的拼音如下 0 ling 1 yi 2 er 3 san 4 s
  • 签约多方共建石嘴山智慧康养新模式

    5月13日 百度智能云与石嘴山市民政局 中国电信股份有限公司石嘴山分公司 中国银行股份有限公司石嘴山市分行 石嘴山市青鸟颐居养老服务有限公司在宁签订 石嘴山市智慧康养战略合作协议 将发挥各自优势 合力推进智慧康养产业高质量发展 提高智慧养老
  • 解决 ios 输入框属性--placeholder--不显示

    在我们写移动端项目时 会发现在IOS手机上 部分输入框的默认文字会隐藏 在此提供一套解决方法 此方法已经历过实际项目的测试 可放心的应用于实战 将此段js代码放置在项目的公共js文件中即可 if placeholder in documen
  • 海湾汉字编码表全部_汉字编码简明对照表

    汉字编码简明对照表 说明 1 下列汉字取自国标 GB 2312 80 中的分级与排列内容 包含所有的第一级汉字和第二级汉字中的常用部分 2 第一级汉字 16 55区的汉字 以拼音字母为序进行排列 同音字以笔形顺序横 竖 撇 捺 折为序 起笔
  • 生成式对抗网络(GAN)-(Generative Adversarial Networks)算法总结(从原始GAN到....目前)

    本文将按时间顺序总结gan的paper 非所有 会挑选个人认为比较重要的 并将参考其它博客 会给出链接 如有侵权 请私信删除 更新于 19 IS 可以反应图像的生成质量 越大越好 FID 则会更假注重生成的多样性 越小越好 IS score
  • mysql评审_第3章 代码检查、走查与评审

    代码检查与走查 代码检查 走查以及可用性测试是三种主要的人工测试方法 人工测试技术在查找错误方面非常有效 应该在程序开始编码之后 基于计算机的测试开始之前使用这些方法 本章主要介绍的是代码检查与走查的相似之处 而它们的不同之处将在后续章节中
  • Apache和Tomcat

    一 Apache和Tomcat的区别 Apache只是一个Web服务器 可以作为独立的web服务器来运行 不过只支持静态网页 如 asp PHP cgi jsp 等动态网页的就显得无能为力 Tomcat也可以作为独立的web服务器来运行 但
  • 什么是docker?docker有什么优缺点?

    Docker的思想来自于集装箱 集装箱解决了什么问题 在一艘大船上 可以把货物规整的摆放起来 并且各种各样的货物被集装箱标准化了 集装箱和集装箱之间不会互相影响 那么我就不需要专门运送水果的船和专门运送化学品的船了 只要这些货物在集装箱里封