链接Docker容器

时间:2015-03-06 03:11:47

标签: docker boot2docker

我有一个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

有什么想法吗?

4 个答案:

答案 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在连接时也支持密码,即使您与其他人容器共享主机环境,也会使事情更安全。