【学习笔记】Docker - 01. Docker是啥

我只是把之前的学习笔记整理一下,贴到这里,可能会显得比较凌乱。

1.1 啥是Docker?

 

Docker 是一个开源项目,它被用来做构建、打包和运行程序。它是一个命令行程序,一个后台进程,也是一组使用逻辑方法来解决常见软件问题的远程服务,让你可以简化安装、运行、发布、删除软件的体验。它是通过一种叫做容器的操作系统技术来实现这些功能的。

 

1.1.1 Hello World

前提条件:安装Docker,需要互联网连接。

命令docker run dockerinaction/hello_world

 

docker run,它告诉docker你想触发这一系列动作:在容器内安装和运行程序

640?wx_fmt=png

命令的第二部分指明了你想在容器里运行的程序, 本例中就是 dockerinaction/hello_world, 它叫做镜像 (image) 名 (有时候也叫做仓库 repository). 从现在开始, 你就可以把镜像的名字作为你想安装或运行的程序名. 镜像本身就是一组文件和元数据. 其中元数据包括了要运行的特定程序和相关配置.

·         本例容器运行结果就是输出一个“hello world”, 输出完, 程序就退出了. 这时容器的状态被标记为 stopped.

·         容器的运行状态直接和容器内的单个运行程序的状态是绑定的. 如果一个程序在运行状态, 那么容器也在运行状态; 如果这个程序是出于停止状态的, 那么容器也是停止状态的.

·         重启容器将会重新运行该程序.

 

当你第二次运行该命令的时候:

 

640?wx_fmt=png


1.1.2 容器

历史上, UNIX风格的操作系统使用jail这个术语来描述一个被修改的运行时环境, 意思是它会把jailed的程序可访问的资源限制在一定范围之内.

任何使用Docker运行的软件都是放在容器内的. Docker使用现有的容器引擎来提供根据最佳实践来构建的一致容器, 这就为每个人提供了更大的安全保障.

使用Docker, 用户获得容器的成本要低得很, 因为Docker会帮助你处理这一切.

 

1.1.3 容器不是虚拟化

·         与虚拟机不一样, Docker容器不使用任何的硬件虚拟化. 在Docker容器内运行的程序直接与主机的Linux内核交互.

o    许多程序是可以独立运行的, 对操作系统没有更多的依赖, 页不需要忍受整个启动过程造成的延迟

o    这是一个非常重要的区别.

o    Docker不是虚拟化技术.

o    它帮助你使用你操作系统内核已经存在的容器技术.

·         你可以在操作系统为现代Linux的虚拟机里面使用Docker.

 

1.1.4 容器中运行软件为的是隔离性

·         Docker 使用 Linux命名空间和cgroups, cgroups自从2007年开始就成为了Linux 的一部分.

·         Docker 本身并不提供容器技术, 但是它使得容器技术可以更简单的使用

·         

640?wx_fmt=jpeg

在这里CLI运行在user space内存里, 和其它程序一样, 也是运行在操作系统之上. 理想状态下, 在user space里运行的程序无法修改内核空间(kernel space)内存. 更广泛的说, 操作系统是所有用户程序和支撑计算机运行的硬件之间的接口.

·         

640?wx_fmt=jpeg

你可以看见, 运行Docker其实意味着在user space 里面运行两个程序.

o    Docker 引擎, 如果安装适当的话, 这个进行会一直运行的.

o    Docker CLI, 这额是用户交户的Docker程序. 如果你想开始, 停止, 或安装软件, 你就会向Docker程序发送一个相应的命令.

上图中, 你可以看三个正在运行的程序, 每一个都是作为Docker引擎的子进程运行的, 外边包裹着一个容器.

o    委托进程是运行在user space的自己的内存子空间里.

o    运行在容器内的程序至可以访问它们自己的内存和资源, 也就是容器限定的内存和资源.

 

·         Docker构建容器时(构建容器在运行时)使用了10个主要的系统特性:

o    PID namespace—Process identifiers and capabilities

o    UTS namespace—Host and domain name

o    MNT namespace—File system access and structure

o    IPC namespace—Process communication over shared memory

o    NET namespace—Network access and structure

o    USR namespace—User names and identifiers

o    chroot()—Controls the location of the file system root

o    cgroups—Resource protection

o    CAP drop—Operating system feature restrictions

o    Security Modules—Mandatory access controls

1.1.5 Shipping Containers 运输容器

