【学习笔记】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;那么从新起项目到各种依…

【BZOJ4916】神犇和蒟蒻(杜教筛)

【BZOJ4916】神犇和蒟蒻&#xff08;杜教筛&#xff09; https://www.cnblogs.com/cjyyb/p/8297338.html 杜教筛技巧

E. Number Challenge

E. Number Challenge 推式子 ∑i1a∑j1b∑k1cσ(ijk)∑i1a∑j1b∑k1c∑x∣i∑y∣j∑z∣k(gcd(x,y)1)(gcd(x,z)1)(gcd(y,z)1)∑x1a∑y1b∑z1c⌊ax⌋⌊by⌋⌊cz⌋(gcd(x,y)1)(gcd(x,z)1)(gcd(y,z)1)∑d1aμ(d)∑x1⌊ad⌋⌊adx⌋∑y1⌊bd⌋⌊bdy⌋∑z1c⌊cd⌋(gcd(x,z)1)(gcd(y,z…

时间表(日记)

2021/1/14 今天白天学习还算成功&#xff0c;但是晚饭后拿起手机就开始颓废了&#xff0c;特别是因为听相声实在是无聊而且低俗&#xff0c;所以又忍不住诱惑下载了b站&#xff0c;相比于相声b站的确是有营养的多&#xff0c;但是一旦激起了我的好奇心&#xff0c;尤其是吸引了…

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

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

2019-ACM-ICPC-南京区网络赛-E. K Sum(莫比乌斯反演 + 杜教筛)

K Sum 推式子 Fn(k)∑l11n∑l21n⋯∑lk1n(gcd(l1,l2,…,lk))2∑d1nd2∑l11nd∑l21nd⋯∑lk1nd(gcd(l1,l2,…,lk)1)∑d1nd2∑l11nd∑l21nd⋯∑lk1nd∑t∣gcd(l1,l2,…,lk)μ(t)∑d1nd2∑t1ndμ(t)(ntd)2另Ttd∑T1n(nT)k∑d∣Td2μ(Td)∑i2nFn(i)∑T1n∑i2k(nT)i∑d∣Td2μ(Td)到…

【BZOJ4028】[HEOI2015]公约数数列(分块/数量级很小法)

【BZOJ4028】[HEOI2015]公约数数列 https://www.luogu.com.cn/problem/P4108 求解最靠前的一个位置前缀gcd和前缀异或的乘积恰好等于x&#xff0c;并且要求支持单点修改 首先我们可以发现这个问题没法使用线段树维护&#xff0c;因为不仅前缀没有单调性&#xff0c;而且修改也…

GuGuFishtion(2018 Multi-University Training Contest 7)

GuGuFishtion 推式子 ∑a1m∑b1nϕ(a,b)ϕ(a)ϕ(b)∑a1m∑b1ngcd(a,b)ϕ(gcd(a,b))∑d1mdϕ(d)∑a1md∑b1mdgcd(a,b)1∑d1mdϕ(d)∑a1md∑b1md∑k∣gcd(a,b)μ(k)我们约定n,m&#xff0c;满足n<m∑d1ndϕ(d)∑k1ndμ(k)⌊nkd⌋⌊mkd⌋\sum_{a 1 } ^{m} \sum_{b 1 } ^{n} …

奇淫巧技-Flutter调用C#

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

【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)

【UOJ#33】【UR #2】树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演&#xff0c;那么利用倍数形式&#xff0c;我们只需要求解是i的倍数的对数。 考虑枚举lca&#xff0c;这个问题就和深度有关&#xff0c;那么可以长链剖分&…

.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…

51NOD 1220 约数之和(杜教筛)

1220 约数之和 推式子 ∑i1n∑j1nd(i,j)∑i1n∑j1n∑x∣i∑y∣j(gcd(x,y)1)xjy∑d1ndμ(d)∑i1nd∑x∣iix∑j1nd∑y∣jj∑d1ndμ(d)(∑i1nd∑x∣ix)2∑d1ndμ(d)(∑x1nx∑x∣i)2∑d1ndμ(d)(∑x1nxnx)2接下来就是杜教筛求dμ(d)的前缀和&#xff0c;然后再直接分块求∑x1nxnx&…

P4151 [WC2011]最大XOR和路径(线性基)

P4151 [WC2011]最大XOR和路径 对于求解最大异或和路径&#xff0c;首先边可以重复走&#xff0c;最终的结果一定是一条路径和许多环的异或和&#xff0c;因为路径和环之间的边会被走两次&#xff0c;不会被计算&#xff0c;所以我们可以通过dfs树求解所有的环的线性基&#xf…

P6222 「P6156 简单题」(反演 + 积性函数线性筛)

P6156 简单题 推式子 ∑i1n∑j1n(ij)kf(gcd(i,j))gcd(i,j)∑i1n∑j1n(ij)kμ2(gcd(i,j))gcd(i,j)∑d1nμ2(d)dk1∑i1nd∑j1nd(ij)k(gcd(i,j)1)∑d1nμ2(d)dk1∑p1ndp2μ(p)∑i1npd∑j1npd(ij)ktpd,f(n)∑i1n∑j1n(ij)k∑t1nf(nt)tk∑d∣tμ2(d)μ(td)d\sum_{i 1} ^{n} \sum_{…

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

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

P3733 [HAOI2017]八纵八横(线性基/线段树分治)

P3733 [HAOI2017]八纵八横 这是那道线性基的加强版&#xff0c;现在要求从1节点出发的一条路径异或和最大&#xff0c;并且还要支持修改权值和加边删边。 我们可以直接线段树分治然后将所有修改用vector存下来&#xff0c;然后最后dfs一遍整个线段树&#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支持主从同步…

二次剩余模板

二次剩余模板 x2≡n(modp)x ^ 2 \equiv n \pmod px2≡n(modp) /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc.h>#define mp make_pair #define pb push_back #define endl \n #define mid (l r >> 1) #define l…

CF938G Shortest Path Queries(线性基/线段树分治/异或)

CF938G Shortest Path Queries 支持加边删边和查询两点之间的异或最短路&#xff0c;我们可以使用线段树分治&#xff0c;然后利用线性基求解。 但是这里图可能不是联通的&#xff0c;所以查询两点之间的异或和需要边带权并查集维护&#xff0c;然后还不能路径压缩&#xff0…

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

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