我有一个nodejs app我正试图在docker容器中运行。我的应用程序使用mongodb和redis。
我已经拆除了mongo和redis容器并将我的应用程序停靠。
我启动了我的mongo和redis容器,如:
docker run -i -t --name redis -d redis
docker run -i -t --name mongo -d mongo
现在,我将我的nodejs app容器链接到这两个并运行应用程序:
docker run -i -t --name myapp --link mongo:mongo --link redis:redis mseay/myapp node /myapp/server.js
当我运行我的应用时,它失败并显示错误
错误:Redis连接到localhost:6379失败 - 连接ECONNREFUSED
我的应用无法连接到我的redis容器或mongo,即使它们都在运行。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8709c818014a redis:latest "/entrypoint.sh redi 12 minutes ago Up 12 minutes 6379/tcp redis
6d87364ad4c9 mongo:latest "/entrypoint.sh mong 12 minutes ago Up 12 minutes 27017/tcp mongo
有什么想法吗?
答案 0 :(得分:3)
确保您正在连接到mongodb和redis实例:
请注意,我对链接容器的方式进行了一些更改。名称很重要,因为稍后会提到。
docker run -i -t --name myapp --link mongo:MONGODB --link redis:REDIS mseay/myapp node /myapp/server.js
用于连接MongoDB:
IP = process.env.MONGODB_PORT_27017_TCP_ADDR
PORT = process.env.MONGODB_PORT_27017_TCP_PORT
var mongoUrl = 'mongodb://' + IP + ':' + PORT + '/';
或者你可以简单地使用:
var mongoUrl = 'mongodb://' + MONGODB + ':27017/';
同样使用其ip作为REDIS连接到redis数据库。
<强>解释强>
当您创建docker容器并通过--link
参数链接其他docker容器时,docker会修改容器hosts文件,并根据其名称(您选择--link=container_name:NAME_OF_YOUR_CHOICE
插入链接容器的IP )。
因此,如果您在新容器中打开bash并尝试运行
ping MONGODB
ping REDIS
您可以看到两者都可以访问,因此如果您尝试连接它们,它可以正常工作(假设您在新容器中安装了mongodb和redis,并且您的redis和mongodb实例在默认端口上运行)
mongo --host=MONGODB
redis-cli -h REDIS
答案 1 :(得分:0)
如果您使用redis的官方回购
https://registry.hub.docker.com/_/redis/
,运行命令
docker run --name redis -d redis
遗赠
docker run -i -t --name redis -d redis
-i -t
打开一个互动会话
-d
作为守护程序进程打开,因此两者不应一起使用。
链接命令似乎合适。
要检查容器是否与您的应用正确关联,
使用/bin/bash
进入您的应用并使用env
命令。您应该能够看到两个环境变量,说明redis主机和redis端口
这对我有用。如果你这也适合你,请告诉我们。
答案 2 :(得分:0)
您的错误消息显示您正在尝试连接localhost
以获取redis。但是您使用--link redis:redis
启动了容器,因此您应该在主机名redis
上查找Redis。
答案 3 :(得分:0)
&#34;连接拒绝的另一个原因&#34;可以是Redis配置不允许除127.0.0.1以外的任何其他内容。例如,如果您使用apt-get install redis-server
安装了Redis,则这是默认设置。
由于链接到Redis的容器将获得不同的原始ip-adress,因此您将获得&#34;连接被拒绝&#34;在尝试连接时。
一种解决方案是在redis.conf中将行哈希字符放在行bind 127.0.0.1
前面。
但是,这将允许任何主机或容器连接到您的Redis容器,因此仅在您控制主机时才建议这样做,因此您可以在主机上添加防火墙过滤器。此外,请确保您信任在主机上执行的所有其他容器,否则它们将能够连接到您的Redis容器。请注意,Redis在连接时也支持密码,即使您与其他人容器共享主机环境,也会使事情更安全。