共计 2214 个字符,预计需要花费 6 分钟才能阅读完成。
Docker 快速部署一个 node App
⭐️ 更多前端技术和知识点,搜索订阅号
JS 菌
订阅
用 Docker 快速部署 node App 需要如下几个步骤:
- 安装 Docker 和 VSCode Docker 插件(方便操作 Docker)
- 创建 node 应用
- 创建 Dockerfile 并将应用打包成 image
- 事例化 image 创建 Container
首先安装 Docker
Docker 的安装看官方文档,文档很详细了 https://docs.docker.com/docker-for-mac/install/
然后安装 Docker 的 VSC 插件,安装这个插件仅仅是为了方便操作 Docker。
安装完毕后打开 Docker 服务执行命令检查是否安装完毕:
$ docker -v | |
Docker version 18.09.2, build 6247962 |
最后使用国内的镜像源:
https://registry.docker-cn.com
创建 node App
我们的目的是要在 nginx 的 Container 中对外暴露一个端口,Container 中是我们打包后的 node App,外部可通过这个端口访问我们的服务。
npm init | |
npm install -S express |
安装完成后创建一个简单的 node App:
// app.js | |
const express = require('express') | |
const url = require('url') | |
const execa = require('execa') | |
const app = express() | |
app.use((req, res, next) => {console.log(url.resolve(req.url)) | |
res.end('hello world') | |
}) | |
app.listen(8888, () => {console.log('listening at port: 8888') | |
}) |
创建 Dockerfile
然后 VSC 调用 >dockerfile
通过 docker 插件创建一个新的 dockerfile,在选项中选择 node
插件自动在当前目录下创建 Dockerfile
, docker-compose.yml
, docker-compose.debug.yml
, .dockerignore
目录结构如下:
. | |
├── Dockerfile | |
├── app.js | |
├── docker-compose.debug.yml | |
├── docker-compose.yml | |
├── node_modules | |
├── package.json | |
└── yarn.lock |
在 Docker image 中我们肯定是只将必要的文件打包进去,像 .dockerignore
.gitignore
这种文件是肯定不能被打包的。
Docker 插件自动创建的 .dockerignore
中自动帮我们写好了配置文件:
node_modules | |
npm-debug.log | |
Dockerfile* | |
docker-compose* | |
.dockerignore | |
.git | |
.gitignore | |
.env | |
*/bin | |
*/obj | |
README.md | |
LICENSE | |
.vscode |
最后我们来编辑一下 Dockerfile
FROM node | |
ENV NODE_ENV production | |
WORKDIR /usr/src/app | |
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"] | |
RUN npm install --production --silent && mv node_modules ../ | |
COPY . . | |
EXPOSE 8888 | |
CMD node app.js |
- FROM 指定基础镜像
- ENV 配置环境变量
- WORKDIR 指定工作目录
- COPY 拷贝 package.json 等配置文件到工作目录
- RUN 执行命令安装依赖
- COPY 拷贝项目文件 app.js 等到指定工作目录
- EXPOSE 对外暴露 8888 端口
- CMD 执行命令启动项目
RUN 和 CMD 的区别见这篇文章 https://stackoverflow.com/questions/37461868/difference-between-run-and-cmd-in-a-docker-file
打包成 image
Dockerfile 和项目文件创建完毕了,紧接着我们就需要通过 Docker 打包项目成 iamge:
>dockerbuild
填入指定的 image 别名即可:
或使用如下 docker build 命令
docker build -t essearch/ess-elasticsearch:1.7.6 --build-arg number_of_shards=5 --build-arg number_of_replicas=2 --no-cache .
最后创建容器
最后创建容器即可通过暴露的端口访问到应用
>dockerrun
或执行 docker run
命令:
$ docker run --rm -d -p 8888:8888/tcp test:latest | |
265575b6dc2866a6fa778ee74ad71d823554e1d96f577b31034ba544177204cb |
使用 curl 验证一下:
$ curl localhost:8888 | |
hello world% |
docker container ls # 获取所有正在运行中的 container | |
docker images # 获取所有 images |
done ????
请关注我的订阅号,不定期推送有关 JS 的技术文章,只谈技术不谈八卦 ????