Docker 容器的前景
大家好!我的上一篇文章,标题是《如何将容器融入你的日常工作》,主要讲解了如何使用容器来提升开发者的工作效率。
问题在于它需要你们知道如何设置、配置和运行 Docker 容器。
我不应该假设每个人读到那篇文章时都具备了必备的知识,所以这里有一篇我一年半前写的文章。它涵盖了两件事:
-
作为开发人员,容器可以给您带来哪些好处。
-
从头开始构建基于 CentOS LAMP 堆栈的图像并启动容器以服务 Web 应用程序的演示/演练。
我还更新了本文末尾的附加资源,以便它们是截至 2019 年 7 月 31 日的最新链接/文档/安装程序。
希望您喜欢!
容器的前景
作为一名 Web 开发者,我相信你一定搭建过一两台服务器。你可能启动了一台 Linux 系统,安装了一些软件包,比如 Apache、MySQL 或 PHP。或许你从 GitHub 拉取了一些代码,搭建了一个数据库,并编辑了一些配置文件,根据自己的喜好调整服务器。
(如果您尚未构建服务器并且有兴趣了解如何构建,请查看我的 LearnToProgram.TV 课程“服务器管理简介”。- https://www.udemy.com/introduction-to-server-administration/)
但是,如果您的服务器损坏,您的备份在您没有注意到的情况下失败,或者您的网站出现病毒式传播并且流量开始超出您的基础设施可以处理的范围,会发生什么情况?
如果您是服务器管理新手,以上任何一种情况都可能让您望而生畏。一旦发生,您将面临比手动重建服务器更大的麻烦。您还必须希望您的文档足够详尽,能够涵盖您对原始系统所做的每一项修改。您有文档,对吧?
简而言之,任何规模的灾难都会让你一整天都感到沮丧,甚至彻夜难眠。灾难确实会发生,因此提前做好准备是明智之举。让我来向你介绍 Docker,它是一个容器管理系统。
“但是亨利,容器到底是什么?我为什么要关心它们?”
好问题。在软件开发的语境中,容器的最佳定义是存在于内核之上的、分段且隔离的用户空间实例。
“是的……你能说得更简单点吗?”
我当然可以。解释容器最简单的方法是将其与虚拟机 (VM) 进行比较。在一台服务器上运行三个不同应用程序的一种方法是运行三个不同的虚拟机,这些虚拟机由操作系统、应用程序以及应用程序运行所需的所有依赖项组成。在本例中,容器是运行应用程序所需的最少代码和依赖项的集合。Docker 可作为任意数量或类型的容器的客户操作系统。其明显的优势是,它比运行多个虚拟机更节省资源。
资料来源:https ://images.idgesg.net/images/article/2017/06/virtualmachines-vs-containers-100727624-large.jpg
“文字。这开始有意义了。用文字给我描绘一下。”
明白了。让我们深入探讨 Docker(以及容器技术)如何将您的游戏提升到一个新的高度。使用 Docker 的好处数不胜数,但为了简洁起见,我只想重点介绍我认为最重要的五个方面。
1.速度
关键在于,Docker 允许你以编程方式构建基础设施。这意味着,你无需每次需要新服务器时都手动构建,只需根据预先定义的镜像启动一个,该镜像定义了最终容器的用途。在新项目开始时构建镜像会耗费更多时间,但每次需要构建重复环境时,只需几分钟而不是几小时。
2.易于使用
除了速度之外,能够随时快速启动所需的基础设施实例,也能极大地提升您的组织效率。假设您正在构建的应用程序登上了 Reddit 首页,您的流量突然失控。您的网站也可能遭到黑客攻击,被迫下线。无论哪种情况,您都需要快速恢复在线。您的业务很可能依赖于此。至少有九成的情况是,启动容器比搭建全新服务器更快。
3. 安全
容器的基本原则是它们是围墙花园。其最初的好处是,您可以将应用程序与其各自的依赖项捆绑在一起,这样,如果容器 A 需要 PHP5,而容器 B 需要 PHP7,就可以处理,而不必担心依赖项冲突。这两个容器可以并行运行,但不会互相干扰。
围墙花园方法还意味着您可以精确定义数据如何流入和流出容器。您将在演示中看到,我们明确地告诉容器“EXPOSE 80”。这意味着可以将容器中的 80 端口开放给运行它的更广泛的系统,以便 Apache 可以执行其工作并通过该端口托管内容。当您开始使用 Docker 构建更复杂的系统时,您可以使用这种安全性将运行应用程序的某些容器链接到其他包含数据库或运行某些特定微服务的特定容器。
4.可移植性
简单来说,容器就是一个打包了正确运行所需最低限度资源的应用程序,因此你可以在任何能够运行 Docker 的设备上运行该容器。无论是在 Red Hat Enterprise Linux、MacBook Pro 还是 Windows Server 2016 上,该容器都能启动并正常运行。
另一个好处是,您可以在最终将成为生产环境的环境中开发。您的容器将基于一个镜像,该镜像是一份编译好的指令列表,其中包含有关如何构建特定环境的信息。您可以使用该镜像在笔记本电脑上启动一个容器,并在其中构建您的应用。当您准备启动时,您可以使用同一个镜像在公共服务器上部署一个容器,并且完全确信它在公共服务器上的运行效果与在本地相同。
5.版本可控性
最后,由于 Docker 允许您以代码形式构建基础设施,因此您的基础设施可以输入版本控制系统。再一次提醒后台人员。您的基础设施现在可以进行版本控制了。如果您进行了更改,但出现问题,只需回滚即可。如果您的数据中心不知何故彻底崩溃,您可以从远程存储库中提取镜像和代码。未来的您会感谢现在的您,让他们的生活变得如此轻松。
Docker 演示
说了这么多,现在让我们来构建我们的第一个容器吧。我假设你已经充分了解了 Docker 的实用性,并且已经下载并安装了它。如果你还没有,请立即安装。
https://docs.docker.com/install/
开个玩笑,假设我需要一个在 CentOS 服务器上运行的基本网站进行演示。我有两种方法可以实现:我可以花 20 分钟从头开始创建一个新服务器,或者我可以使用 Docker 构建一个镜像,然后它可以实例化无数个相同的容器来运行我的网站。
1 - 创建 Dockerfile
首先,创建一个新的项目目录并创建一个名为 的文件Dockerfile
,该文件列出了如何在基础镜像之上构建系统的说明。基础镜像可以基于 PHP 等语言、Node 等运行时或 Ubuntu 等操作系统。它们通常由源产品的维护者提供。这意味着它们是由软件的创建者专门为与 Docker 协同工作而构建的。
然后,我们需要关于如何在该基础上进行构建的说明。我们可以使用一些命令,例如:RUN
、ADD
和CMD
。它们分别运行 Shell 级命令、将文件从主机映射到容器,并指定启动时要运行的命令。我们将配置服务器的步骤转换为 Docker 可以用来自动化流程的任务。
它与 Git 后台的工作方式类似,每个提交(或指令)都是对上次提交进行的一组更改,而不是当时的整个代码库。
为了简单起见,我们将构建一个非常基本的图像。我们的 Dockerfile 如下:
# Dockerfile
# Basic Setup
FROM centos:7
LABEL maintainer="henry@tld.com"
# Update repos and install httpd
RUN yum -y update && \
yum -y install httpd && \
yum clean all
# Expose a port from the container to Docker and run the startup script on launch
EXPOSE 80
CMD ["/usr/sbin/apachectl", "-DFOREGROUND"]
Dockerfile 读起来出奇地像英文。它只是说我们要以 CENTOS y 为基础,安装 Apache,暴露 80 端口以映射到不同的主机端口,并在系统启动时启动 Apache。
2 - 打造你的形象
保存 Dockerfile 后,我们将在终端中运行“build”命令/这告诉 Docker(实用程序)使用我们的 Dockerfile(指令列表)来构建系统。
首先,我们需要打开终端并进入包含 Dockerfile 的目录。对我来说,这个目录是~hquinn/dev/forDevTo/TheFutureIsDocker/DockerDemo/
。
然后我们需要告诉 Docker 实用程序构建 Dockerfile 所描述的图像。
表示--rm
我们要自动删除构建过程中生成的中间容器,-t hquinn/dockerdemo
用名称标记我们的构建,以便我们以后可以更轻松地引用它,最后的.
表示我们要在当前工作目录中运行此命令。
此命令会将构建过程的每个部分都输出到控制台。这可能需要几分钟,这完全正常。静置一分钟;它会告诉你构建何时完成。
3 - 验证您的图像
一旦 Docker 下载了我们选择使用的基础镜像(CentOS 7),安装了 Apache,并完成了所有其他操作,我们就会得到一个最终的镜像,其名称以构建命令中的标签为准。您可以通过列出系统上的 Docker 镜像来查看它(以及 CentOS 7 基础镜像)。
4 - 启动容器
镜像构建完成后,我们可以用它来创建一个正在运行的容器。我们将切换到第一个容器中想要运行的项目目录,然后运行一个docker run
命令。
(在这里,我使用了 Dave Moran 的 LTP 课程中的示例项目,标题为“学习 SASS 和 SCSS” - https://www.udemy.com/learn-sass-and-scss/)
这个命令告诉 Docker 基于我们刚刚构建的镜像运行一个容器,但它还有一些其他参数。-d
指示 Docker 将容器作为守护进程(在后台)运行;-p 80
指示将容器上的 80 端口映射到主机上的某个端口,以便可以通过浏览器查看;--name Project1
指示再次命名资源;指示 Docker 将我们的本地目录--mount type=bind,source="$(pwd)"/app/,target=/var/www/html/
映射到容器中,以便 Apache 可以为我们托管它。./app/
/var/www/html/
5 - 验证您的容器
现在容器已经运行,代码也加载进去了,我们可以在浏览器中查看它了。首先,我们需要弄清楚容器暴露的端口绑定到了哪个本地端口。
我们可以看到,正在运行的名为 的容器Project1
已将本地端口 32769 映射到容器上的端口 80(您的计算机上的主机端口可能有所不同)。如果我们打开浏览器并访问localhost:32769
,就可以看到我们的代码正在实时运行。
6 - 放入容器壳中
就是这样。我们可以继续移动到名为 的子目录中包含基本 HTML/CSS/JS 应用程序的不同目录./app/
,并继续使用相同的命令来生成更多容器。它们将分别启动,将代码映射到/var/www/html/
,并为每个容器分配一个端口localhost
。
我们可以通过运行一个授予 shell 访问权限的 Docker 命令来验证容器是否正在拉取我们的代码。它会让我们以 root 用户身份直接进入 CentOS 系统的根目录。如果我们查看 Web 目录,就会发现它已经拉取了我们的文件,并使用 Apache 来托管它们,就像在传统的 VPS 上一样。
7 - 清理
如果没有文件清理,演示怎么会完整呢?如果我们不停地创建容器而不进行任何维护,最终会达到硬件的极限。这可不是什么好主意。让我们关闭并删除我们启动的容器,然后删除它所基于的镜像。
容器是虚无缥缈的。一旦用命令停止容器docker stop
,我们就可以立即重新启动它,它的状态与我们第一次启动它时完全一样。要删除已停止的容器,我们可以运行命令docker rm
。要删除它所基于的镜像,我们也可以运行docker rmi
命令。
结尾
Docker 并非像看上去那么难以驾驭。理解它可能会有些棘手,但一旦理解,你就会很容易看到它带来的好处。它不仅能让你在生产环境中进行本地开发,还能让你根据自身需求调整基础设施:无论是为了满足病毒式需求而扩展,还是为了从灾难事件中恢复。
此外,这只是 Docker 功能的冰山一角。您的构建可以根据需要,简单或复杂。例如,我有一个构建包含三个容器:一个运行 Node 应用程序,另一个运行 PostgreSQL 并通过数据卷实现数据持久化的容器,第三个容器充当查询缓存。
作为开发者,Docker 绝对是你武器库中不可或缺的强大工具。说实话,即使它旨在解决你尚未遇到的问题,你最终也会发现自己需要 Docker 来拯救你,而当你真正需要它时,你也会做好准备。它的文档非常精彩,虽然听起来可能有些老套,但真正限制你的只有你的想象力。现在,开始构建你的基础设施即代码吧。
其他资源
文章 & 对应代码
Docker 桌面版安装程序
Docker 入门指南
Docker 实验室 - Katacoda
Dockerfile 文档
容器技术乍一看可能有点难,因为乍一看,这个领域似乎有太多东西需要学习。然而,一旦你深入研究,就会发现它只是一些自动化的轻量级系统管理工作,所以你第一次只需要投入相当多的努力。
希望这篇文章足以帮助你们中的至少一个人开始容器启蒙之旅!
另外,我的 Raspberry Pi K8s Bramble 的零件也陆续寄到了。明天下午就放在我的冷却架上。迫不及待地想开始组装,为大家创作更多内容。
在那之前,请保持冷静。
https://henryneeds.coffee
博客
LinkedIn
Twitter