在我的上一篇文章 “什么是 Docker”中, 我介绍了 Docker 是什么以及为什么要使用它的基础知识。本文将是关于如何使用它的三部分系列文章的第一部分。
本指南旨在提供一种简单但实用的入门 Docker 基础知识的方法。尽管仅在一个指南中就涵盖了很多内容,但它几乎不涉及 Docker 的功能及其在编排方面的强大功能。在接下来的两周内,我们将继续阅读另外两篇文章,以涵盖 Docker 的所有主要部分,以及一些真实世界的示例和用法。
安装 Docker
Docker 目前是一个仅限 Linux 的平台,这意味着您需要访问基于 Linux 的服务器或虚拟机 (VM)。不用担心;如果您不在本机运行 Linux,则有许多易于设置的工具同时适用于 Windows 和 OS X。其中最简单的是 Boot2Docker ,它同时支持 Windows 和 OS X。以下是指向的链接安装说明:
OS X 也有 Kitematic ,它为许多命令提供了一个 GUI 包装器,但仍然允许您直接运行它们。
注意: 本指南假设您已经在本地计算机上安装了 Boot2Docker。虽然几乎所有命令都应该相同,但如果您在不同平台上使用 Docker,日志输出中可能会有一些差异。
需要确保的一件事是您使用的是最新的 1.6 版本(事实上,撰写本文时最新版本是 1.6.2)。随着 Docker 的快速发展,保持最新状态对于获得最新功能非常重要。
安装 Boot2Docker 后,您需要初始化并启动它。请仔细阅读官方
安装
并仔细确保您已遵循这些流程。基本上,安装后应该有三个主要步骤。您需要运行
boot2docker init
,然后
boot2docker start
和
boot2docker shellinit
来为您完美地设置和配置环境。
第一步
现在您已经安装了 Docker,让我们快速浏览一下可用的内容。如果您来自 Web 开发领域,命令结构类似于 Grunt、Bower、npm 等,其中每个命令都以应用程序名称开头。
例如,让我们查看 Docker 安装的版本号。这也是确保 Docker 正确安装和运行的好方法。为此,请运行:
docker version
这应该给你一个类似这样的输出:
docker version
如您所见,我运行的是最新版本(截至 2015 年 5 月),即 1.6.2。
如果您没有看到与此类似的输出,则可能意味着您的安装有问题。确保您首先运行了
boot2docker init
。如果这还没有解决问题,请阅读官方
Docker 帮助
页面以获取进一步帮助的建议。
码头工人图像
命令: docker pull
注意:当您第一次尝试运行容器时,会自动从官方存储库中提取图像,但如果您在工作时要离线,它会很方便。
docker pull
命令将从 Docker 存储库下载图像和关联层。这些层包括从基本操作系统到最终应用程序的所有内容。您可以通过
Docker Registry
浏览和搜索图像,其中包含超过 13,000 个公开可用的图像。
让我们下载最新的 Python 镜像:
docker version
然后你应该看到这样的输出:
Docker 会自动拉入 Python 镜像的各个层并提取它们。您可能还注意到版本号或缺少版本号。因为我们没有指定版本,Docker 会自动为我们抓取“最新”版本。版本是由标签控制的,所以如果我们想要不同的版本或者想要维护一个特定的版本,我们可以指定它。
对于 Python ,我们可以通过运行以下命令获取 Python 2.7 的副本:
docker version
您会看到,因为我们之前已经下载了 Python,所以只有几层不同。拿到这个版本的时间应该也比较快,所以分层镜像的方式非常有效率。
命令: docker images
让我们看看我们现在有哪些 Docker 镜像:
docker version
如果您复制了我上面的 Python 示例,您将看到如下输出:
docker version
这里有两件重要的事情需要注意。首先,它不显示形成图层的中间图像。您可以使用
docker images -a
查看这些,如果您真的很感兴趣,但在大多数情况下您不需要担心它们。
其次,两者的“虚拟大小”似乎几乎相同,尽管 Docker 具有共同的中间图像。这个大小列出了所有图像的组合,但实际上占用的磁盘空间要少得多。
命令: docker rmi
您可以使用
rmi
命令删除未使用的图像。您可以通过 ID 或名称以及版本号来引用图像。例如,让我们删除 Python 2.7 图像:
docker version
输出应该与此类似:
docker version
如果图像正在使用中,Docker 不应让您删除它。尽管如此,在继续之前,请务必仔细检查您是否删除了正确的图像!
使用容器
命令: docker运行
这就是乐趣的开始!在我们开始之前,我只想强调容器提供进程隔离、它们自己的文件系统和它们自己的网络层。 Docker 执行此操作的速度非常快,当您亲自尝试时就会看到这一点。
让我们尝试简单地运行 Python:
docker version
因为我们之前已经下载了最新版本 Python 的镜像,所以它可以创建容器并几乎立即运行它。如果它是一个你之前没有下载或使用过的镜像,Docker 会在运行命令中自动下载镜像。
你应该看到这样的输出:
docker version
因为我们使用
-t
标志运行它,它创建了一个 Python 在其中运行的伪 TTY。这还需要
-i
交互模式,以便您可以向程序发送输入。对于那些不熟悉 Python 的人,您可以简单地按 Ctrl + D 退出。当它退出时,它也会关闭容器,因为我们在交互模式下有它。
让我们启动一个基本的 Web 应用程序作为守护进程(使用
-d
标志指定)并查看:
docker version
您将看到,在此示例中,Docker 自动下载运行它所需的映像,然后启动。输出应如下所示:
docker version
您会注意到底部以 0c8688 开头的大 ID 字符串,这是容器的唯一标识符。
-p 5050:5000
将主机上的网络端口 5050 映射到容器内的网络端口 5000。这就是使容器的网络可供其他容器和世界访问的方式。
由于这是一个基本的 Flask Web 应用程序,您现在应该能够在浏览器中打开链接。如果您使用的是 Boot2Docker,则首先需要确定 Docker VM 的 IP。为此,请运行:
docker version
这应该返回您的工作站或笔记本电脑可以连接到的本地 IP。要测试站点,请使用返回的 IP 并转到
http://<boot2dockerip>:5050/
。内容不多,但您应该会看到显示的
hello world
以确认一切都按预期工作。
命令: docker ps
一旦我们创建了一个容器,我们就可以使用
ps
命令列出它们。
docker version
这是到目前为止的输出:
docker version
我们可以看到容器0c86的信息,包括创建时间、使用的镜像、网络端口、运行时长等详细信息。
您还会注意到只列出了一个容器。那是因为
ps
命令只显示正在运行的容器。如果我们想看到所有这些,我们可以使用
-a
标志:
docker version
你应该看到这样的输出:
docker version
您会注意到的另一部分是奇怪的名字。别担心,你没有被黑客入侵! Docker 使用基于形容词的 随机 名称,然后是著名的科学家或黑客。这比简单地引用一个长 ID 要好,而且我们可以很容易地重命名它。
命令: docker重命名
让我们给我们的测试应用一个更好的名字:
docker version
现在如果我们运行
ps
,我们应该看到:
docker version
当然,我们可以在创建时指定名称,只需使用
–name
标志即可。例如:
docker version
这会将实例命名为
app_test
,当您拥有多个容器时,这会更有用。
命令: docker停止
如果我们不再需要我们的测试应用程序,我们可以使用
docker stop
命令停止它。我们可以使用容器的名称或 ID 来运行命令。如果我们使用名称,这是命令:
docker version
您也可以使用身份证号码:
docker version
为了确认,Docker 会将 ID 或容器名称回显给您作为函数的返回值。如本例所示,停止容器的时间似乎比启动时间长很多。如果 Docker 实例没有监听标准的 SIGTERM 调用(以便它干净地关闭),它将等待 10 秒,然后调用 SIGKILL 来终止进程。由于这是一个基本的训练示例,它只会等待 10 秒,然后终止进程。
注意: 您可以简单地使用开头的缩写来指代容器 ID。 Docker 需要足够的信息来确保名称的唯一性,因此一般 ID 的前四个字符即可。
命令: docker启动
我们当然可以使用与停止几乎相同的语法再次启动容器。您可以像以前一样通过 ID 和名称来引用容器。
例如:
docker version
如果它回显容器名称或 ID,您将看到容器已启动的确认信息,具体取决于您调用的启动它的方式。您可以通过使用
docker ps
命令和/或再次调用网页来确认它再次运行。
命令: docker 日志
docker version
由于这是一个基于
Flask
的测试服务器,这些文件直接来自 Flask 测试网络服务器。您可以看到它在运行上面的停止/启动示例时多次记录了服务的启动。您还可以看到显示
hello world
页面 (GET /) 的调用以及查看 favicon 是否存在的浏览器。
对于更复杂的系统,当然有更复杂的日志。 Docker 1.6 还允许您配置集中式 日志记录 ( 即 syslog),但这本身就是一篇完整的文章!
结论
如果您读完了本文,希望您已经能够在您自己的 Docker 实例上遵循它,并且应该更好地理解它是如何工作的。要注意的要点是:
- 创作速度
- 容器运行环境的简单性
- 访问容器的方式
即使在这个基础层面上,Docker 也为开发和生产部署提供了一个非常强大的系统。当然,作为基本介绍,这只是刚刚开始触及 Docker 可用功能的皮毛。我们将发布更多文章,其中将涵盖 Docker 的更高级用法以及实际部署以及我们如何实施它们。
如果您有任何问题或部分需要帮助,请随时在下面的评论中提问。
本文最初 由 Tim Butler 在 Conetix 上发表。在他的许可下,我们在这里与 Codeship 读者分享。