链接Docker容器

我有一个nodejs应用程序,我试图在docker集装箱运行。 我的应用程序使用mongodb和redis。

我已经拉下了mongo和redis容器,并将我的应用程序docker化。

我启动了我的mongo和redis容器,如:

docker run -i -t --name redis -d redis docker run -i -t --name mongo -d mongo 

现在,我将我的nodejs应用程序容器链接到这两个并运行应用程序:

 docker run -i -t --name myapp --link mongo:mongo --link redis:redis mseay/myapp node /myapp/server.js 

当我运行我的应用程序,它失败,错误

错误:Redis连接到本地主机: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 

有任何想法吗?

确保你连接到你的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数据库。

说明:

当您通过--link参数创builddocker容器并链接其他docker容器时,docker--link修改您的容器主机文件,并将链接容器的IP与其名称(您select为--link=container_name:NAME_OF_YOUR_CHOICE )相插入。

因此,如果你在你的新容器中打开一个bash并尝试运行

 ping MONGODB ping REDIS 

你可以看到两者都是可访问的,因此如果你尝试连接它们,它就会工作( 假设你的mongodb和redis被安装在新容器中,并且你的redis和mongodb实例在默认端口上运行

 mongo --host=MONGODB redis-cli -h REDIS 

如果你正在使用redis的官方仓库https://registry.hub.docker.com/_/redis/ ,运行命令docker run --name redis -d redis insted

 docker run -i -t --name redis -d redis 

-i -t打开一个交互式会话-d作为守护进程打开,所以两者不应该一起使用。

链接命令似乎是适当的。

要检查容器是否与您的应用程序正确链接,请使用/bin/bash进入您的应用程序并使用env命令。您应该能够看到两个环境variables,分别表示redis主机和redis端口

这工作对我来说。请让我们知道,如果你也为你工作。

你的错误信息表明你正在尝试连接到localhost以获得redis。 但是你用--link redis:redis启动你的容器,所以你应该在hostname redis寻找Redis。

“拒绝连接”的另一个原因可能是Redisconfiguration不允许127.0.0.1连接任何其他设备。 例如,如果使用apt-get install redis-server安装Redis,则这是默认设置。

由于连接到Redis的容器将获得不同的始发IP地址,因此尝试连接时将会看到“连接被拒绝”。

一种解决方法是在redis.conf中的bind 127.0.0.1行之前放置一个哈希字符。

但是,这将允许任何主机或容器连接到您的Redis容器,因此只有在您控制了主机的情况下,才build议您这样做,以便您可以在主机上添加防火墙filter。 此外,请确保您信任在主机上执行的所有其他容器,否则它们将能够连接到您的Redis容器。 请注意,Redis在连接时也支持密码,即使您将主机环境与其他人的容器共享,也会使安全性更高。