你可以把Docker容器看作物理运输使用的集装箱一样. 它就是一个箱子, 在这里你可以存储和运行应用程序及其所有的依赖项(除了运行操作系统内核这一条). 和起重机, 开车, 火车, 轮船可以很方便的使用集装箱一样, 用Docker来运行, 复制, 分发容器也是非常简单的. 而且Docker让这个传统的集装箱比喻更加完整, 它加入了打包和分发软件的方式. 负责运输容器的组件就叫做镜像 image.

 

前面的例子里的镜像只包含一个文件, 一个linux的可执行程序.

·         而一般来说, Docker镜像是容器内运行的程序需要用到的所有文件的一个捆绑的快照.

·         从一个镜像, 你可以创建任意个容器, 这些容器都是从同一个镜像作为起点来创建的, 它们并不会共享对文件系统的修改.

·         当你使用Docker分发软件的时候, 你使用这些镜像来进行分发, 其它的计算机也是通过这些镜像来创建容器的.

·         镜像就是Docker生态里可运输的单元.

 

 

1.2 Docker 解决了什么问题?

·         使用软件是一件非常复杂的事.

o    在安装软件前, 你需要考虑使用哪个操作系统,

o    软件所需的资源,

o    已经安装了哪些软件,

o    它还依赖于其它哪些软件.

o    还需要决定软件应该安装在哪,

o    然后你还需要知道如何去安装它.

现在各个软件的安装过程差别也非常大, 所以安装软件其实是非常复杂且没有一致性的操作. 如果你想让多台电脑在不同时刻使用相同的一套软件, 那么情况只会更加糟糕.

大部分人的电脑都安装了不只一个程序, 很多程序还依赖于其它程序. 如果你想要使用的软件无法和其它软件很好的一起工作, 那么该怎么办? 灾难.

·         而当多个程序共享依赖项的时候, 一切只会变得更加复杂:

o    如果一个程序的依赖项需要升级, 而其它程序的这个依赖项却不需要升级, 那么会发生什么?

o    当你移除了一个程序, 它真的被删除了吗?

o    你可以移除老的依赖项吗?

o    你还记得为了安装这个软件你做的那些修改吗? 现在你想删除这个软件, 这些修改怎么办?

所以说, 软件越多, 越难管理. 此外, 还有安全性需要考虑.

这些一切的一切管理起来很难, 并且很浪费时间.

 

1.2.1 Getting Organized

没有Docker, 你的电脑看起来就像装满垃圾的抽屉一样, 乱七八糟.

 

640?wx_fmt=jpeg

而使用Docker, Docker会把一切整理的井然有序, 通过镜像和容器, 一切都被隔离了.

640?wx_fmt=jpeg

看起来这里创建了一些多余的依赖项, 例如gcc, 所以会引入一些开销. 这点以后再解释, 简单的说就是Docker的打包系统会削减存储开销的.

 

1.2.2 改善可移植性

另一个软件问题就是应用程序的依赖项里通常包括特定的操作系统. 操作系统间的可移植性对用户来说是个大问题. 例如一些在Linux和Mac上可以兼容的程序, 想要在Windows上使用它就挺困难. 这可能需要重构整个软件, 而且还需要Windows有相应的依赖替代项.

现在, Docker可以在Linux上原生的运行, 在Mac和Windows上需要使用一个虚拟机. 这种在Linux上的聚合意味着在Docker容器中运行的软件只需要针对一组一致的依赖项编写一次即可.

在Windows和Mac上, Docker使用一个很小的虚拟机来运行所有容器. 这样的话, 运行虚拟机的开销是固定的, 而容器的数量确实可以扩展的.

优点有三个:

·         解锁了新世界. 例如以前无法在Windows上运行的Linux软件现在也可以使用了.

·         可以在任何系统上运行完全相同的软件.

·         软件维护者可集中精力针对一套平台和依赖来开发软件了.

 

1.2.3 保护你的计算机

容器可以保护我的计算机不受容器中运行的软件影响.

程序的风险主要有这些:

·         程序可能是恶意程序员写的

·         善意开发者写出来的程序也可能含有有害的bug

·         程序输入处理中的漏洞, 可能被恶意攻击者利用

 

和实体监狱一样, 容器里的任何东西只能访问容器里面的东西. 但是用户可以设置一些例外.

640?wx_fmt=jpeg

左侧就是恶意程序直接访问到了敏感资源.

右侧, 恶意程序被限制在了容器里.

 

1.3 Docker 为什么这么重要?

·         Docker 提供了一种抽象, 抽象允许你使用简化的方式来处理复杂的事物. 针对Docker来说, 我们只需考虑安装哪个软件即可. 安装和删除的过程异常简单.

·         每个人都可以使用, 省时省力省钱.

