Docker 基础知识:实用入门指南

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

在我的上一篇文章 “什么是 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 读者分享。

相关文章