1.2 了解容器的组成
Docker是Docker项目开发的一种容器格式。docker命令能够运行、停止、启动、调查容器,还能操纵容器。docker命令也可以作为服务守护进程运行,处理管理Docker容器的请求。默认情况下,这个Docker服务会从Docker Hub Registry获取你请求的镜像。虽然你无需知道更多就可以开始使用,但接下来会依次给出一些额外的信息。
1.2.1 Docker项目
Docker项目为Docker开发提供了一个中心。它将Docker称为“一个针对分布式应用开发者和系统管理员的开放平台”,旨在简化应用程序的开发和分发。
Solomon Hykes是Docker的创始人和CTO。他将Docker要在软件行业做的事情与物理集装箱为航运业所做的事情进行了对比。无论是运输汽车、圆桶、箱子,还是运输钢琴,只要使用标准的集装箱来运输这些不同类型的物品,用来运送和处理它们的工具也可以被标准化。
因此,就其核心而言,Docker项目提供了一种软件容器的格式并创建了一个专为使用该格式的软件而搭建的简单的基础设施。随着项目的进行,它开始超出其最初所关注的稳定Docker格式以及提供工具来管理单个容器。
如今,Docker项目正将其范围扩展至包含配置与编排工具,来帮助人们部署和管理成组的容器。该项目还研究管理计算资源的方式,并提供高可用性的方式来帮助运行Docker容器。随着这些工具变得可用,它们将不得不与谷歌和Red Hat这样的公司正开发的更成熟的容器编排工具(包括本书涵盖的Kubernetes项目的工具)正面交锋。
然而,目前Docker项目的最大成就是Docker容器格式、管理单个容器的工具,以及在Docker客户端和registry之间拉取和推送Docker容器镜像的能力。Docker项目管理的中央registry被称为Docker Hub Registry。
1.2.2 Docker Hub Registry
Docker Hub Registry提供了个人与组织保存和开发其Docker容器镜像的地方。当你的Linux系统上安装了Docker的时候,如果你请求的Docker容器镜像尚未在你的系统中,默认情况下Docker会查看Docker Hub Registry。
图1-1展示了Docker Hub Registry页面。
图1-1 Docker Hub Registry保存了数以千计的Docker镜像
通过注册Docker用户账号,你可以拥有自己的Docker repository,你可以把Docker容器镜像推送到这里。之后,只要连接了因特网,你就可以从任何运行Docker的系统拉取这些镜像。
Linux发行版和应用项目在Docker Hub Registry上有官方的repository。除了Docker容器镜像本身,多数情况下,你也能在Docker Hub Registry上查找使用这些镜像的说明以及用来构建这些镜像的Dockerfile文件。对于不想公开共享的容器镜像,也有办法创建你自己的Docker Registry,你可以用它来私密地保存镜像或者直接从Docker项目购买安全的容器存储空间。
你也许注意到,当描述Docker存储和传输软件所用的格式时,会出现“镜像”和“容器”这样的词。当使用Docker时,理解镜像和容器之间的差别是非常关键的。
1.2.3 Docker镜像和容器
容器化的目的是将应用程序运行需要的所有组件集合在一个单一而独立的单元中。对于Docker而言,这个单元被称作Docker镜像。镜像之中是容器要运行的应用程序以及应用程序执行所需的库、配置文件、可执行程序或者其他组件。
镜像是一个静态单元,它要么在repository中,要么在安装了Docker的本地文件系统中,并等着被运行。与将Docker镜像存储到repository中不同,将Docker镜像保存到文件系统时,它会被保存为一个tarball文件。这个tarball可以像其他文件那样传输,之后可以在运行Docker的本地系统上被导入并作为容器运行。
像Red Hat Enterprise Linux、Ubuntu、Fedora和CentOS这样的主要Linux发行版都提供了官方的基础镜像,你可以使用它们构建自己的Docker镜像。即使不是程序员,也可以获取基础镜像、向其中添加现有应用程序并将其制作为自己的镜像。要做到这一点只需创建Dockerfile并在其上运行docker build命令。
Docker容器这个术语指的是Docker镜像的运行实例,或者更为准确地说,是一个已运行的镜像的实例,因为它此刻可能正在运行、暂停或者已经停止。开始使用Docker时,镜像和容器之间的区别非常关键。需要理解这个区别的原因在于,处理镜像和处理容器有着不同的命令。
例如,当要查看本地系统的镜像列表时,要输入docker images;要查看正在运行的容器列表,要输入docker ps(或是docker ps -a,查看不再运行但还保存在你的系统中的容器的列表)。
想从镜像运行容器,要用docker run命令。想停止正在运行的容器,要用docker stop命令。在容器停止后,可以使用docker start命令再次启动已停止的容器。只是要暂停容器中的所有进程,要用docker pause命令。之后输入docker unpause来再次启动已暂停的容器。谨记,docker run从原始镜像运行一个新容器,而docker start从容器被停止时的状态重新启动一个容器(例如,你添加的软件或修改的文件还在那儿)。
当使用容器时,你会注意到所有给出的示例都有一个共同点。它们中的每一个都要使用docker命令来调用。
1.2.4 docker命令
docker命令是你与Docker容器和镜像直接打交道所使用的主要命令。实际上,在Docker软件的一些软件包中,docker``只是为数不多的几个可执行命令之一。
一旦按第2章的描述安装了Docker软件,只要启动Docker服务就能开始使用docker命令。docker命令内置的一个不错的特性是Tab自动补全(如果你是从默认的bash shell运行Docker的话)。因此,一旦Docker服务运行起来,你就可以作为root用户输入docker,紧跟着按下两次Tab键来查看可用的docker子命令:
# docker <Tab><Tab>
attach exec inspect port rmi tag
build export kill ps run top
commit help load pull save unpause
cp history login push search version
create images logout rename start wait
diff import logs restart stats
events info pause rm stop
因为本书第二部分的多数章节专门讲授docker如何与这些子命令一起使用,所以我不会花太多时间展示它们都是如何工作的。相反,我会概述能用它们做什么。
查找Docker组件的信息:使用docker version展示Docker特性的版本信息。使用docker info查看运行Docker的系统的信息。docker help查看可以与docker命令一起使用的命令和选项。使用docker history展示镜像的历史。使用docker inspect查看镜像或容器的信息。使用docker port列出容器的端口映射。
操作正在运行的容器:使用docker ps列出正在运行的容器。使用docker attach将另一个命令附加到正在运行的容器上。使用docker exec在正在运行的容器中执行命令。使用docker inspect审查容器的元数据。使用docker cp从容器向宿主机系统复制文件。使用docker diff检查容器从启动后其文件系统所做的改变。
操作镜像:使用docker images列出系统上的镜像。使用docker run运行镜像。使用docker pull从registry向本地系统拉取镜像。使用docker push将镜像推送到registry中。使用docker save将镜像保存为tarball。使用docker load从tarball文件加载本地镜像。使用docker export从容器中将文件系统导出成本地系统的tarball文件。
操作Docker registry:使用docker search在registry中搜索镜像。使用docker login登录到Docker Hub Registry(你就能用自己的账号来推送和拉取镜像)。使用docker logout从Docker Hub Registry登出。
修改现存的镜像:使用docker tag为镜像添加一个名字。使用docker rename修改镜像的名字。
修改容器的状态:使用docker stop停止正在运行的容器。使用docker start启动一个已经停止的容器。使用docker pause暂停容器。使用docker unpause重新启动一个已经暂停的镜像。使用docker kill向容器发送kill信号或其他信号。使用docker restart停止并重新启动容器。
查看Docker的活动:使用docker events查看Docker服务器的事件。使用docker top查看容器的进程活动。使用docker logs查看由容器产生的日志消息。使用docker stats查看容器的CPU和内存使用统计。使用docker wait查看容器直到它停止,然后打印它的退出代码。
创建镜像和容器:使用docker build从头构建镜像。使用docker commit从容器创建镜像。使用docker create从镜像创建容器但不运行它。使用docker import将文件系统导入镜像中。
删除容器和镜像:使用docker rm删除已停止的容器。使用docker rmi删除镜像。
尽管Docker是专为帮你以最少的麻烦让容器运行起来而设计的,本书在这里会指导你完成Docker的初次体验,并指出你可能无法自己发现的有趣特性。之后,本书会带你进入Docker中一些很少被绘制的水域——与多容器的部署和管理相关。换句话说,本书为你提供了一种方法来进行Docker探险。