创建自己的 Docker 镜像
zr - 2024-02-04 22:52:41 - 所属文档:Docker 快速入门文档
本教程将通过一个最简单的、使用 JavaScript 开发的待办事项管理 Web 应用程序贯穿始终,下文简称为:`todo-app`。这个应用程序的代码已经写好并提供了源码的下载地址,所以如果你不太熟悉 JavaScript 和 Node.js 也完全没有任何关系,依旧可以很轻松的学习本教程,因为我们的学习重点是 Docker,所以放心的继续往下看吧。
此时,你只是想开发一个最小可行产品(MVP)来证明自己的想法,展示它的工作原理和功能,暂时无需考虑其他复杂因素。

## 获取 `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`。

## 为 `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/) 就可以看到我们自己的应用了:

此时,一个由我们自己亲手创建的 `todo-app` 应用已经运行在 Docker 上了。
## 回顾
在这一小节中,我们学习了有关构建容器镜像的基础知识,并创建了一个 `Dockerfile` 来完成此操作。构建镜像完成之后,我们使用该镜像启动了一个新容器并看到了正在运行的、我们自己的 `todo-app` 应用。
接下来,将对我们的应用程序进行修改。在此过程中,进一步学习 Docker 的其他知识。
> 原始资料:[Our Application](https://docs.docker.com/get-started/02_our_app/)