我在数字海洋云上部署了一个简单的基于redis的nodejs应用程序。
这是node.js应用程序。
var express = require('express');
var app = express();
app.get('/', function(req, res){
res.send('hello world');
});
app.set('trust proxy', 'loopback')
app.listen(3000);
var redisClient = require('redis').createClient(6379,'localhost');
redisClient.on('connect',function(err){
console.log('connect');
})
为了部署应用程序,我分别使用了一个node.js容器和一个redis容器,并将node.js容器与redis容器链接在一起。
可以通过
获得redis容器docker run -d --name redis -p 6379:6379 dockerfile/redis
并且node.js容器基于google / nodejs,其中Dockerfile就像
一样FROM google/nodejs
WORKDIR /src
EXPOSE 3000
CMD ["/bin/bash"]
我的node.js图像被命名为nodejs并由
构建docker build -t nodejs Dockerfile_path
通过将我的主机应用程序文件复制到容器中的src文件夹并链接现有的redis容器来运行容器
docker run -it --rm -p 8080:3000 --name app -v node_project_path:/src --link redis:redis nodejs
最后我成功进入容器,然后按npm install
安装了npm模块,然后按node app.js
启动应用程序。
但我得到一个错误说:
Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED
当redis容器暴露给6379时,我的nodejs容器正在链接到redis容器。在我的node.js应用程序中,使用端口6379连接到localhost redis服务器应该没问题,为什么它实际上根本不起作用
答案 0 :(得分:2)
将redis容器链接到节点容器时,docker已经为您修改了hosts文件
然后您应该可以通过以下方式连接到redis容器:
var redisClient = require('redis').createClient(6379,'redis'); // 'redis' is alias for the link -> what's in the hosts file.
来自:https://docs.docker.com/userguide/dockerlinks/
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
这将链接新的Web容器与您之前创建的db容器。 --link标志采用以下形式:
--link name:alias
其中name是我们要链接的容器的名称,别名是链接名称的别名。您将很快看到该别名的使用方式。