正在链接 Docker 个容器

Linking Docker Containers

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

现在,我 link 我的 nodejs 应用程序容器到这两个和 运行 应用程序:

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

当我 运行 我的应用程序失败并出现错误

Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED

我的应用程序无法连接到我的 redis 容器或 mongo,即使它们都是 运行ning。

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

有什么想法吗?

如果你使用的是redis的官方repo 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 command.You 应该能够看到两个环境变量说明 redis 主机和 redis 端口

这适用于 me.Please 让我们知道您是否也适用。

您的错误消息表明您正在尝试连接到 localhost 以访问 Redis。但是你用 --link redis:redis 启动了你的容器,所以你应该在主机名 redis.

寻找 Redis

确保您连接到您的 mongodb 和 redis 实例:

请注意,我对您 link 容器的方式进行了一些更改。这些名称很重要,因为它们稍后会被引用。

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 参数创建一个 docker 容器和 link 其他 docker 容器时,docker 会修改您的容器主机文件并插入linked 容器的 IP 与其名称(您选择的名称 --link=container_name:NAME_OF_YOUR_CHOICE)。

因此,如果您在新容器中打开 bash 并尝试 运行

ping MONGODB
ping REDIS

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

mongo --host=MONGODB

redis-cli -h REDIS

"connection refused" 的另一个原因可能是 Redis 配置不允许除 127.0.0.1 之外的任何其他连接。例如,如果您使用 apt-get install redis-server.

安装 Redis,则这是默认设置

由于链接到 Redis 的容器将获得不同的原始 ip 地址,因此您在尝试连接时将获得 "Connection refused"。

一种解决方案是在redis.conf.

中的bind 127.0.0.1行前面放置一个散列字符

然而,这将允许任何主机或容器连接到您的 Redis 容器,因此仅当您可以控制主机时才建议这样做,因此您可以在主机上使用添加防火墙过滤器。此外,请确保您信任主机上正在执行的所有其他容器,否则它们将能够连接到您的 Redis 容器。请注意,Redis 还支持连接时使用密码,即使您与其他人的容器共享主机环境,这也会让事情变得更安全。