Docker + Node.js
最近开始接触容器化技术后,开始觉得这是未来的趋势,于是开始参加与报名了许多课程,而上完课后就是要来实作,所以这边来纪录如何将 Node.js 专案建置成 Docker Image。
Install
这边假设你已经安装并设定好 Docker ,专案我使用 express-generator 来建置 express 做一个简单的範例:
$ yarn global add express-generator$ express --no-view --git express-docker #这里不使用任何 View 模板$ cd express-docker$ yarn #安装 package$ node bin\www #启动专案
接着打开浏览器输入 http://localhost:3000
,就可以 看到我们的专案正常启动了。
建立 DockerFile
测试没问题后,我们就可以了来建立 Dockerfile 了,在专案根目录中新增 Dockerfile
档案并贴上以下内容
# 使用 Node 的版本FROM node:8.9-alpine# Node 环境设定为 productionENV NODE_ENV production# Node 在容器内的位置WORKDIR /usr/src/app# 複製 package 设定COPY ["package.json", "yarn.lock", "./"]# 安装必要的套件并移动到专案的 node_modules 底下RUN yarn --production --silent && mv node_modules ../# 第一个 . 是我们本地位置,第二个是 docker 里面专案的位置,就是将我们专案的程式码全部複製进去COPY . .# 开放对外的 portEXPOSE 3000# 执行专案CMD yarn start
这边使用
node:8.9-alpine
是因为这个版本是官方基于 Alpine Linux 来建置的专案,整个容器大小不会超过 5MB(完整版本大约有 600MB)
建立 image
当我们 Dockerfile 建立好后,就可以来建立 image,开启你的 terminal 并切换到专案的根目录下,然后执行:
$ docker build -t jeremy/express-docker:1.0.0 .Sending build context to Docker daemon 2.121MBStep 1/8 : FROM node:8.9-alpine ---> 406f227b21f5Step 2/8 : ENV NODE_ENV production ---> Using cache ---> a5f4608e1b01Step 3/8 : WORKDIR /usr/src/app ---> Using cache ---> 77f3a6f6ba55Step 4/8 : COPY ["package.json", "yarn.lock", "./"] ---> Using cache ---> e382743b8956Step 5/8 : RUN yarn --production --silent && mv node_modules ../ ---> Using cache ---> 1b8ea95fa231Step 6/8 : COPY . . ---> Using cache ---> 802418a0f972Step 7/8 : EXPOSE 3000 ---> Using cache ---> 6a6649b4f0b8Step 8/8 : CMD yarn start ---> Using cache ---> a9658953386fSuccessfully built a9658953386fSuccessfully tagged jeremy/express-docker:1.0.0
通常在建立是我们会用 -t 这个参数来设定 container 的名称以及标籤来 简单的做辨识,而用法是 [名称]:[标籤]
。
而从上面的输出结果我们可以看到,dockr 在建置的时候会按照 Dockerfile
里面的设定顺序来执行,每一行执行成功才会往下执行,最后结果出现编译成功,再来我们在 terminal 内输入 docker image ls
来查看刚刚建立的 image。
$ docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEjeremy/express-docker 1.0.0 a9658953386f 14 seconds ago 74.2MB
Run
接下来我们要来将刚刚建立好的 image 执行起来, 所以执行一下指令:
$ docker run -d -p 3000:3000 jeremy/express-docker:1.0.07501cc988eaaac5f38cab9c5d5e1a0dd3d1e5292411c370b46185ce4f6de6751
因为正式在操作时可能会遇到不同版本的 image , 所以要指定执行哪一个 tag 比较好
-d 让 container 在背景执行,如果拿掉这个参数就会立即在 terminal 上执行
-p 指定要使用那个 port , 第一个是指定 container 对外的 port,第二个是指定对内要到哪一个 port
其他设定可以使用docker run --help
来查看更多设定
最后,我们打开浏览器, 网址输入 http://localhost:3000
,就可以看到 express 正常执行了!
结语
像这样的作法算是比较简单的方式,不过在设定上可能需要下达许多指令,今天先初步了解 Dockerfile 的功能,之后会再介绍如何使用 docker compose
,来对 container 做更细部的设定,让我们可以针对 port, memory, cpu 等做调整。
同步收录于部落格