在Node.js Docker镜像上运行Redis

11

我有一个Docker镜像,里面包含了一个node.js应用程序。该应用程序会从运行在本地的Redis中检索一些配置值,因此我正在尝试在同一个容器中安装和运行Redis。

我该如何扩展Docker文件并在其中配置Redis?

目前为止,Dockerfile如下:

 

FROM node:carbon

   

WORKDIR /app

   

COPY package.json /app

   

RUN npm install

   

COPY . /app

   

EXPOSE 3011

   

CMD node /app/src/server.js


1
重做什么?不清楚你在问什么。 - Dave Newton
1
我正在尝试在运行我的Node.js应用程序的容器上安装Redis。 - Benjamin
3个回答

17

最好的解决方案是使用Docker Compose。通过这个,你可以创建一个Redis容器,并链接它然后启动你的Node.js应用程序。第一件事情是安装Docker Compose,详见此处 - (https://docs.docker.com/compose/install/)。

一旦你安装并运行了它,你应该在与你的应用程序的dockerfile相同的文件夹中创建一个docker-compose.yml文件。它应该包含以下内容:

version: '3'
services:
  myapp:
    build: .  
    ports:
     - "3011:3011"
    links:
     - redis:redis
  redis:
    image: "redis:alpine"

然后,Redis 将可以从您的 Node.js 应用程序中访问,但是您需要使用 redis:6379 而不是 localhost:6379 来访问 Redis 实例。

要启动您的应用程序,请在终端中运行 docker-compose up。最佳实践是使用 network 而不是 links,但这只是为简单起见而做出的。

如果需要,也可以将 Redis 和 Node.js 放在同一映像中完成。下面的 Dockerfile 应该可以工作,它基于问题中的内容:

FROM node:carbon

RUN wget http://download.redis.io/redis-stable.tar.gz && \
    tar xvzf redis-stable.tar.gz && \
    cd redis-stable && \
    make && \
    mv src/redis-server /usr/bin/ && \
    cd .. && \
    rm -r redis-stable && \
    npm install -g concurrently   

EXPOSE 6379

WORKDIR /app

COPY package.json /app

RUN npm install

COPY . /app

EXPOSE 3011

EXPOSE 6379

CMD concurrently "/usr/bin/redis-server --bind '0.0.0.0'" "sleep 5s; node /app/src/server.js" 

这种第二种方法是非常糟糕的实践方法,我使用并发而不是监管者或类似工具来简化。CMD中的睡眠是为了让redis在应用程序实际启动之前启动,您应该根据自己的需要进行调整。希望这可以帮助您,并且您使用第一种方法,因为它是更好的实践方法。


是的,但这样做以后会遇到问题,让我编辑我的回答为您提供另一种选择。 - Clive Makamara
1
已更新答案,请查看,希望您确实使用第一个解决方案,因为在进入生产环境时,redis连接字符串不应该首先硬编码为localhost,因为这似乎是已经完成的操作 - 只是猜测。 - Clive Makamara
1
也许在redis-server命令中添加选项--bind "0.0.0.0",我会更新答案,这应该允许您在一切正常的情况下公开服务器。 - Clive Makamara
1
请使用以下命令运行testapp:docker run -d -p 3001:3001 -p 6379:6379 testapp - Clive Makamara
1
容器链接是Docker的过时遗留功能。您能否更新此答案以使用桥接或覆盖网络? - John
显示剩余2条评论

2

如果您正在寻找一个最基本的包含nodejs和redis-server的docker,那么这个可以使用:

FROM nikolaik/python-nodejs:python3.5-nodejs8

RUN apt-get update
apt-get -y install redis-server

COPY . /app
WORKDIR /app
nohup redis-server &> redis.log &

然后您可以为您的节点应用程序进行进一步的步骤。


2

我的使用场景是在alpine tomcat版本中添加redis服务器:

所以这个方法可行:

最初的回答:

FROM tomcat:8.5.40-alpine


RUN apk add --no-cache redis  
RUN apk add --no-cache screen 

EXPOSE 6379

EXPOSE 3011


## Run Tomcat
CMD screen -d -m -S Redis /usr/bin/redis-server --bind '0.0.0.0' && \
${CATALINA_HOME}/bin/catalina.sh run
EXPOSE 8080

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接