我只是把之前的学习笔记整理一下,贴到这里,可能会显得比较凌乱。。。
1.1 啥是Docker?
Docker 是一个开源项目,它被用来做构建、打包和运行程序。它是一个命令行程序,一个后台进程,也是一组使用逻辑方法来解决常见软件问题的远程服务,让你可以简化安装、运行、发布、删除软件的体验。它是通过一种叫做容器的操作系统技术来实现这些功能的。
1.1.1 Hello World
前提条件:安装Docker,需要互联网连接。
命令: docker run dockerinaction/hello_world
docker
命令的第二部分指明了你想在容器里运行的程序, 本例中就是 dockerinaction/hello_world, 它叫做镜像 (image) 名 (有时候也叫做仓库 repository). 从现在开始, 你就可以把镜像的名字作为你想安装或运行的程序名. 镜像本身就是一组文件和元数据. 其中元数据包括了要运行的特定程序和相关配置.
· 本例容器运行结果就是输出一个“hello world”, 输出完, 程序就退出了. 这时容器的状态被标记为 stopped.
· 容器的运行状态直接和容器内的单个运行程序的状态是绑定的. 如果一个程序在运行状态, 那么容器也在运行状态; 如果这个程序是出于停止状态的, 那么容器也是停止状态的.
· 重启容器将会重新运行该程序.
当你第二次运行该命令的时候:
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 本身并不提供容器技术, 但是它使得容器技术可以更简单的使用
·
在这里CLI运行在user space内存里, 和其它程序一样, 也是运行在操作系统之上. 理想状态下, 在user space里运行的程序无法修改内核空间(kernel space)内存. 更广泛的说, 操作系统是所有用户程序和支撑计算机运行的硬件之间的接口.
·
你可以看见, 运行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, 你的电脑看起来就像装满垃圾的抽屉一样, 乱七八糟.
而使用Docker, Docker会把一切整理的井然有序, 通过镜像和容器, 一切都被隔离了.
看起来这里创建了一些多余的依赖项, 例如gcc, 所以会引入一些开销. 这点以后再解释, 简单的说就是Docker的打包系统会削减存储开销的.
1.2.2 改善可移植性
另一个软件问题就是应用程序的依赖项里通常包括特定的操作系统. 操作系统间的可移植性对用户来说是个大问题. 例如一些在Linux和Mac上可以兼容的程序, 想要在Windows上使用它就挺困难. 这可能需要重构整个软件, 而且还需要Windows有相应的依赖替代项.
现在, Docker可以在Linux上原生的运行, 在Mac和Windows上需要使用一个虚拟机. 这种在Linux上的聚合意味着在Docker容器中运行的软件只需要针对一组一致的依赖项编写一次即可.
在Windows和Mac上, Docker使用一个很小的虚拟机来运行所有容器. 这样的话, 运行虚拟机的开销是固定的, 而容器的数量确实可以扩展的.
优点有三个:
· 解锁了新世界. 例如以前无法在Windows上运行的Linux软件现在也可以使用了.
· 可以在任何系统上运行完全相同的软件.
· 软件维护者可集中精力针对一套平台和依赖来开发软件了.
1.2.3 保护你的计算机
容器可以保护我的计算机不受容器中运行的软件影响.
程序的风险主要有这些:
· 程序可能是恶意程序员写的
· 善意开发者写出来的程序也可能含有有害的bug
· 程序输入处理中的漏洞, 可能被恶意攻击者利用
和实体监狱一样, 容器里的任何东西只能访问容器里面的东西. 但是用户可以设置一些例外.
左侧就是恶意程序直接访问到了敏感资源.
右侧, 恶意程序被限制在了容器里.
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>