容器化应用程序
预计阅读时间: 7分钟先决条件
- 在第1部分中完成设置和定向。
介绍
现在,借助Docker Desktop,我们已经在我们的开发环境中设置了首选的协调器,我们可以开始开发容器化的应用程序。通常,开发工作流程如下所示:
- 首先创建Docker映像,为应用程序的每个组件创建和测试单独的容器。
- 将您的容器和支持基础架构组装成一个完整的应用程序,以Docker堆栈文件或Kubernetes YAML表示。
- 测试,共享和部署完整的容器化应用程序。
在本教程的此阶段,我们将重点放在此工作流程的第1步:创建容器将基于的图像。请记住,Docker映像捕获了我们的容器化进程将在其中运行的私有文件系统;我们需要创建一个图像,其中包含我们的应用程序需要运行的内容。
一旦学习了如何构建映像, 容器化的开发环境就比传统的开发环境更容易建立,我们将在下面讨论。这是因为容器化的开发环境将隔离您的应用程序在Docker映像中所需的所有依赖关系;除了在您的开发机器上安装Docker外,无需安装其他任何工具。这样,您可以轻松开发用于不同堆栈的应用程序,而无需在开发计算机上进行任何更改。
配置
-
从GitHub克隆一个示例项目(如果您尚未安装git,请首先参阅安装说明 ):
git clone -b v1 https://github.com/docker-training/node-bulletin-board cd node-bulletin-board/bulletin-board-app
这是一个简单的公告板应用程序,用node.js编写。在此示例中,假设您编写了此应用程序,现在正尝试对其进行容器化。
-
看一下名为
Dockerfile
的文件。Dockerfile描述了如何为容器组装专用文件系统,并且还可以包含一些元数据,这些元数据描述了如何基于该映像运行容器。公告板应用程序Dockerfile如下所示:FROM node:6.11.5 WORKDIR /usr/src/app COPY package.json . RUN npm install COPY . . CMD [ "npm", "start" ]
编写Dockerfile是容器化应用程序的第一步。您可以将这些Dockerfile命令视为有关如何构建映像的逐步指南。此步骤采取以下步骤:
FROM
现有node:6.11.5
映像开始。这是由node.js供应商构建的官方映像 ,并已由Docker验证为包含节点6.11.5解释器和基本依赖项的高质量映像。- 使用
WORKDIR
指定应从映像文件系统中的目录/usr/src/app
(而不是主机的文件系统)中执行所有后续操作。 - 将文件
package.json
从主机COPY
到映像中的当前位置(.
)(因此,在本例中,COPY
到/usr/src/app/package.json
) - 在映像文件系统中
RUN
命令npm install
(它将读取package.json
以确定应用程序的节点依赖性,并安装它们) - 将应用程序其余部分的源代码从主机
COPY
到图像文件系统。
您会看到,这些步骤与在主机上设置和安装应用程序所采取的步骤几乎相同-但是将它们捕获为Dockerfile可以使我们在可移植的隔离Docker映像中执行相同的操作。
上面的步骤构建了映像的文件系统,但是Dockerfile中还有一行。
CMD
指令是我们在映像中指定一些元数据的第一个示例,该元数据描述了如何基于该映像运行容器。在这种情况下,这意味着该映像旨在支持的容器化过程是npm start
。上面您看到的是组织一个简单的Dockerfile的好方法。始终以
FROM
命令开头,然后按照步骤构建您的私有文件系统,并以任何元数据规范作为结束。Dockerfile指令比上面我们看到的要多。有关完整列表,请参阅Dockerfile参考 。
建立并测试您的形象
现在我们有了一些源代码和一个Dockerfile,现在该构建我们的第一个映像,并确保从其启动的容器能够按预期工作。
Windows用户 :此示例使用Linux容器。右键单击系统任务栏中的Docker徽标,然后单击“切换到Linux容器...”,以确保您的环境正在运行Linux容器。不用担心-您将在本教程中学到的所有内容对于Windows容器都完全相同。
-
确保您位于终端机或Powershell中的目录
node-bulletin-board/bulletin-board-app
中,并构建公告板图像:docker image build -t bulletinboard:1.0 .
您将看到Docker逐步完成Dockerfile中的每条指令,逐步构建映像。如果成功,则构建过程应以一条消息
Successfully tagged bulletinboard:1.0
。Windows用户:在此步骤中,您可能会收到一条标题为“安全警告”的消息,其中指出了为添加到图像中的文件设置的读取,写入和执行权限;在此示例中,我们不会处理任何敏感信息,因此在此示例中,请不要理会此警告。
-
根据您的新映像启动一个容器:
docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0
我们在这里使用了几个常见的标志:
--publish
要求Docker将主机端口8000--publish
入的流量转发到容器的端口8080(容器具有自己的私有端口集,因此如果我们要从网络访问一个端口,则必须在此将流量转发给它方式;否则,防火墙规则将阻止所有网络流量到达您的容器,这是默认的安全状态)。--detach
要求Docker在后台运行此容器。--name
使我们可以指定一个名称,在后续命令中使用该名称可以引用我们的容器,在本例中为bb
。
还要注意,我们没有指定我们要运行容器的进程。我们没有必要,因为在构建Dockerfile时使用了
CMD
指令。因此,Docker知道在npm start
时会自动在容器内运行npm start
进程。 -
在位于
localhost:8000
的浏览器中访问您的应用程序。您应该看到公告板应用程序已启动并正在运行。在这一步,我们通常会竭尽所能,以确保我们的容器按预期的方式工作;例如,现在是运行单元测试的时候了。 -
对公告板容器正常工作感到满意后,将其删除:
docker container rm --force bb
结论
至此,我们已经对应用程序进行了简单的容器化,并确认我们的应用程序已在其容器中成功运行。下一步将是编写Kubernetes yaml,以描述如何在Kubernetes上运行和管理这些容器(我们将在本教程的第3部分中进行研究),或者编写堆栈文件以使我们能够在Docker Swarm上进行相同的操作,我们将在第4部分中进行讨论。
CLI参考
此处提供了本文中使用的所有CLI命令的更多文档:
容器 , 图像 , dockerfiles , 节点 , 代码 , 编码 , 构建 , 推送 , 运行