第一章 Docker概述
1.1 课程引入
1.1.1 开发/运维互掐
开发与测试和运维间的矛盾,主要是由于环境的不同而引发的。如果能将开发人员使用的环境交给测试与运维使用,这些问题就都能解决。
1.1.2 DevOps
DevOps
是一种思想,是一种管理模式,是一种执行规范与标准。它主要是用于促进开发、测试与运维部门间的沟通、协作与整合。
1.1.3 运维对架构师的抱怨
运维总是希望,如果能搞个一键部署,一下搞定就好了。
1.1.4 学习中集群搭建的问题
在学习过程中,由于机器配置较低从而导致启动的虚拟机较少,影响学习效率。
1.2 Docker简介
Docker
是一个开源的应用容器Container
引擎,其可以让开发者将应用及应用运行的环境打包到一个轻量级、可移植的镜像中,然后发布到任何流行的Linux
、Windows
机器上。
Docker
原本是由一个PaaS
提供商dotCloud
公司的创始人Solomon Hykes
发起的一个内部项目,是基于其多年云服务技术的一次革新,使用Go语言开发。2013年3月开源,并在GitHub
上进行维护。后由于Docker
项目的火爆,2013年底,dotCloud
公司更名为Docker
,公司域名也变更为了https://docker.com。
1.3 Docker的用途
1.3.1 提供统一的运行环境
在生产环境中,很多时候的开发、测试及上线环境都是不一样的,从而导致项目(war或jar)在不同阶段出现很多其它阶段所不存在的奇怪的问题。
Docker
容器除了可以提供相同的应用外,还提供了该应用的统一运行环境,确保在任何宿主机HOST上都可以跑出相同的结果。即Docker = jar/war +环境。
1.3.2 便捷的应用迁移
由于Docker
确保了统一的运行环境,使得应用的迁移更加便捷。无论是物理机、虚拟机、公有云、私有云,Docker
镜像的运行结果都是相同的。用户可以很方便地将一个平台上运行的应用,迁移到另一个平台上,而无需担心运行环境的变化导致应用无法正常运行。
1.3.3 超快的启动时间
传统的虚拟机技术启动应用一般需要数分钟:首先需要启动虚拟机,然后再加载虚拟机操作系统,最后还需要再手工启动应用。而Docker
容器应用,由于直接运行于宿主机系统中,无需启动操作系统,因此可以做到秒级、甚至毫秒级的启动。
1.3.4 更轻松的维护和扩展
Docker
公司及各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。Docker
使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。
1.4 容器与虚拟机的区别
Docker
容器的本质就是通过容器虚拟技术虚拟出的一台主机,就像虚拟机一样。可以将应用及其运行环境部署在这台虚拟出的主机上运行。但容器与虚拟机又有着本质的不同。
1.4.1 普通系统中的程序运行原理
程序是一个对计算机硬件资源调度使用的指令序列。
1.4.2 传统虚拟技术
传统的虚拟技术是在物理机的操作系统之上安装一个虚拟机管理程序,例如VMware
、VirtualBox
等。在其管理下可以创建很多个虚拟机。每个虚拟机需要安装自己独立的操作系统,而应用就是安装在虚拟机操作系统之上的程序,应用程序通过调用各种命令或库函数来使用其需要的各种系统资源。对于完全相同的两个应用,其若需要运行在两个虚拟机中,则就需要两套完全相同的虚拟机操作系统与bins/libs
,存在大量的资源占用冗余。形成资源浪费。
1.4.3 容器虚拟化技术
Docker
容器运行在Docker
引擎之上,所有Docker
容器共享同一个Docker
引擎,但它们的运行又是相互隔离、互不干扰的。由于Docker
容器不需要进行虚拟硬件及操作系统,而是共享的宿主机的硬件与操作系统,所以Docker
容器对系统资源的占用很少,其仅包含运行时必须的一些资源。所有Docker
容器对于系统资源的使用都是由Docker
引擎统一进行管理,所以对系统资源的利用率很高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。
1.5 Docker系统架构
Docker
中具有几个非常重要的概念,下面通过理解这些概念来了解Docker
的系统架构。
1.5.1 Docker Daemon
Docker Daemon
,即Dockerd
,Docker
守护进程,其监听着Docker API
请求并管理Docker
对象,例如镜像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理Docker
服务。
1.5.2 镜像Image
Docker
镜像是用于创建Docker
容器的模板。就像面向对象编程中的类。
1.5.3容器 Container
Docker
容器是镜像运行时的实体。就像面向对象编程中类的实例。一个类可以创建出N多个实例,那么一个镜像同样也可以创建出N多个容器。每个处于运行状态的容器中都包含着一个或多个相关的应用,且它的运行不会干扰到其它容器。因为它们之间是相互隔离的。
1.5.4 仓库Repository
Docker
镜像仓库用来保存相关的一组镜像,这组镜像具有相同的镜像名称,都与镜像仓库名称相同。仓库根据其中的镜像是否可以被公开共享,可以分为公开库与私有库。
1.5.5 标签Tag
通过<repository>:<tag>
即可唯一定位一个镜像。即镜像标签其实就是镜像仓库中用于区分各个镜像的一种标识,同一仓库中的镜像具有不同的标签。
1.5.6 镜像中心Registry
Docker
的镜像中心中存放着很多由官方、其他机构或个人创建的Docker
仓库,Docker
用户可以直接从这些仓库中pull
需要的镜像,也可以将自己制作的镜像push
到Docker
镜像中心相应的仓库中。最常用的镜像中心是Docker
官方的Docker Hub
(https://hub.docker.com)。