学习了一下 Docker 的基本知识,要应用起来,才能把知识变成自己的, 纸上得来总觉浅呀。这里开始记录下实战的内容, 部署 NodeJs 服务。
# 一、构建步骤
# 1. 编写一个简单的 nodejs 静态服务器
// package.json
{
"name": "study_nodejs",
"version": "0.0.1",
"description": "Node.js on Docker",
"author": "zhongxia",
"main": "server.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.13.3"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
// app.js
'use strict'
var express = require('express')
var PORT = 8888
var app = express()
app.get('/', function(req, res) {
res.send('Hello world\n')
})
app.listen(PORT)
console.log('Running on http://localhost:' + PORT)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 2. 选择镜像
刚开始实战,所以就不考虑搞一个最小的 nodejs 环境, 而是直接找一个可以用的 环境即可。
# 查找镜像
docker search nodejs
1
2
2
# 3. 编写 Dockerfile
Dockerfile 是 创建镜像所必须的文件。
# FORM 是构建镜像的基础镜像源,如果本地没有则会 docker pull 下来
# 坑:如果下载不了,就用国内镜像: hub.c.163.com/nce2/nodejs:0.12.2 ,原因你懂的
FROM heroku/nodejs-hello-world
# 创建目录,保存源码
RUN mkdir -p /home/service
# 设置工作目录
WORKDIR /home/service
# 把本机当前目录的所有文件,拷贝到 镜像中的 /home/service 目录下
COPY . /home/service
# 坑: 如果使用 npm,则要设置国内镜像,否则可能下载不下来
RUN npm config set registry https://registry.npm.taobao.org
RUN npm install
# 镜像对外暴露除8888宽口,默认是不对外开放接口的
EXPOSE 8888
# 这里用来启动项目
CMD [ "node", "app.js" ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 4. 构建 docker 镜像
docker build -t study_nodejs .
1
# 5. 运行容器
82e776de5186 是镜像的 IMAGE ID
docker run -d -p 8888:8888 82e776de5186
1
# 6. 测试
curl -i localhost:8888
1
# 7. 额外补充
# 看日志
docker logs CONTAINER_ID
# 进入容器,执行 linux 命令
docker exec -i -t CONTAINER_ID /bin/bash
1
2
3
4
2
3
4
# 二、后续可以优化的问题
- 线上部署,代码可以存放在 git
- 开发环境,代码经常会变,可以把代码放在 volume
- 优化当前基础镜像,使镜像最小化
- 其他还未想到,一步一步来