docker入门第一节:Docker你必须知道的事情

未匹配的标注

#docker 做啥子的

百度百科:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

粗俗的说:
就是一个虚拟机。
只不过提供的镜像容器非常赞。
比如,你有一个 ubuntu 镜像,那你可以开 N 个 ubuntu 容器。而且只使用 ubuntu 源镜像,不会再去创建系统镜像。

#docker 时代到来
John Willis:Docker 与实现 DevOps 的三种方式
cloud.tencent.com/developer/articl...

翻译:
Ah-ha to the Cha-Ching 意思是啊哈(我要 shopping)到 支付(chaching 指银行收钱)
cha-ching 是英语当中模仿收银机打开钱盒准备收钱的声音,表示有钱的出账或入账。
lead time 生产周期

#为什么要使用 docker?
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

## 看表
title

## 优势太多
更高效的利用系统资源
由于容器不需要进行硬件虚拟及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统的虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行与宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级别的启动时间。大大的节约了开发、测试、部署的时间。

一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 BUG 并未在开发过程中被发现。而 Docker 的镜像提供了除了内核外完整的运行时环境,确保了应用运行环境得一致性,从而不会再出现 “这段代码在我机器上没问题” 这类问题。

持续交付和部署
对开发和运维人员来说,最希望的就是一次性创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 DockerFile 来进行镜像构建,并结合 持续集成系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署。
而使用 DockerFile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

更轻松的迁移

由于 Docker 确保了执行环境得一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用迁移到另一个平台,而不用担心运行环境得变化导致应用无法正常运行的情况。

更轻松的维护和扩展

Docker 使应用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变的非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

#docker 的 8 个使用场景(优点)

##1. 简化配置
虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台 (软件,系统), Docker 在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码汇总然后部署,同一个 Docker 的配置可以在不同的环境环境中使用,这样就降低了硬件要求和应用环境之间耦合度.

##2. 代码流水线管理
代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中坚环境。而每一个中间环境都有自己微小的差别,Docker 给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少.

##3. 提升开发效率
不同环境中,开发者的共同目标:

, 想让开发环境尽量贴近生产环境., 想快速搭建开发环境

开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在 Docker 可以轻易的让几十个服务在 Docker 中跑起来.

##4. 隔离应用
开发时会在一个台机器上运行不同的应用.

一,为了降低成本,进行服务器整合

二,将一个整体式的应用拆分成低耦合的单个服务 (微服务架构)

##5. 整合服务器
Docker 隔离应用的能力使得 Docker 可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker 可以比虚拟机提供更好的服务器整合解决方案.

##6. 调试能力
Docker 提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。他们提供了很多功能,包括可以为容器设置检查点,设置版本,查看两个容器之间的差别,这些特性可以帮助调试 Bug.

##7. 多租户环境
多租户环境的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为 loT (物联网) 的应用开发一个快速,易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划以应用不但消耗时间,也浪费金钱.

使用 Docker, 可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,因为 Docker 环境启动的速度快,diff 命令很高效.

##8. 快速部署
Docker 为进程创建一个容器,不需要启动一个操作系统,时间缩短为秒级别.

可以在数据中心创建销毁资源而无须担心重新启动带来的开销。通常数据中心的资源利用率只有 30% , 通过使用 Docker 并进行有效的资源分配可以提高资源的利用率.

#docker 的缺点

##docker 不适用与 32 位系统!也最好不要配合 windows 搭建!
会发生很恐怖的事情!!!

## 列表如下

  1. Docker 是基于 Linux 64bit 的,无法在 32bit 的 linux/Windows/unix 环境下使用
  2. LXC 是基于 cgroup 等 linux kernel 功能的,因此 container 的 guest 系统只能是 linux base 的
  3. 隔离性相比 KVM 之类的虚拟化方案还是有些欠缺,所有 container 公用一部分的运行库
  4. 网络管理相对简单,主要是基于 namespace 隔离
  5. cgroup 的 cpu 和 cpuset 提供的 cpu 功能相比 KVM 的等虚拟化方案相比难以度量 (所以 dotcloud 主要是按内存收费)
  6. Docker 对 disk(磁盘)的管理比较有限
  7. container 随着用户进程的停止而销毁
  8. container 中的 log 等用户数据不便收集

#docker 的局限性【扩展阅读】

