这篇博客是我在简书发表的第一篇博客,没有过多讨论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
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 也可以有更高级玩法。
加油吧!
觉得写的还过得去的帮忙点一波关注啊,之后还会更新更多比这个质量更好的博客,谢谢各位老铁了!
网友评论