在继《阿里云部署Docker》之后,我决定系统的出一系列《Docker从入门到精通》的深度记录文章,这源于有一天图灵出版社的一个编辑联系我,问我有没有兴趣写Docker方面的书籍进行出版。
本文的目标是建立一个Docker web app。这样,你就可以直观的感受,docker是如何部署一个web应用。
首先,我们建立一个空目录来存放我们需要的文件。
我们建立的是一个node.js的web服务应用。我们需要在当前目录下建立如下三个文件。
1).gitignore
- node_modules/*
2)package.json
- {
- "name": "docker-centos-hello",
- "private": true,
- "version": "0.0.1",
- "description": "Node.js Hello world app on CentOS using docker",
- "author": "Daniel Gasienica <daniel@gasienica.ch>",
- "dependencies": {
- "express": "3.2.4"
- }
- }
3)server.js
- var express = require('express'),
- app = express(),
- redis = require('redis'),
- RedisStore = require('connect-redis')(express),
- server = require('http').createServer(app);
- app.configure(function() {
- app.use(express.cookieParser('keyboard-cat'));
- app.use(express.session({
- store: new RedisStore({
- host: process.env.REDIS_HOST || 'localhost',
- port: process.env.REDIS_PORT || 6379,
- db: process.env.REDIS_DB || 0
- }),
- cookie: {
- expires: false,
- maxAge: 30 * 24 * 60 * 60 * 1000
- }
- }));
- });
- app.get('/', function(req, res) {
- res.json({
- status: "ok"
- });
- });
- var port = process.env.HTTP_PORT || 3000;
- server.listen(port);
- console.log('Listening on port ' + port);
配置Dockerfile
我们需要通过Dockerfile来配置我们的docker镜像。
- FROM ubuntu:14.04
- MAINTAINER zengjinlong <470910357@qq.com>
- RUN apt-get update
- #Install Redis
- RUN apt-get -y -qq install python redis-server
- RUN apt-get -y -qq install wget
- #Install Node
- RUN cd /opt && \
- wget http://nodejs.org/dist/v0.10.33/node-v0.10.33-linux-x64.tar.gz && \
- tar -xzf node-v0.10.33-linux-x64.tar.gz && \
- mv node-v0.10.33-linux-x64 node && \
- cd /usr/local/bin && \
- ln -s /opt/node/bin/* . && \
- rm -f /opt/node-v0.10.33-linux-x64.tar.gz
- #Set the working directory
- WORKDIR /src
- j
- CMD ["/bin/bash"]
有了Dockerfile之后,就可以通过docker build来建立我们的镜像。
- docker build -t minimicall/node_web:0.1 .
这里需要说明的是,你需要灵活的根据你的ubuntu真实的环境来变化中间的指令。例如,当我们***次执行的时候,告诉我找不到python redis-server,我想应该是我的apt 源太out了,所以,我加了RUN apt-get update.就解决了这个问题。
当我wget的时候,说没有这个指令,那么我就得安装wget.而nodejs的地址,也是我去从nodejs的官网查找的。所以碰到问题,具体问题具体分析。
查看我们建立的镜像。
- micall@micall-ThinkPad:~/docker/nodejs_web_app$ sudo docker images
- REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
- minimicall/node_web 0.1 730770dff17f 6 minutes ago 268.7 MB
- centos centos6 70441cac1ed5 2 weeks ago 215.8 MB
- ubuntu 14.04 5506de2b643b 4 weeks ago 199.3 MB
启动我们的镜像:
- sudo docker run -i -t --rm \
- > -p 3000:3000 \
- > -v `pwd`:/src \
- > minimicall/node_web:0.1
这时候我们已经进入到了这个镜像启动的容器里面了。
- root@d80a2ed6b4c0:/src#
执行下列命令
- root@d80a2ed6b4c0:/src# npm install --quiet > /dev/null
- npm WARN engine formidable@1.0.13: wanted: {"node":"<0.9.0"} (current: {"node":"0.10.33","npm":"1.4.28"})
- root@d80a2ed6b4c0:/src# npm install -g nodemon --quiet > /dev/null
- root@d80a2ed6b4c0:/src# ls
- Dockerfile Dockerfile~ index.js~ package.json server.js src
- Dockerfile.centos index.js node_modules package.json~ server.js~
- root@d80a2ed6b4c0:/src# nodemon server.js
- 22 Nov 14:37:31 - [nodemon] v1.2.1
- 22 Nov 14:37:31 - [nodemon] to restart at any time, enter `rs`
- 22 Nov 14:37:31 - [nodemon] watching: *.*
- 22 Nov 14:37:31 - [nodemon] starting `node server.js`
- Listening on port 3000
这个时候用浏览器打开:http://localhost:3000/,会的到如下结果。
- {
- "status": "ok"
- }
原文出自:http://blog.csdn.net/minimicall/article/details/41391241