第一章
1 Docker入门须知
1.1 Docker基本知识
Docker是基于Go语言实现的开源容器项目,诞生于2013年年初,最初发 起者是dotCloud公司。Docker自开源后受到广泛的关注和讨论,目前已有多个相关项目(包括Docker三剑客、Kubernetes等),逐渐形成了围绕Docker容器的生态体系。现在主流的Linux操作系统都已经支持Docker。例如,红帽公司的RHEL 6.5/CentOS 6.5往上的操作系统、Ubuntu14.04往上的操作系统,都已经在软件 源中默认带有Docker软件包。
Docker的构想是要实现“Build,Ship and Run Any App,Anywhere”, 即通过对应用的封装(Packaging)、分发(Distribution)、部署 (Deployment)、运行(Runtime)生命周期进行管理,达到应用组件“一次封装,到处运行”的目的。这里的应用组件,既可以是一个 Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。
1.2 Docker VS 虚拟化
虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务 器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的 不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。
虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同时运行多个系统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。 从大类上分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化:
真正意义上,基于硬件的虚拟化技术不多见,少数如网卡中的单根多IO虚拟化(Single Root I/O Virtualization and Sharing Specification,SR-IOV)等技术。
基于软件的虚拟化从对象所在的层次,又可以分为应用虚拟化和平台虚拟化(通常说的虚拟机技术即属于这个范畴)。其中,前者一般指的是一些 模拟设备或诸如Wine这样的软件。平台虚拟化又可以细分为如下几个子类:
传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。
Docker容器是在操作系统(OS)层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。
2. 核心概念和安装配置
2.1 核心概念
1.Docker镜像(Image)
Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。例如,一个镜像可以包含一个基本的操作系统环境,里面仅安装了Apache应用程序(或用户需要的其他软件)。可以把它称为一个Apache镜像。
镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并直接使用。
2.Docker容器(Container)
Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。
镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。
3.Docker仓库(Repository)
Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。有时候会看到有资料将Docker仓库和仓库注册服务器(Registry)混为 一谈,并不严格区分。实际上,仓库注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。例如存放 Ubuntu操作系统镜像的仓 库称为Ubuntu仓库,其中可能包括14.04、12.04等不同版本的镜像。
根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库 (Public)和私有仓库(Private)两种形式。目前,最大的公开仓库是官方提供的Docker Hub,其中存放了数量庞大的镜像供用户下载。国内不少云服务提供商(如时速云、阿里云等)也提供了仓库的本地源,可以提供稳定的国内访问。
当然,用户如果不希望公开分享自己的镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了。Docker利用仓库管理镜像的设计理念与Git非常相似,实际上 在理念设计上借鉴了Git的很多优秀思想。
2.2 Docker安装
MacOS :https://docs.docker.com/docker-for-mac/install/
Windows : https://docs.docker.com/docker-for-windows/
·Docker Platform : 支持在桌面系统或云平台安装Docker;
·Docker Hub : 官方提供的云托管服务,可以提供公有或私有的镜像仓库;
·Docker Cloud : 官方提供的容器云服务,可以完成容器的部署与管理, 可以完整地支持容器化项目,还有CI、CD功能;
·Docker DataCenter : 提供企业级的简单安全弹性的容器集群编排和管理。
Docker目前只能运行在64位平台上且要求内核版本不低于3.10,实际上内核越新越好,过低的内核版本容易造成功能不稳定。Docker目前支持的最低Ubuntu版本为12.04 LTS,但实际上从稳定性上考 虑,推荐至少使用14.04 LTS版本。CentOS系统的要求与Ubuntu情况下类似:64位操作系统,内核版本至少为3.10。Docker目前支持CentOS 6.5及以后的版本,推荐使用CentOS 7系统。
本人电脑安装简略步骤:
http://localhost/ 打开,看到如下页面,表示正确install nginx webserver.
命令行下输入: docker run --help 可查询docker run 命令所有的参数,其他命令也如此。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
3. 使用Docker镜像
Docker运行容器前需要本地存在对应的镜像,如果镜像没保存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。镜像是运行容器的前提,官方的Docker Hub网站已经提供了数十万个镜像供大家开放下载。
docker pull [OPTIONS] NAME[:TAG|@DIGEST] -------> Pull an image or a repository from a registry,如果不显式指定TAG,则默认会选择 latest 标签,就会下载仓库中最新版本的镜像。
一般来说,镜像的latest标签意味着该镜像的内容会跟踪最新的非稳定版本而发布,内容是不稳定的。从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使用默认的 latest 标记的镜像。如下:
docker pull nodejs:10.11.0 <=====> docker pull registry.hub.docker.com/nodejs:10.11.0
如果从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址。docker pull hub.c.163.com/public/nodejs:10.11.0
3.1 docker images(获取镜像文件)
·Tag: 比如14.04、latest用来标注不同的版本信息。只是标记,并不能标识镜像内容;
·IMAGE ID(唯一标识镜像): 如果ID一样表示它们目前实际上指向同一个镜像; 它唯一标识了镜像。在使用镜像ID的时 候,一般可以使用该ID的前若干个字符组成的可区分串来替代完整的ID。
·created : 说明镜像最后的更新时间;
·size : 优秀的镜像往往体积都较小。镜像大小信息只是表示该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像的逻辑体积之和。
3.2 docker tag (取别名)
为了方便在后续工作中使用特定镜像,还可以使用docker tag命令来为本地镜像任意添加新的标签。这些myubuntu:latest镜像的ID跟ubuntu:latest 完全一致。它们实际上指向同一个镜像文件,只是别名不同而已。docker tag 命令添加的标签实际上起到了类似链接的作用。docker tag ubuntu:latest myubuntu:latest
3.3 docker inspect (获取镜像的详细信息)
使用 docker inspect nginx(docker inspect e81eb098537d)命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等。返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用参数 -f 来指定,例如,
获取镜像的Architecture : docker inspect nginx( or e81eb098537d) -f { {".Architecture"}}
3.4 docker history (获取镜像的历史信息)
使用history子命令,该命令将列出各层的创建信息。docker history nginx
3.5 docker rmi (删除镜像)
使用docker rmi命令可以删除镜像,命令格式为docker rmi IMAGE [IMAGE...],其中IMAGE可以为标签或ID。当同一个镜像拥有多个标签的时候,docker rmi命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。删除标签为hel