【CICD】从构建一个镜像开始
在学习如何通过 Docker 发布/部署 应用之前,我们先要学习一下如何创建一个 Docker 镜像。
首先,我们要告知 Docker 我们的应用是如何运作起来的,这一步我们需要创建一个 Dockerfile 文件来描述我们需要做的事情。
因为本课程更多的教大家学习的是通用技术而不是具体某个项目,因此如果大家需要一步步按照教程去走,可以直接使用自己的项目,或者随便找一个现成的初始化项目来学习
不过,在创建之前,我们先要想一下我们的一个应用是如何运作起来的。我们以一个简单的 node 应用为例,运行一个 node 程序我们需要以下几个要素:
- 安装了 nodejs 的运行环境
- node 程序使用
npm install等命令安装了依赖 - 通过命令调用 node 执行对应的程序,如:
node index.js, 或者集合到npm scripts中,比如:npm run start。
因此,我们将其转换成 shell 命令则为如下所示命令:
为了让 Docker 知道如何操作,我们需要转换成 Dockerfile 的语法, 在项目的根目录创建一个 Dockerfile 文件:
其中 RUN 指令则是执行 shell 命令,而 CMD 表示我们要最后一直执行的命令,这行命令的输出会被不断监听并记录到日志中。 从运行时机的角度来解释,RUN是构建镜像的时候会执行的(编译时),CMD 是运行镜像的时候会执行的(运行时)。 当然,仅仅这些是完全不够的,上一节我们说了,docker 是一个完整的、隔离的容器。因此我们为了让我们的代码能够运行,我们可以直接从别人已经做好的某一个现成的环境开始,比如纯系统的Ubuntu , 再比如说nodejs 官方已经做好的镜像开始。 使用方式也非常简单,只需要在 Dockerfile 的最前面加上一行声明即可,如下:
FROM 表示我们的 docker 声明文件从某个镜像开始,如果这个镜像不存在的话再构建镜像时会自动从远程下载该镜像。 其中 node 表示镜像的名字,这里是node官网提供的镜像,lts是镜像的 tag,表示使用的node版本是长期支持的版本(Long Term Support)。在本节我们假设我们的项目是从node环境下开始的,如果需要py/go/rust或者其他的语言环境的话也可以直接从相应的镜像开始即可。 准备好了镜像以后,我们则需要把我们的代码丢到 docker 的镜像中,一个最简单的方式就是把当前所在目录的所有文件都复制到镜像中。
COPY表示复制,前一个.表示当前所在的目录,后一个.表示复制目标路径,即镜像的工作空间。我们也可以自己定义一下工作目录以明确项目的目标目录:
那么经过一些简单的环境初始化的步骤以后,我们的 Dockerfile 文件大概会长成这个样子:
接下来我们只需要在Dockerfile 所在的目录执行 docker build . 即可编译镜像,其中 . 表示当前目录。docker 会根据 Dockerfile 所描述的步骤一步步去执行镜像的构建操作,当镜像构建完毕后我们会拿到一串唯一的 hash 表示镜像的名称,我们可以直接用或者给他起个名字都行。总之,我们得到了我们的第一个镜像,我们可以通过docker run <image_id> 来运行这个镜像。
总结
在本节我们简单的学习了如何改造现有的项目,将其构建成一个 Docker 镜像,并运行它。下一节我们来学习一下如何发布镜像、拉取/更新镜像,以及将其运行在服务器上。
小思考: 如果把部署东西当成制作食物,那么镜像就是食物的模具,容器就是食物本身。那么类似的,食物的原材料是什么呢?
关于Dockerfile的一些进阶的介绍可以看我们星球另一位大佬的文章:5 个提升你 Dockerfile 水平的技巧 https://articles.zsxq.com/id_9u1a1gbtim2z.html
