代码旅行

Docker 部署项目笔记(持续更新)

不用过多的介绍 Docker,最简单的理解方式就是单实例运行方案,其官网地址是 http://docker.com

为什么用 Docker 部署项目

用 Node.JS 来解释下,做 Node.JS 项目的会用到很多第三方的包,通常做法是通过执行命令 npm install package_name 直接在服务器上安装,但这样做是有一定的风险,主要是因为第三方包的不可控。Node.JS 就发生过比较著名的 left-pad 事件,所以通过 Docker 这类工具来部署尤其重要。

这是一篇系列的笔记,我会持续更新里面的内容。需要注意的是,我在是 macOS Catalina 上进行的操作,其它系统大同小异。

安装 Docker

Docker 的安装无需说明,官网有相关的文档,请看这里 选择对应的系统版本安装即可,我使用的是 macOS,所以下载对应的客户端即可,我是通过 brew cask install docker 安装的。

安装完成后,运行 docker,可以通过 docker version 查看当前安装的 docker 版本情况。

Node.JS 项目

项目任务

  • 完成 Hello World

    访问 http://localhost:8080 时显示 Hello World

步骤

  • 创建项目并初始化

    mkdir dockerdemo && cd dockerdemo
    npm init
    
  • 先写好项目要求中的代码,并测试通过

    创建文件,并写入代码,完整的代码内容如下

    const Koa = require("koa");
    const port = "3000";
    const app = new Koa();
    app.use(async ctx => {
      ctx.body = 'Hello World';
    });
    app.listen(port);
    

    因为用到了 koa,所以需要先安装,在源码根目录下安装 npm install koa,完成后执行 node app.js,这时候访问 http://localhost:3000,就会出现 Hello World,如下图

    docker01

    至此,项目代码完成,并通过了测试。

  • .dockerignore 文件

    如同 .gitignore 文件一样作用一样,.dockerignore 文件会忽略掉里面的文件,比如 Node.JS 中的 node_module 等,内容如下

    node_modules
    package-lock.json
    
  • Dockerfile 文件

    先看其内容

    FROM node:latest
    RUN mkdir -p /home/hb/dockerplex
    COPY . /home/hb/dockerplex
    WORKDIR /home/hb/dockerplex
    RUN npm install
    EXPOSE 3000
    CMD node app.js
    
    • 第一行:使用 Node.JS 的最新版本(latest),这里的 latest 可以是其他版本,比如 node:12.0,具体根据自己的需求来,版本信息可以看这里

    • 第二行:在容器中创建一个目录,其中 -p 参数是创建多层级文件夹,如果不存在该文件夹的话会自动创建,如果存在也不会报错。

    • 第三行:将当前目录下的内容拷贝到之前在容器创建的目录下

    • 第四行:定位容器的工作目录

    • 第五行:在容器的工作目录下执行后面的命令 npm install,后面也可以加上参数,比如在国内 Node.JS 的官方源慢,就可以使用国内的源,即 RUN npm install --registry http://npmreg.mirrors.ustc.edu.cn

    • 第六行:expose 字面意思就是暴露,即将容器的某一端口暴露出来,允许外部使用,这里暴露的是 3000 端口。

    • 第七行:执行命令,如果有多个命令,之间用 && 来拼接。

  • 创建 image 文件

    执行如下命令

    docker build -t dockernodejsdemo .
    

    -t 参数的作用是指定后面的名字,也可以在名字后面增加 :版本号,如果不增加,则是 latest

    docker02

    命令执行完成后,可以通过 docker images 命令看到已经生成了 image。

    docker03

    这样 image 文件创建完成。

  • 发布 image 文件

    私有的项目是不建议发布到第三方平台,这里只简单介绍下如何上传到 github package 上。

    执行命令

    docker login docker.pkg.github.com --username hzb
    

    这里 hzb 就是 github 上自己账号的用户名,回车后会要求输入密码,输入正确密码后,会显示 Login Succeeded,如果 GitHub 开启了二次认证,去创建一个 Personal Access Token

    给 image 打 tag,执行命令

    docker tag IMAGE_ID docker.pkg.github.com/hzb/dockerdemo/IMAGE_NAME:VERSION
    

    这里 IMAGE_ID 即为需要上传的 image 对应的 IMAGE ID,可以通过 docker image ls 查看。

    后面就是 IMAGE_NAME 和版本。

    发布 image,执行命令

    docker push docker.pkg.github.com/hzb/dockerdemo/IMAGE_NAME:VERSION
    

    docker04

    完成即可。

  • 使用 image

    如果是使用本地的 image,则执行命令

    docker run -d -p 3030:3000 dockernodejsdemo
    

    其中

    • 参数 -p 表示映射的端口,即将容器暴露出来的端口 3000 映射到本机的 3030 端口。参数 -d 表示在后台运行。

    • 最后是 image 的名字。

    如果使用的是刚才上传的 image,则执行命令

    docker pull docker.pkg.github.com/hzb/dockerdemo/dockernodejsdemo:0.0.1
    

    先将 image 拉到本地来,然后再执行上面本地的命令即可。

--- EOF ---

请注意:这里的内容都是原创,你可以免费阅读,但拒绝所有其他任何形式的转载,谢谢配合。如果你发现文章中有错误,请发邮件给我,非常感谢。

The Copyright of all posts & photos posted in tourcoder.com is belong to tourcoder.com. You can read them for free, but you may not reuse anything therein without my permission.

更多内容