正在链接 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 还支持连接时使用密码,即使您与其他人的容器共享主机环境,这也会让事情变得更安全。
我有一个 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
.
确保您连接到您的 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 的容器将获得不同的原始 ip 地址,因此您在尝试连接时将获得 "Connection refused"。
一种解决方案是在redis.conf.
中的bind 127.0.0.1
行前面放置一个散列字符
然而,这将允许任何主机或容器连接到您的 Redis 容器,因此仅当您可以控制主机时才建议这样做,因此您可以在主机上使用添加防火墙过滤器。此外,请确保您信任主机上正在执行的所有其他容器,否则它们将能够连接到您的 Redis 容器。请注意,Redis 还支持连接时使用密码,即使您与其他人的容器共享主机环境,这也会让事情变得更安全。