Docker起步:应用于简单的Node.js项目


这篇博客是我在简书发表的第一篇博客,没有过多讨论Docker原理性的问题,更偏向于它的简单应用。在之后的学习过程中,也会慢慢更新更多关于它的原理解析的博客。
作为一个前端新人,现在偏向node做中间层,也在学习Docker,希望可以和各位一起探讨一起学习。我有很多问题相信都需要各位老司机指出来,也好驱动我之后的学习。
谢谢各位,那么我们开始吧!

What is Docker Compose?


如果你是数据中心或者云计算IT圈子的人,从2014年至今,应该一直听到普通容器这个词语,尤其是Docker,关于它们的新闻好像就从未间断过。

那么,Docker可以做什么呢?

  • 隔离应用依赖
  • 创建应用镜像并进行复制
  • 创建容易分发的即起即用的应用
  • 允许实例简单而快速地扩展
  • 测试应用并且随后销毁它们

Docker背后的想法就是创建 软件程序可移植的轻量容器,让其可以在任何安装了Docker的机器上运行,而不用关心底层操作系统,就像野心勃勃的造船者们成功创建了集装箱而不需要考虑在哪种船舶上一样。

Why use Docker Compose?


或者说,Docker有什么优势吸引着这么多的开发人员?

  • Build:允许自由组合各种服务来构建我们的应用,避免开发生产之间的环境问题,并且不局限在任何平台和语言
  • Ship:允许自由组合各种服务来构建我们的应用,避免开发和生产之间的环境问题,并且不局限在任何平台和语言
  • Run:可以快捷地在多个平台,发布可扩展、安全、可靠的服务

Use it in a demo!


接下来我们就在一个简单的demo创建中,体会一下Docker吧!

0. Install Docker


注意

  • 如果是 Mac OS X 用户,请先安装 Virtualbox $ brew cask install virtualbox
  • 如果如果不喜欢 Docker CLI 工具,也可以安装 Kitematic,Kitematic 是 Docker 的 GUI 管理工具。

然后安装Docker Tools:

$ brew install docker docker-machine docker-compose
$ docker help
  • Docker - 开源的容器应用引擎

  • Machine - 管理本地、云服务提供商中的 Docker 服务

  • Compose - 定义,组合,运行多个容器应用

1. Create Node.js Project


$ mkdir docker-express-mongoose-redis-demo && npm init
$ npm i express express-session connect-redis ioredis mongoose --save
$ touch server.js 

package.json

{
  "name": "docker-express-mongoose-redis-demo",
  "version": "1.0.0",
  "description": "just for learning it.",
  "main": "index.js",
  "scripts": {
    "start": "node server.js"
  },
  "author": "larry xiao",
  "license": "ISC",
  "dependencies": {
    "connect-redis": "^3.2.0",
    "express": "^4.15.2",
    "express-session": "^1.15.2",
    "ioredis": "^2.5.0",
    "mongoose": "^4.9.4"
  }
}

server.js

// Import modules
const express = require('express')
const session = require('express-session')
const ioredis = require('ioredis')
const RedisStore = require('connect-redis')(session)
const mongoose = require('mongoose')

// Create App
const app = express()

// Redis Client
const client = ioredis.createClient(6379, process.env.REDIS_PORT_6379_TCP_ADDR)

// Compose Schema
const ComposeSchema = new mongoose.Schema({
  name:  String,
  build: String,
  ports: [String]
})

// Compose Model
const Compose = mongoose.model('Compose', ComposeSchema) 

// Create Session
app.use(session({
  store: new RedisStore({ client }),
  secret: 'Dream'
}))

// Routes for redis
app.get('/redis', (req, res) => {
  res.send('Redis is live!')
})
app.get('/redis/set', (req, res) => {
  client.set('key', 'Redis is live!');
  res.send(`It's redis.`)
})
app.get('/redis/get', (req, res) => {
  client.get('key').then(result => {
    res.send(result || 'Nothing!')
  })
})

// Routes for redis
app.get('/mongoose', (req, res) => {
  res.send('Mongoose is live!')
})
app.get('/mongoose/set', (req, res) => {
  var c = new Compose({
    name: 'docker',
    build: '.',
    ports: ['3000:3000']
  })

  c.save().then(() => {
      res.send(`It's mongoose.`);
    })
})
app.get('/mongoose/get', (req, res) => {
  Compose
    .find({ name: 'docker' })
    .then((result) => {
      res.send(result)
    })
})

app.use((req, res) => {
  res.send('Hello Docker, Express, Mongoose, Redis!')
})

mongoose.connect(`mongodb://${process.env.MONGO_PORT_27017_TCP_ADDR}`, (err) => {
  if (err) throw err

  // Start App
  app.listen(process.env.PORT || 3000)
})

2. Machine:在 virtualbox 中创建 Docker Host


$ # 查看命令行帮助
$ docker-machine
$ # 创建 Docker Host
$ docker-machine create -d virtualbox dev
$ # 启动
$ docker-machine start dev
$ # 查看 dev IP
$ docker-machine ip dev
$ # 查看 dev 环境变量
$ docker-machine env dev
$ # 设置环境变量
$ eval "$(docker-machine env dev)"

3. Compose:定义及操作


3.1 为项目创建 Dockerfile

$ cd docker-express-mongoose-redis-example
$ touch Dockerfile

Dockerfile

FROM mhart/alpine-node
# FROM mhart/alpine-node:base
# FROM mhart/alpine-node:base-0.10

WORKDIR /src
ADD . .

# If you have native dependencies, you'll need extra tools
RUN apk add --update make gcc g++ python

# If you need npm, don't use a base tag
RUN npm install

# If you had native dependencies you can now remove build tools
RUN apk del make gcc g++ python && \
  rm -rf /tmp/* /var/cache/apk/* /root/.npm /root/.node-gyp

EXPOSE 3000
CMD ["npm", "start"]
3.2 创建 docker-compose.yml 来组合 Node.js, Redis, Mongodb 服务:

$ cd docker-express-mongoose-redis-example
$ touch docker-compose.yml

Dockerfile

app:
  build: .
  volumes:
    - .:/src
  links:
    - mongo
    - redis
  ports:
    - 3000:3000

redis:
  image: redis

mongo:
  image: mongo
$ # 查看命令行帮助
$ docker-compose
$ # 创建
$ docker-compose build
$ # 启动 app, redis, mongo 等服务,特点是常驻前台
$ docker-compose up
$ # 也可以通过 `start` 启动,特点是常驻在后台
$ docker-compose start
$ # 停止服务
$ docker-compose stop
$ # 输出日志
$ docker-compose logs
3.3 测试、访问我们的服务 :rocket:

$ open "http://$(docker-machine ip dev):3000"
$ open "http://$(docker-machine ip dev):3000/redis"
$ open "http://$(docker-machine ip dev):3000/redis/set"
$ open "http://$(docker-machine ip dev):3000/redis/get"
$ open "http://$(docker-machine ip dev):3000/mongoose"
$ open "http://$(docker-machine ip dev):3000/mongoose/set"
$ open "http://$(docker-machine ip dev):3000/mongoose/get"

4. 关闭服务


$ docker-compose stop
$ docker-machine stop dev

最后


Docker 可玩的不仅仅如此,还可以打包、发布容器应用到线上,构建自己的 Paas服务等。

Docker Compose 也可以有更高级玩法。

加油吧!

觉得写的还过得去的帮忙点一波关注啊,之后还会更新更多比这个质量更好的博客,谢谢各位老铁了!

Relates


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容