## 局限
Docker 并不是全能的,设计之初也不是 KVM 之类虚拟化手段的替代品,简单总结几点:
Docker 是基于 Linux 64bit 的,无法在 32bit 的 linux/Windows/unix 环境下使用
LXC 是基于 cgroup 等 linux kernel 功能的,因此 container 的 guest 系统只能是 linux base 的
隔离性相比 KVM 之类的虚拟化方案还是有些欠缺,所有 container 公用一部分的运行库
网络管理相对简单,主要是基于 namespace 隔离
cgroup 的 cpu 和 cpuset 提供的 cpu 功能相比 KVM 的等虚拟化方案相比难以度量 (所以 dotcloud 主要是按内存收费)
Docker 对 disk 的管理比较有限
container 随着用户进程的停止而销毁,container 中的 log 等用户数据不便收集
针对 1-2,有 windows base 应用的需求的基本可以 pass 了;3-5 主要是看用户的需求,到底是需要一个 container 还是一个 VM, 同时也决定了 docker 作为 IaaS 不太可行。
针对 6,7 虽然是 docker 本身不支持的功能,但是可以通过其他手段解决 (disk quota, mount –bind)。总之,选用 container 还是 vm, 就是在隔离性和资源复用性上做权衡。
另外即便 docker 0.7 能够支持非 AUFS 的文件系统,但是由于其功能还不稳定,商业应用或许会存在问题,而 AUFS 的稳定版需要 kernel 3.8, 所以如果想复制 dotcloud 的成功案例,可能需要考虑升级 kernel 或者换用 ubuntu 的 server 版本 (后者提供 deb 更新)。这也是为什么开源界更倾向于支持 ubuntu 的原因 (kernel 版本)

Docker 并非适合所有应用场景,Docker 只能虚拟基于 Linux 的服务。Windows Azure 服务能够运行 Docker 实例,但到目前为止 Windows 服务还不能被虚拟化。
可能最大的障碍在于管理实例之间的交互。由于所有应用组件被拆分到不同的容器中,所有的服务器需要以一致的方式彼此通信。这意味着任何人如果选择复杂的基础设施,那么必须掌握应用编程接口管理以及集群工具,比如 Swarm、Mesos 或者 Kubernets 以确保机器按照预期运转并支持故障切换。
Docker 在本质上是一个附加系统。使用文件系统的不同层构建一个应用是有可能的。每个组件被添加到之前已经创建的组件之上,可以比作为一个文件系统更明智。分层架构带来另一方面的效率提升,当你重建存在变化的 Docker 镜像时,不需要重建整个 Docker 镜像,只需要重建变化的部分。
可能更为重要的是,Docker 旨在用于弹性计算。每个 Docker 实例的运营生命周期有限,实例数量根据需求增减。在一个管理适度的系统中,这些实例生而平等,不再需要时便各自消亡了。
针对 Docker 环境存在的不足,意味着在开始部署 Docker 前需要考虑如下几个问题。首先,Docker 实例是无状态的。这意味着它们不应该承载任何交易数据,所有数据应该保存在数据库服务器中。
其次,开发 Docker 实例并不像创建一台虚拟机、添加应用然后克隆那样简单。为成功创建并使用 Docker 基础设施,管理员需要对系统管理的各个方面有一个全面的理解,包括 Linux 管理、编排及配置工具比如 Puppet、Chef 以及 Salt。这些工具生来就基于命令行以及脚本。

#docker 集群怎么做的?k8s 什么玩意?

k8s:Kubernetes 的发展独立于 Docker。2003 年左右,谷歌创建了 Borg 系统来应对日益增长的集群管理问题。这是一个内部工具。2014 年年中,Google 推出 Kubernetes 作为 Borg 系统的开源版本。不久,微软,红帽,IBM 和 Docker 加入,以支持 Kubernetes 社区。

争议#

大家都在争议的是 谁 VS 谁? 谁牛逼?
其实我们可以这么看:互补互进

并不是在于 “Kubernetes vs Docker”,讨论应该集中在 “Kubernetes vs. Docker Swarm” 上。这两种技术在今天的软件环境中都扮演着重要的角色。Docker 容器改进了开发过程,Kubernetes 容器编排改进了部署过程。DevOps 团队可以利用这些技术的强大功能构建更强大的持续集成和持续交付(CI/CD)管道,以实现更快,更可靠的软件开发周期。

#关于 io ce ee 是什么?
扩展:
老版本的 docker 引擎 提供的是 docker.io

现在提供的是 一个专业版本 docker.ee

还有一个是 社区版免费 docker.ce

Older versions of Docker were called docker or docker-engine or docker.io docker-io package was the name used on Debian/Ubuntu for the official docker release. Main reason was to avoid a name conflict with Ubuntu docker system-tray binary. manpages.ubuntu.com/manpages/precis... Docker now has an enterprise version (EE) and a free community Edition version(CE) Prior to installing Docker Community Edition you would need to remove older binaries. Centos/RHL: docs.docker.com/engine/installatio... $ sudo yum remove docker \ docker-common \ docker-selinux \ docker-engine Ubuntu/Debian: docs.docker.com/engine/installatio...

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
wangchunbo
讨论数量: 0
发起讨论 查看所有版本


暂无话题~