[关闭]
@chendushuai 2018-12-23T08:58:25.000000Z 字数 4622 阅读 526

Docker简介和安装

Docker 容器


第一章 认识Docker

1.1 Docker是什么

在云时代,主要依靠虚拟化技术所构建的集群处理能力。开始是以Xen、KVM代表的虚拟机虚拟化,再到现在以Docker为代表的容器技术。

容器充分利用了操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化。将容器称为“新一代的虚拟化”技术,将基于容器打造的云平台称为“容器云”。

1. Docker开源项目背景

Docker是基于Go语言实现的开源容器项目,诞生于2013年年初,最初发行者是dotCloud公司,目前已有多个开源项目,形成了围绕Docker容器的生态体系。

主流的Linux操作系统都已经支持Docker。

Docker的构想是要实现“Build,Ship and Run Any App,Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件“一次封装、到处运行”的目的。这里的应用组件,既可以是一个Web应用、一个编译环境,也可以使一套数据库平台服务,甚至是一个操作系统或集群。

2. Linux容器技术——巨人的肩膀

IBM对于容器技术的描述为:“容器有效的将由单个操作系统管理的资源规划分到孤立的组中,以更好的在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化和系统调用替换中的复杂性。”。

Linux容器技术LXC

3. 从Linux容器到Docker

在LXC的基础上,Docker进一步优化了容器的使用体验,让它进入了寻常百姓家。

首先,Docker提供了各种容器管理工具(如分发、版本、移植等)让用户无需关注底层的操作,可以更简单明了的管理和使用容器;其次,Docker通过引入分层文件系统构建和高效的镜像机制,降低了迁移难度,极大地提升了用户体验。用户操作Docker容器就像操作应用自身一样简单。

早期的Docker代码实现是直接基于LXC的。自0.9版本开始,Docker开发了li'b'con'ta项目,替换掉了LXC的实现。目前,Docker还积极推动成立了runC标准项目,试图让容器支持不再局限于Linux操作系统,而是更安全,更具扩展性。

可以将Docker容器理解为一种轻量级的沙盒(sandBox)。每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信。容器的创建和停止都十分快速,几乎跟创建和终止原生应用一致;另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机。很多时候,甚至直接把容器当做应用本身也没有任何问题。

1.2 为什么要使用Docker

1. Docker容器虚拟化的好处

Docker通过容器来打包应用,解耦应用和运行平台,意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类型的平台。这无疑将节约大量的宝贵时间,并降低部署过程中出现的问题。

2. Docker在开发和运维中的优势

Docker在开发和运维过程中,具有如下几个方面的优势

  1. 。使用Docker,开发人员可以使用镜像来快速构件一套标准的开发环境;开发完成后,测试和运维人员可以直接使用完全相同环境来部署代码。只要开发测试过的代码,就可以确保在生产环境无缝运行。Docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间。并且,整个过程全程可见,是团队更容易理解应用的创建和工作过程。
  2. 。Docker容器的运行不需要额外的虚拟化管理程序支持,他是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低,跟传统虚拟机方式相比,要提高一到两个数量级。
  3. 。Docker几乎可以在任意的平台上运行。可以让用户可以在不同平台之间轻松的迁移应用。
  4. 。使用DockerFile,只需要小小的配置修改,就可以替代以往大量的更新工作,并且所有修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。

3. Docker与传统虚拟机技术的特性比较

特性 容器 虚拟机
启动速度 秒级 分钟级
性能 接近原生 较弱
内存代价 很小 较多
硬盘使用 一般为MB 一般为GB
运行密度 单机支持上千个容器 一般几十个
隔离性 安全隔离 完全隔离
迁移性 优秀 一般

1.3 Docker与虚拟化

虚拟化(Virtualization)技术是一个通用的概念,在不同领域有不同的理解。在计算领域,一般指的是计算虚拟化,或者通常说的服务器虚拟化。维基百科中定义如下:虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。

虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同事运行多个系统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。

从大类上分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。其中真正意义上的基于硬件虚拟化技术不多见。

基于软件的虚拟化从对象所在的层次,又可以分为应用虚拟化和平台虚拟化(通常说的虚拟机技术即属于这个范畴)。其中,前者一般指的是一些模拟设备或软件,后者又可以细分为下面几类:

第二章 核心概念和安装配置

2.1 核心概念

Docker的大部分操作都围绕着他的三大核心概念——镜像、容器和仓库而展开。

1. Docker镜像

Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。例如,一个镜像可以包含一个基本的操作系统环境,里面仅安装了一个Apache应用程序(或用户需要的其他软件)。可以把它称为一个Apache镜像。

镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一个十分简单的机制来创建和更新现有的镜像。

2. Docker容器

类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。

可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。

镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。

3. Docker仓库

Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。企业注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像文件,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。

根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库(public)和私有仓库(Private)两种形式。Docker支持用户在本地网络内创建一个只能自己访问的私有仓库。当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了。

可以看出,Docker利用仓库管理镜像的设计理念与Git非常相似,实际上在理念设计上借鉴了Git的很多优秀思想。

2.2 Docker安装验证

Docker安装完成后,可以验证Docker安装是否正确,打开终端控制器或其他系统命令行。执行如下命令,确认Docker启动,dockerdocker-composedocker-machine的版本是最新的,并且与Docker.app兼容。如果使用的是不同的版本,输出的内容不同。

  1. $ docker --version
  2. Docker version 1.12.3, build 6b644ec
  3. $ docker-compose --version
  4. docker-compose version 1.8.1, build 878cff1
  5. $ docker-machine --version
  6. docker-machine version 0.8.2, build e18a919
  1. 使用下面的简单Docker映像来确认安装是否正常
  1. $ docker run hello-world
  2. Unable to find image 'hello-world:latest' locally
  3. latest: Pulling from library/hello-world
  4. d1725b59e92d: Pull complete
  5. Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
  6. Status: Downloaded newer image for hello-world:latest
  7. Hello from Docker!
  8. This message shows that your installation appears to be working correctly.
  9. To generate this message, Docker took the following steps:
  10. ……
  1. 启动一个Docker Web服务器,与上面启动hello-world映像类似,如果在本地找不到映像,Docker将从Docker Hub中提取
  1. $ docker run -d -p 80:80 --name webserver nginx
  1. 打开浏览器,使用网址http://localhost/访问Nginx的主页,由于使用的是默认的80端口,所以无需在网址后面附加端口号。

  2. 当你的web服务器在运行的时候,你可以查看容器明细(使用docker container ls或者docker ps):

  1. docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 2027665dca2d nginx "nginx -g 'daemon off" 21 hours ago Up 10 minutes 0.0.0.0:80->80/tcp webserver
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注