【Docker】Docker是如何部署一個web應用的
在繼《阿里云部署Docker》之后,我決定系統(tǒng)的出一系列《Docker從入門到精通》的深度記錄文章,這源于有一天圖靈出版社的一個編輯聯(lián)系我,問我有沒有興趣寫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 .
這里需要說明的是,你需要靈活的根據(jù)你的ubuntu真實的環(huán)境來變化中間的指令。例如,當我們***次執(zhí)行的時候,告訴我找不到python redis-server,我想應該是我的apt 源太out了,所以,我加了RUN apt-get update.就解決了這個問題。
當我wget的時候,說沒有這個指令,那么我就得安裝wget.而nodejs的地址,也是我去從nodejs的官網(wǎng)查找的。所以碰到問題,具體問題具體分析。
查看我們建立的鏡像。
- 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
這時候我們已經(jīng)進入到了這個鏡像啟動的容器里面了。
- root@d80a2ed6b4c0:/src#
執(zhí)行下列命令
- 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