创建自己的 Docker 镜像

zr - 2024-02-04 22:52:41 - 所属文档:Docker 快速入门文档

本教程将通过一个最简单的、使用 JavaScript 开发的待办事项管理 Web 应用程序贯穿始终,下文简称为:`todo-app`。这个应用程序的代码已经写好并提供了源码的下载地址,所以如果你不太熟悉 JavaScript 和 Node.js 也完全没有任何关系,依旧可以很轻松的学习本教程,因为我们的学习重点是 Docker,所以放心的继续往下看吧。 此时,你只是想开发一个最小可行产品(MVP)来证明自己的想法,展示它的工作原理和功能,暂时无需考虑其他复杂因素。 ![Todo List Manager Screenshot](https://bianxuebianzuo.oss-cn-shenzhen.aliyuncs.com/uploads/photos/1/2021/08/07/6HKyC1628305251_Todo_List_Manager_Screenshot1617268644.png) ## 获取 `todo-app` 源码 在运行 `todo-app` 之前,需要将它的源代码下载到自己的计算机上。在实际工作中开发的项目,通常是去公司的代码仓库克隆。但是,针对本教程,我们创建好了一个包含应用程序源码的 ZIP 压缩文件。 1. [点击这里下载](https://default-sz.oss-cn-shenzhen.aliyuncs.com/docker/app.zip) 并解压,解压之后默认文件夹名称是 `app`, 非必要的情况下,不要修改文件夹名称,因为保存名称一致,有利于后续文档的说明。 2. 使用你喜欢的编辑器打开,下图使用的是 [Visual Studio Code](https://code.visualstudio.com/) 编辑器作为演示,你可以使用任何自己喜欢的编辑器打开它,打开之后会看到 `package.json` 文件、 `yarn.lock` 文件和两个子目录 `src` 和 `spec`。 ![Screenshot of Visual Studio Code opened with the app loaded](https://bianxuebianzuo.oss-cn-shenzhen.aliyuncs.com/uploads/photos/1/2021/08/07/HkQ7M1628305251_Screenshot_of_Visual_Studio_Code_opened_with_the_app_loaded1617268644.png) ## 为 `todo-app` 创建镜像 需要一个 `Dockerfile` 文件来为我们的应用程序创建 Docker 容器镜像。`Dockerfile` 文件就是一个文本文件,文本的内容描述着如何一步步构建出我们需要的镜像。 1. 创建一个名为 `Dockerfile` 的文件,与 `package.json` 文件同一层级,内容如下: ``` FROM node:12-alpine WORKDIR /app COPY . . RUN yarn install --production CMD ["node", "src/index.js"] ``` 这个 `Dockerfile` 的每一行都代表着告诉 Docker 镜像构造器每一步该怎么做: - 我们的镜像要基于 `node: 12-alpine` 镜像 - 指定镜像的工作目录是 `/app` - 接着将主机上当前项目目录下的所有内容(即:`app` 目录下的所有内容)复制到镜像中的当前工作目录(即:`/app` 目录下) - 接着执行 `yarn install --production` 命令为 `todo-app` 安装依赖 - 最后一步通过 `CMD` 指定镜像被启动时默认要执行的命令,即通过 node 真正启动我们的 `todo-app` Web 应用程序。 > 备注:确保刚刚创建的 `Dockerfile` 文件没有文件扩展名,有些编辑器可能会自动附加文件扩展名。 2. 打开命令行并进入到 `Dockerfile` 文件所在的 `app` 目录,执行如下命令: ``` docker build -t todo-app . ``` 这条命令就是使用刚刚创建的 `Dockerfile` 文件构建出一个新的容器镜像。从这条命令的输出结果中,你应该已经注意到有很多步骤,对应着 `Dockerfile` 文件的每一行。 `-t` 标志代表为我们的镜像打标签,可以简单地理解成为镜像取一个易于理解的名称。由于我们将镜像命名为 `todo-app` 因此可以在运行容器时引用这个镜像名称。docker build 命令最后的 `.` 代表告诉 Docker 在当前目录下查找 `Dockerfile` 文件。 ## 用刚创建的镜像启动容器 现在已经为我们的 `todo-app` 应用创建了一个名字为 `todo-app` 的 Docker 镜像,看看如何使用它: 1. 使用 `docker run` 命令启动一个新容器,并指定使用我们刚刚创建的镜像: ``` docker run -dp 3000:3000 todo-app ``` 还记得 `-d` 和 `-p` 标记吗? `-d` - 让容器保持在后台运行; `-p 3000:3000` - 将容器中的 3000 端口映射到本机的 3000 端口。 因此,通过这条命令,我们使用自己创建的 `todo-app` 镜像启动了一个新容器。在容器中的 3000 端口上启动着我们自己的 `todo-app` Web 应用程序,并将容器中的 3000 端口映射到本机的 3000 端口。 2. 在本机上访问 [http://localhost:3000](http://localhost:3000/) 就可以看到我们自己的应用了: ![Empty Todo List](https://bianxuebianzuo.oss-cn-shenzhen.aliyuncs.com/uploads/photos/1/2021/08/07/ZC3xz1628305251_Empty_Todo_List1617268645.png) 此时,一个由我们自己亲手创建的 `todo-app` 应用已经运行在 Docker 上了。 ## 回顾 在这一小节中,我们学习了有关构建容器镜像的基础知识,并创建了一个 `Dockerfile` 来完成此操作。构建镜像完成之后,我们使用该镜像启动了一个新容器并看到了正在运行的、我们自己的 `todo-app` 应用。 接下来,将对我们的应用程序进行修改。在此过程中,进一步学习 Docker 的其他知识。 > 原始资料:[Our Application](https://docs.docker.com/get-started/02_our_app/)