先决条件

完成第一部分的校准和设置

引言

现在你已经设置了开发环境,多亏了 Docker Desktop,你可以开始开发容器化应用程序了。一般来说,开发工作流程是这样的:

  1. 首先创建 Docker 镜像,为每个应用程序的每个组件创建和测试单独的容器。
  2. 将你的容器和配套基础设施组装成一个完整的应用程序。
  3. 测试,共享和部署完整的容器化应用程序。

在本教程的这个阶段,让我们重点关注这个工作流程的第一步:创建容器所基于的镜像。记住,Docker 镜像抓取你的容器化进程将在其中运行的私有文件系统;你需要创建一个包含应用程序所需运行内容的镜像。

一旦你学会了如何构建我们将在下面讨论的镜像,那么容器化的开发环境比传统的开发环境更容易设置。这是因为一个容器化的开发环境会将应用程序所需的所有依赖项隔离在 Docker 镜像中;在你的开发机器上不需要安装任何东西,除了 Docker。通过这种方式,你可以轻松地为不同的堆栈开发应用程序,而无需更改开发机器上的任何内容。

建立

让我们从 Docker 示例画面下载一个示例项目。

GIT

如果你使用的是 Git,你可以从 Github 中克隆出这个示例项目:

  1. git clone https://github.com/dockersamples/node-bulletin-board
  2. cd node-bulletin-board/bulletin-board-app

Windows(without Git)

如果你使用的是 Windows 机器,并且希望下载示例项目而不安装 Git,那么可以在 PowerShell 中运行以下命令:

  1. curl.exe -LO https://github.com/dockersamples/node-bulletin-board/archive/master.zip
  2. tar.exe xf master.zip
  3. cd node-bulletin-board-master\bulletin-board-app

Mac or Linux(without Git)

如果你使用的是 Mac 或 Linux 机器,并且希望下载示例项目而不安装 Git ,请在终端中运行以下命令:

  1. curl -LO https://github.com/dockersamples/node-bulletin-board/archive/master.zip
  2. unzip master.zip
  3. cd node-bulletin-board-master/bulletin-board-app

node-bulletin-board 项目是一个简单的公告板应用程序,用 Node.js 编写。在本例中,让我们假设你编写了这个应用程序,现在正尝试将其封装。

用 Dockerfile 定义一个容器

在公告栏应用程序中查看名为 Dockerfile 的文件。Dockerfiles 描述如何为容器装配专用文件系统,还可以包含一些元数据,这些元数据描述如何基于此镜像运行容器。公告板上的应用程序 Dockerfile 是这样的:

  1. 使用官方镜像作为父镜像
  2. # Use the official image as a parent image.
  3. FROM node:current-slim
  4. 设置工作目录
  5. # Set the working directory.
  6. WORKDIR /usr/src/app
  7. 将文件从主机复制到当前位置
  8. # Copy the file from your host to your current location.
  9. COPY package.json .
  10. 在镜像文件中运行该命令
  11. # Run the command inside your image filesystem.
  12. RUN npm install
  13. 通知Docker容器正在运行时监听指定的端口
  14. # Inform Docker that the container is listening on the specified port at runtime.
  15. EXPOSE 8080
  16. 在容器中运行指定的命令
  17. # Run the specified command within the container.
  18. CMD [ "npm", "start" ]
  19. 将应用程序的其余源代码从主机复制到镜像文件系统
  20. # Copy the rest of your app's source code from your host to your image filesystem.
  21. COPY . .

编写 Dockerfile 是将应用程序装入容器的第一步。你可以将这些 Dockerfile 命令看作是逐步构建镜像的方法。这个步骤如下:

  • 从先前存在的 node:current-slim 镜像开始,这是一个官方镜像,由 node.js 供应商构建,并经过 Docker 验证,是一个高质量的镜像,包含 Node.js 长期支持(LTS)解释器和基本依赖。
  • 使用 WORKDIR 可以指定所有后续操作均应从镜像文件系统的目录 /usr/src/app 中执行(而不是主机的文件系统中)
  • 将文件 package.json 从主机复制到镜像中的当前位置(.)(在实例中,复制到 /usr/src/app/package.json )
  • 在镜像文件系统中运行命令 npm install(将读取 package.json 以确定应用程序的节点依赖性,然后安装他们)
  • 将应用程序的其余源代码从主机复制到镜像文件系统

