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

更新时间:

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

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

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

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

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

最新发布