·         软件社区正在大力推动使用容器和Docker

·         它为桌面实现了移动设备的应用商店一样的功能. 并且Docker的做法是跨平台并且开放的.

·         更好更多的采用了操作系统的高级隔离特性.

 

1.4 何时何地使用Docker?

Docker几乎可在任何地方运行, 但是并不意味着这样做就合适.

在桌面上运行Windows/OS X原生程序是不行的.

容器对于必须取得机器全部控制权限的程序的安全性是没有多大帮助的.

 

1.5 Docker在更大的生态中

·         今天容器的生态更大, 高级工具也很多, 它们主要是为了解决一些新出现的, 高阶的问题: 容器编排, 高可用集群, 微服务生命周期管理, 可见性.

·         这些工具通常是作为插件或者依赖于Docker提供更高级的功能性. 有一些工具使用了Docker的子组件, 这些子组件是独立的项目, 例如 runc, libcontainerd, notary等.

·         Kubernetes是整个生态中除了Docker之外最值得一提的工具. 它提供了一个可扩展平台, 用于在集群环境中把服务作为容器进行编排. 它已经成长为某种“数据中心操作系统”了. 就像Linux 内核一样, 云提供商和平台公司都在对Kubernetes进行包装. Kubernetes依赖于像Docker一样的容器引擎, 所以在你笔记本上构建的容器和镜像在Kubernetes里面也会运行.

 

1.6 Docker 命令行帮助

docker

docker help

docker help <command>

 

 

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 .NET CORE 创建 项目模板,模板项目,Template

场景&#xff1a;日常工作中&#xff0c;你可能会碰到需要新建一个全新的解决方案的情况&#xff08;如公司新起了一个新项目&#xff0c;需要有全新配套的后台程序&#xff09;&#xff0c;如果公司内部基础框架较多、解决方案需要DDD模式等&#xff0c;那么从新起项目到各种依…

谈谈surging 微服务引擎 2.0的链路跟踪和其它新增功能

一、前言surging是基于.NET CORE 服务引擎。初始版本诞生于2017年6月份&#xff0c;经过NCC社区二年的孵化&#xff0c;2.0版本将在2019年08月28日进行发布&#xff0c;经历二年的发展&#xff0c;已经全部攘括了微服务架构的技术栈&#xff0c;覆盖了从服务注册、服务发现、中…

奇淫巧技-Flutter调用C#

前言众所周知&#xff0c;Xamarin应该是.net下的跨平台开发工具。2016年之前还处于收费状态&#xff0c;后被微软收购后开源。但似乎有个现象&#xff0c;开源后的Xamarin发展似乎有些停滞&#xff0c;而且维护Xamarin的团队又很固执不愿变通。社区多次建议UI层应该统一绘图引擎…

.NET World——gPRC概览

官方的定义&#xff1a;gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authen…

推荐高质量的公众号,值得跟进学习!

为大家推荐几个高质量的公众号&#xff1a;当你迷茫的时候刷刷这些大公司的牛人所运营的公众号&#xff0c;就可以知道自己的不足&#xff0c;不是仅仅局限于.NET技术之下&#xff0c;通过他们扩展我们的知识宽度&#xff0c;我们可以一起来学习。人工智能爱好者社区专注人工智…

.net core redis的全套操作

Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff0c;set&#xff08;集合&#xff09;及zset(sorted set&#xff1a;有序集合)。Redis支持主从同步…

Stack Overflow引入CROKAGE,搜问题不用再东拼西凑

许多开发者使用 Stack Overflow 搜索开发中遇到的问题&#xff0c;有时候需要查询的结果中有通俗的讲解&#xff0c;而且最好还能够带上代码 demo&#xff0c;但是两者同时很完美地满足要求还是比较困难的。不过最近 Stack Overflow 官方博客上介绍了一种智能化的技术&#xff…

使用Kubectl部署应用

目录 使用Kubectl部署应用 Kubectl部署流程 部署一个简单的Demo网站 使用Kubectl部署应用一旦运行了Kubernetes集群&#xff0c;就可以在其上部署容器化应用程序。因此在开始之前&#xff0c;我们需要先确保集群已经准备就绪&#xff0c;无论是使用Minikube还是kubeadm创建的集…

Docker系列之.NET Core入门(三)

在Docker生态系统中除了上一节所讲解的基本概念&#xff0c;还有其他专业术语&#xff0c;本文我们将一笔带过&#xff0c;同时会开始陆续进入到在.NET Core中使用Docker。专业术语Docker Engine&#xff08;Docker引擎&#xff09;&#xff1a;客户端 - 服务器应用程序。Docke…

