Docker入门教程第二部分,容器化应用程序

先决条件

介绍

现在,借助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构建,并已由Di=o==[={+{ b er验证为包含node 6.11.5解释器和基本依赖项的高质量镜像。
    • 使用WORKDIR指定所有后续操作应从镜像文件系统(而不是主机的文件系统)中的目录usr/src/app执行。
    • 将主机中的package.json文件复制到镜像中的当前位置(在本例中,复制到/usr/src/app/package.json中)。
    • RUN命令npm install,在镜像文件系统内部(它将读取package.json以确定应用程序的节点依赖性,并进行安装)
    • COPY其余应用源代码,从您的主机到镜像文件系统。

    您会看到,这些步骤与您在主机上设置和安装应用程序所采取的步骤几乎相同。但是将它们提取为Dockerfile,可以使我们在可移植的、隔离的Docker镜像中执行相同的操作。

    上面的步骤构建了镜像的文件系统,但是Dockerfile中还有一行。 CMD指令是我们在镜像中指定元数据的第一个示例,该元数据描述了如何基于该镜像运行容器。在本例中,这意味着该镜像要支持的容器化过程是npm start

    您上面看到的是组织一个简单的Dockerfile的好方法。总是以FROM命令开头,然后按照步骤构建您的私有文件系统,并以元数据格式结束。 Dockerfile指令比上面我们看到的要多。完整列表,请参见Dockerfile reference

构建并测试您的镜像

现在我们有了源代码和一个Dockerfile,可以构建我们的第一个镜像了,并确保从其启动的容器可以按预期工作。

Windows用户:此示例使用Linux容器。右键单击系统托盘中的Docker图标,然后如果出现“Switch to Linux containers...”,单击它,以确保您的环境正在运行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端口上传入的流量转发到容器的端口8080(容器具有自己的私有端口集,如果我们要从网络访问一个端口,则必须以这种方式将流量转发给它;否则,防火墙规则将阻止所有网络流量到达您的容器,这是默认的安全状态)。
- `--detach` 要求Docker在后台运行此容器。
- `--name` 让我们指定一个名称,在后续命令中使用该名称可以引用我们的容器,在本例中为`bb`。

还要注意,我们没有指定我们要运行容器的程序。 我们没有必要,因为在构建Dockerfile时使用了`CMD`指令。 因此,Docker知道在容器启动时会自动在容器内运行`npm start`程序。
  1. 在浏览器的localhost:8000处访问您的应用程序。 您应该看到公告板应用程序已启动并正在运行。 在这一步,我们通常会竭尽所能,以确保我们的容器按预期的方式工作; 例如,现在是运行单元测试的时候了。

  2. 当我们公告板容器正常工作后,将其删除:

    docker container rm --force bb
    

结论

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

第三部分>>

CLI 参考

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