你可以看到,这些步骤与你在主机上设置和安装应用程序的步骤大致相同。但是将他们捕获 Dockerfile 允许你在可移植的,独立的 Docker 镜像中执行相同的操作。
上面的步骤构建了镜像的文件系统,但是 Dockerfile 中还有其他行。
CMD 指令是第一个在镜像中指定元数据的实例,这些元数据描述了如何基于此镜像运行容器。在本例中,它说这个镜像要支持的容器化进程是 npm start 。
EXPOSE 8080 通知 Docker 容器正在运行时监听端口 8080 。
你在上面看到的是组织一个简单 Dockerfile 的好方法;始终以 命令开始,按照它的步骤构建你的私有文件系统,最后以任何元数据规范结束。Dockerfile 指令上面看到的要多得多。有关完整列表,请参阅 Dockerfile 参考。

构建并测试你的镜像

现在你已经有了一些源代码和一个 Dockerfile,现在可以构建你的第一个镜像了,并确保从其中启动的容器按预期工作。
Windows 用户:本例使用 Linux 容器。右击系统托盘中的 Docker 图标,确保你的环境正在运行 Linux 容器,如果出现选项,则单击 Switch to Linux containers 。不要担心——本教程中的所有命令对 Windows 容器的工作方式都是完全相同的。
确保使用 cd 命令位于终端或 PoweShell 中的 node-bulletin-board/bulletin-board-app 目录中。让我们建立你的电子公告板形象:

  1. docker build --tag bulletinboard:1.0 .

你将看到 Docker 一步步遍历 Dockerfile 中的每个指令,在此过程中构建镜像。如果成功,构建过程应该以一条 Successfully tagged bulletinboard:1.0 消息结束。
Windows用户:在此步骤中,你可能会收到一条标题为 ‘SECURITY WARNING’ 的消息,指出正在为添加到镜像中的文件设置的读、写和执行权限。在本例中,我们没有处理任何敏感信息,因此可以忽略本例中的警告。

将镜像作为容器运行

  1. 基于你的新镜像启动一个容器:
    1. docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0
    这里有几个常见的标志:
  • —publish 请求 Docker 将来自主机端口 8000 的流量转发到容器端口 8080 .容器有他们自己的私有端口集,因此如果你想从网络中访问,你必须以这种方式将流量转发给它。否则,作为默认的安全状态,防火墙规则将阻止所有网络流量到达你的容器。
  • —detach 请 Docker 在后台运行此容器
  • —name 指定一个可以在后续命令中引用容器的名称,在本例中是 bb 。

还要注意,你没有指定希望容器运行什么进程。你不需要,因为你已经使用 CMD 指令构建你的 Dockerfile ;由于这一点,Docker 知道在容器内启动时自动运行进程 npm start 。

  1. 在 localhost:8000 的浏览器中访问你的应用程序。你应该可以看到你的公告板应用程序已经启动并正在运行。在此步骤中,你通常会尽一切努力确保容器按预期的方式工作;例如,现在是运行单元测试的时候了。
  2. 一旦你确信你的公告板容器工作正常,你可以删除它:
    1. docker rm --force bb
    —force 选项删除正在运行的容器。如果你停止使用运行的容器 docker stop bb 则无需使用 —force 。

    结论

    到此,你已经成功地创建了一个镜像,执行了一个应用程序的简单容器化,并确认你的应用程序在其容器中成功运行。下一步将是在 Docker Hub 上共享你的镜像,这样它们就可以很容易的下载并在任何目标机器上运行。