通过Blazor使用C#开发SPA单页面应用程序(4) - Ant Design

通过Blazor使用C#开发SPA单页面应用程序(1)通过Blazor使用C#开发SPA单页面应用程序(2)通过Blazor使用C#开发SPA单页面应用程序(3)前面学习了Blazor的特点、环境搭建及基础知识&#xff0c;现在我们尝试的做个实际的组件。Ant Design是蚂蚁金服是基于Ant Design设计体系的 UI 组…

Mercurial黄昏,Bitbucket宣布全面转向Git

源代码托管平台 Bitbucket 宣布将逐步放弃对版本控制系统 Mercurial 的支持。Bitbucket 推出于 2008 年&#xff0c;当时集中式版本控制是比较普遍的&#xff0c;Mercurial 是其中的典型代表&#xff0c;但是当前 Git 才是主流&#xff0c;它已经成为了大部分开源项目的首选版本…

使用 Azure DevTest Lab 搭建云端开发测试环境

点击上方蓝字关注“汪宇杰博客”导语程序员和测试工程师经常需要自己搭环境用于开发和测试目的&#xff0c;这些机器可能只会使用很短一段时间。通常我们会在本机使用 Hyper-V、VMWare 之类的虚拟机产品&#xff0c;或者使用企业IT管理员分配的虚拟机去完成这项工作。然而安装配…

dotNET Core WebAPI 统一处理(返回值、参数验证、异常)

现在 Web 开发比较流行前后端分离现在 Web 开发比较流行前后端分离&#xff0c;我们的产品也是一样&#xff0c;前端使用Vue&#xff0c;后端使用 dotNet Core WebAPI &#xff0c;在写 API 的过程中有很多地方需要统一处理文档参数验证返回值异常处理本文就说说 API 的统一处理…

.net测试篇之单元测试/集成测试神器Autofixture

autofixture简介有了单元测试框架加上Moq(后面我们会用单独章节来介绍moq),可以说测试问题基上都能搞定了.然而有了AutoFixture对单元测试来说可以说是如虎添翼,AutoFixture并且它能与moq,rhinomock等框架结合,对单元测试带来的便捷性,可维护性和扩展性更是难以言表,只有用用了…

DotNetCore 3.0 助力 WPF本地化

概览随着我们的应用程序越来越受欢迎&#xff0c;我们的下一步将要开发多语言功能。方便越来越多的国家使用我们中国的应用程序&#xff0c;基于 WPF 本地化&#xff0c;我们很多时候使用的是系统资源文件&#xff0c;可是动态切换本地化&#xff0c;就比较麻烦了。实现思路现在…

开源题材征集 + MVCEF Core 完整教程小结

到目前为止&#xff0c;我们的MVCEF Core 完整教程的理论部分就全部结束了&#xff0c;共20篇&#xff0c;覆盖了核心的主要知识点。下一阶段是实战部分&#xff0c;我们将会把这些知识点串联起来&#xff0c;用10篇(天)来完成一个开源项目。现向园友征集题材&#xff0c;你提需…

对微软的敌视何时休? 从一篇语言评论文章对C#的评价说起

看到一篇公众号文章《2020年什么编程语言最受欢迎&#xff0c;待遇最高&#xff1f;》&#xff0c;其中对C#的描述如下&#xff1a;点击阅读原文&#xff0c;看到这是一篇翻译文章&#xff1a;https://codinginfinite.com/top-programming-languages-2020-stats-surveys/这篇文…

ASP.NET Core on K8S深入学习(6)Health Check

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。预计阅读时间为10分钟。01—关于K8S中的健康监测所谓Health Check&#xff0c;就是健康检查&#xff0c;即防微杜渐。K8S是一个编排引擎可以帮助我们快捷地部署容器集…

关于 .Net Core runtimeconfig 文件说明

项目的bin\debug\netcoreapp${Version}下面能够找到这个${AppName}.runtimeconfig.json文件&#xff0c;简单来说&#xff0c;它就是用来定义应用程序所用的共享框架&#xff08;.Net Core App&#xff09;以及运行时选项 的一个文件。一个简单的例子{ "runtimeOptions&q…

net core 3.0 之Grpc新特性小试牛刀

作者&#xff1a; 相信微服务大家伙都有听说和知道&#xff0c;好处弊端咱也不多说了&#xff0c;Grpc算是一个比较全面的微服务框架&#xff0c;也得到微软的支持总结下来就是&#xff0c;跨平台&#xff0c;可靠&#xff0c;通信快&#xff0c;扩展性强&#xff0c;网络消耗小…