关于此节点应用程序,
该应用程序包含一个package.json、server.js和一个. gitignore文件,这些文件非常简单,非常方便。gitignore
node_modules/*package.json
{ 'name': 'docker-dev ',' version': '0.1.0 ',' description': 'Docker Dev ',' dependencies ' : { ' connect-redis ' : ' ~ 1 . 4 . 5 ',' express': '~3.3.3 ',' hiredis': '~0.1.15 ',' redis': '~0.8.4' }}server.js
var express=require('express '),app=express(),redis=require('redis '),redis store=require(' connect-redis ')(express),server=require('http ')。createServer(应用程序);app . configure(function(){ app . use(express . cookieparser(' keyboard-cat '));app . use(express . session({ store : new redis store({ 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(端口);console.log('监听端口'端口);Server.js将提取所有依赖项并启动一个特定的应用程序。这个特定的应用程序被设置为在Redis中存储会话信息,并公开一个请求端点,该端点将做出响应并返回一个JSON状态消息。这些都是很标准的东西。
需要注意的一点是,——可以用Redis的连接信息的环境变量来重写,这将在以后从开发环境dev迁移到生产环境prod时发挥作用。
Docker文件
为了开发,我们将让Redis和Node在同一个容器中运行。为此,我们将使用Dockerfile来配置这个容器。
文件
FROM docker file/ubuntuMAINTAINER Abhinav Ajgaonkar[email protected]# Install RedisRUN apt-get-y-QQ Install python redis-server # Install NodeRUN CD/opt wget http://nodejs . org/dist/v 0 . 10 . 28/node-v 0 . 10 . 28-Linux-x64 . tar . gz tar-xzf node-v0.10.28-linux-x64.tar.gz Mvnode-v 0 . 10 . 28-Linux-x64 node CD/usr RM-f/opt/node-v 0 . 10 . 28-Linux-x64 . tar . gz #设置工作
FROM dockerfile/ubuntu告诉docker使用Docker Inc .提供的dockerfile/ubuntu镜像作为构建的参考镜像。
run apt-get-y-QQ install python redis-server基准映像根本不包含任何内容,因此我们需要使用apt-get来获取应用程序运行所需的一切。有必要安装python和redis-server。Redis因为我们将会话信息存储在其中,python的必要性在于它可以通过npm构建为Redis节点模块所需的C扩展。
RUN CD/opt wget http://nodejs . org/dist/v 0 . 10 . 28/node-v 0 . 10 . 28-Linux-x64 . tar . gz tar-xzf node-v0.10.28-linux-x64.tar.gz The mvnode-v 0 . 10 . 28-Linux-x64 node CD/usr/local/bin ln-s/opt/node/bin/*。 RM-f/opt/node-v 0 . 10 . 28-Linux-x64 . tar . gz将下载并提取64位
WORKSDIR/src告诉docker在执行cmd属性指定的事情之前,一旦容器启动,就执行cd /src。
CMD ['/bin/bash']作为最后一步,运行/bin/bash。
构建和运行容器
现在docker文件已经写好了,让我们构建一个Docker映像。
Docker Build-t SQLDump/Docker-dev :0.1。一旦构建了映像,我们就可以使用以下语句来运行容器:
Docker run-I-t-RM -p 300033603000 -v ` pwd ` :/src sqldump/docker-dev :0.1我们来看看docker run命令中发生了什么。
-我将在交互模式下启动容器(与分离模式下的-d相比)。这意味着一旦交互会话结束,容器将退出。
-t分配一个伪tty。
- rm在退出时删除容器及其文件系统。
-p 3000:3000将主机上的端口3000转发到容器上的端口3000。
-v `pwd`:/src将在/src中将当前工作目录挂载到主机的容器中(例如,我们的项目文件)。我们将当前目录作为卷挂起,而不是在Dockerfile中使用ADD命令,这样我们在文本编辑器中所做的任何更改都可以在容器中立即看到。
Sqldump/docker-dev:0.1是要运行的docker映像的名称和版本这与我们用来构建docker映像的名称和版本相同。
由于dockerfile指定了CMD ['/bin/bash'],一旦容器启动,我们将登录到一个bash shell环境。如果Docker成功运行该命令,它将类似于下面的:
开始开发
现在容器正在运行,在我们开始编写代码之前,我们需要整理一些标准的、与docker无关的东西。首先,使用以下语句启动容器中的redis服务器:
然后启动Service redis-server,安装项目依赖项和nodemon。Nodemon将观察项目文件中的变化,并在适当的时候重新启动服务器。
Npm installnpm install -g nodemon最后,使用以下命令启动服务器:
现在,如果您在浏览器中导航到http://localhost:3000,您应该会看到类似下面的:
让我们向Server.js添加另一个端点来模拟开发过程:
app.get('/hello/:name ',function(req,RES){ RES . JSON({ hello : req . params . name });});您将看到nodemon已经检测到您的更改并重新启动了服务器:
现在,如果您将浏览器导航到http://localhost :3000/hello/world,您将看到以下响应:
生产环境
当前状态的容器远未作为产品发布。redis中的数据在跨容器重新启动时不会保持持久。例如,如果重新启动容器,所有会话数据都将消失。当你销毁容器并打开一个新的容器时,同样的事情也会发生,这显然不是你想要的。这个问题我会在产品化的第二部分讲。