【CICD】从构建一个镜像开始

在学习如何通过 Docker 发布/部署 应用之前,我们先要学习一下如何创建一个 Docker 镜像。


首先,我们要告知 Docker 我们的应用是如何运作起来的,这一步我们需要创建一个 Dockerfile 文件来描述我们需要做的事情。


因为本课程更多的教大家学习的是通用技术而不是具体某个项目,因此如果大家需要一步步按照教程去走,可以直接使用自己的项目,或者随便找一个现成的初始化项目来学习


不过,在创建之前,我们先要想一下我们的一个应用是如何运作起来的。我们以一个简单的 node 应用为例,运行一个 node 程序我们需要以下几个要素:


  1. 安装了 nodejs 的运行环境
  2. node 程序使用 npm install  等命令安装了依赖
  3. 通过命令调用 node 执行对应的程序,如: node index.js , 或者集合到 npm scripts  中,比如:npm run start


因此,我们将其转换成 shell 命令则为如下所示命令:


npm install
npm start


为了让 Docker 知道如何操作,我们需要转换成 Dockerfile 的语法, 在项目的根目录创建一个 Dockerfile 文件:


# Dockerfile
RUN npm install
CMD npm start


其中 RUN  指令则是执行 shell 命令,而 CMD  表示我们要最后一直执行的命令,这行命令的输出会被不断监听并记录到日志中。 从运行时机的角度来解释,RUN是构建镜像的时候会执行的(编译时),CMD  是运行镜像的时候会执行的(运行时)。 当然,仅仅这些是完全不够的,上一节我们说了,docker 是一个完整的、隔离的容器。因此我们为了让我们的代码能够运行,我们可以直接从别人已经做好的某一个现成的环境开始,比如纯系统的Ubuntu , 再比如说nodejs 官方已经做好的镜像开始。 使用方式也非常简单,只需要在 Dockerfile 的最前面加上一行声明即可,如下:


FROM node:lts


FROM  表示我们的 docker 声明文件从某个镜像开始,如果这个镜像不存在的话再构建镜像时会自动从远程下载该镜像。 其中 node 表示镜像的名字,这里是node官网提供的镜像,lts是镜像的 tag,表示使用的node版本是长期支持的版本(Long Term Support)。在本节我们假设我们的项目是从node环境下开始的,如果需要py/go/rust或者其他的语言环境的话也可以直接从相应的镜像开始即可。 准备好了镜像以后,我们则需要把我们的代码丢到 docker 的镜像中,一个最简单的方式就是把当前所在目录的所有文件都复制到镜像中。


COPY . .


COPY表示复制,前一个.表示当前所在的目录,后一个.表示复制目标路径,即镜像的工作空间。我们也可以自己定义一下工作目录以明确项目的目标目录:


WORKDIR /app


那么经过一些简单的环境初始化的步骤以后,我们的 Dockerfile  文件大概会长成这个样子:


FROM node:lts # 从nodejs官方镜像开始

WORKDIR /app # 设定工作目录为根目录下的app文件夹COPY . . # 将构建时的所有内容都复制到工作目录(app文件夹)下RUN npm install # 安装应用依赖CMD npm start # 启动应用


接下来我们只需要在Dockerfile  所在的目录执行 docker build .  即可编译镜像,其中 . 表示当前目录。docker  会根据 Dockerfile  所描述的步骤一步步去执行镜像的构建操作,当镜像构建完毕后我们会拿到一串唯一的 hash 表示镜像的名称,我们可以直接用或者给他起个名字都行。总之,我们得到了我们的第一个镜像,我们可以通过docker run <image_id>  来运行这个镜像。


总结


在本节我们简单的学习了如何改造现有的项目,将其构建成一个 Docker 镜像,并运行它。下一节我们来学习一下如何发布镜像、拉取/更新镜像,以及将其运行在服务器上。


小思考: 如果把部署东西当成制作食物,那么镜像就是食物的模具,容器就是食物本身。那么类似的,食物的原材料是什么呢?


关于Dockerfile的一些进阶的介绍可以看我们星球另一位大佬的文章:
5 个提升你 Dockerfile 水平的技巧 https://articles.zsxq.com/id_9u1a1gbtim2z.html


0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
Hask
下载 APP