[英]Why can't web app in docker-compose, connect to another container in the same compose?
[英]Can't connect Redis server to nodejs, Docker compose
我正在努力將 redis 部署連接到我的 nodejs 應用程序。 當然在本地不使用 docker,它運行良好,所以我不同意這是否與我的代碼有關,或者我設置 docker 撰寫文件的方式
Dockerfile:
FROM node:8 WORKDIR /app COPY package.json /app COPY. /app RUN npm install CMD ["npm", "start"] EXPOSE 3000
docker-compose.yml
version: "3" services: web: container_name: web-container restart: always depends_on: - redis build: . ports: - "3000:3000" links: - redis redis: container_name: redis-container image: "redis:latest" ports: - "6379:6379" volumes: -./data:/data
Redis 連接文件 (RedisService.js)
const redis = require("redis"); const client = redis.createClient(); const DbUtils = require("../../db_utils"); const {promisify} = require("util"); const getAsync = promisify(client.get).bind(client); const existsAsync = promisify(client.exists).bind(client); class RedisCache { constructor () { var connected; // * Initiliase the connection to redis server client.on("connect", () => {console.log(" Redis cache is ready"); connected = true;}) client.on("error", (e) => {console.log("Redis cache error:\n" + e); connected = false;}); } async setData (id, data) { // * Stringify data if it's an object data = data instanceof Object? JSON.stringify(data): data; client.set(id, data); return true; } async getData (key) { return getAsync(key).then(data => { data = JSON.parse(data) instanceof Object? JSON.parse(data): data; return data; }) } async exists (key) { return existsAsync(key).then(bool => { return bool; }) } // Returns status of redis cache async getStatus () { return this.connected; } } module.exports = new RedisCache();
ERROR錯誤:Redis 連接到 127.0.0.11:6379 失敗 - 連接 ECONNREFUSED 127.0.0.11:6379
當您通過docker-compose
運行容器時,它們都連接到公共網絡。 服務名稱是給定容器的 DNS 名稱,因此要從web
訪問redis
容器,您應該創建如下客戶端:
const client = redis.createClient({
port : 6379,
host : 'redis'
});
您尚未配置主機,因此它使用默認值 - 127.0.0.1
。 但是從您的web
容器的角度來看,redis 沒有在 localhost 上運行。 相反,它運行在它自己的容器中,DNS 名稱為redis
。
本教程的開頭(docker部分)對我有用:https://medium.com/geekculture/using-redis-with-docker-and-nodejs-express-71dccd495fd3
docker run -d --name <CONTAINER_NAME> -p 127.0.0.1:6379:6379 redis
然后在節點服務器中(如官方 redis 網站示例):
const redis = require('redis');
async function start() {
const client = redis.createClient(6379,'127.0.0.1');
await client.connect();
await client.set('mykey', 'Hello from node redis');
const myKeyValue = await client.get('mykey');
console.log(myKeyValue);
}
start();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.