容器化应用程序

预计阅读时间: 7分钟

先决条件

介绍

现在,借助Docker Desktop,我们已经在我们的开发环境中设置了首选的协调器,我们可以开始开发容器化的应用程序。通常,开发工作流程如下所示:

  1. 首先创建Docker映像,为应用程序的每个组件创建和测试单独的容器。
  2. 将您的容器和支持基础架构组装成一个完整的应用程序,以Docker堆栈文件或Kubernetes YAML表示。
  3. 测试,共享和部署完整的容器化应用程序。

在本教程的此阶段,我们将重点放在此工作流程的第1步:创建容器将基于的图像。请记住,Docker映像捕获了我们的容器化进程将在其中运行的私有文件系统;我们需要创建一个图像,其中包含我们的应用程序需要运行的内容。

一旦学习了如何构建映像, 容器化的开发环境就比传统的开发环境更容易建立,我们将在下面讨论。这是因为容器化的开发环境将隔离您的应用程序在Docker映像中所需的所有依赖关系;除了在您的开发机器上安装Docker外,无需安装其他任何工具。这样,您可以轻松开发用于不同堆栈的应用程序,而无需在开发计算机上进行任何更改。

配置

  1. 从GitHub克隆一个示例项目(如果您尚未安装git,请首先参阅安装说明 ):

    git clone -b v1 https://github.com/docker-training/node-bulletin-board
    cd node-bulletin-board/bulletin-board-app
    

    这是一个简单的公告板应用程序,用node.js编写。在此示例中,假设您编写了此应用程序,现在正尝试对其进行容器化。

  2. 看一下名为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容器都完全相同。

  1. 确保您位于终端机或Powershell中的目录node-bulletin-board/bulletin-board-app中,并构建公告板图像:

    docker image build -t bulletinboard:1.0 .
    

    您将看到Docker逐步完成Dockerfile中的每条指令,逐步构建映像。如果成功,则构建过程应以一条消息Successfully tagged bulletinboard:1.0

    Windows用户:在此步骤中,您可能会收到一条标题为“安全警告”的消息,其中指出了为添加到图像中的文件设置的读取,写入和执行权限;在此示例中,我们不会处理任何敏感信息,因此在此示例中,请不要理会此警告。

  2. 根据您的新映像启动一个容器:

    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进程。

  3. 在位于localhost:8000的浏览器中访问您的应用程序。您应该看到公告板应用程序已启动并正在运行。在这一步,我们通常会竭尽所能,以确保我们的容器按预期的方式工作;例如,现在是运行单元测试的时候了。

  4. 对公告板容器正常工作感到满意后,将其删除:

    docker container rm --force bb
    

结论

至此,我们已经对应用程序进行了简单的容器化,并确认我们的应用程序已在其容器中成功运行。下一步将是编写Kubernetes yaml,以描述如何在Kubernetes上运行和管理这些容器(我们将在本教程的第3部分中进行研究),或者编写堆栈文件以使我们能够在Docker Swarm上进行相同的操作,我们将在第4部分中进行讨论。

进入第3部分>>

CLI参考

此处提供了本文中使用的所有CLI命令的更多文档:

容器图像dockerfiles节点代码编码构建推送运行