Node + docker redis

该博客介绍了如何在Docker中拉取并运行Redis容器,包括下载镜像、查看本地镜像、创建并启动容器。接着展示了通过Node.js与Redis容器进行交互,使用了redis模块,并通过toplevel await语法。当Redis容器停止时,显示了Node.js客户端尝试连接失败的错误,证明了交互的正确性。
摘要由CSDN通过智能技术生成

1 创建并运行 redis 容器

  1. 从 hub.docker.com 上下载最新的 redis image:
    docker pull redis
C:\Users\yanchun>docker pull redis
Using default tag: latest
latest: Pulling from library/redis
42c077c10790: Pull complete
a300d83d65f9: Pull complete
ebdc3afaab5c: Pull complete
6ce178c713e4: Pull complete
949f9d8f429f: Pull complete
4076be5e5074: Pull complete
Digest: sha256:cfda0458239615720cc16d6edf6bae7905c31265f218d2033c43cdb40cd59792
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

然后可以查看 docker 已经有哪些本地 image:
docker images

C:\Users\yanchun>docker images
REPOSITORY     TAG       IMAGE ID       CREATED       SIZE
redis          latest    604d80444252   4 days ago    117MB
  1. 创建一个名称为 my-redis-container 的 redis 容器
    docker run -d -p 6379:6379 --name my-redis-container redis
C:\Users\yanchun>docker run -d -p 6379:6379 --name my-redis-container redis
79d0efb5a18093527c38ec6a833327a4e14d64a11f1c86c6f92a40f46a012a4d
  1. 可以查看正在运行的容器:
    docker ps
C:\Users\yanchun>docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                    NAMES
79d0efb5a180   redis     "docker-entrypoint.s…"   51 seconds ago   Up 51 seconds   0.0.0.0:6379->6379/tcp   my-redis-container
  1. 可以查看刚创建的 redis 容器的 log:
    docker logs my-redis-container
C:\Users\yanchun>docker logs my-redis-container
1:C 18 Jun 2022 07:07:43.792 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 18 Jun 2022 07:07:43.792 # Redis version=7.0.2, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 18 Jun 2022 07:07:43.792 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 18 Jun 2022 07:07:43.793 * monotonic clock: POSIX clock_gettime
1:M 18 Jun 2022 07:07:43.793 * Running mode=standalone, port=6379.
1:M 18 Jun 2022 07:07:43.793 # Server initialized
1:M 18 Jun 2022 07:07:43.793 * Ready to accept connections
  1. 可以与 redis 容器交互:
    docker exec -it my-redis-container sh

redis 已经在容器中运行:

C:\Users\yanchun>docker exec -it my-redis-container sh
# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name dianel
OK
127.0.0.1:6379> get name
"dianel"
127.0.0.1:6379> incr count
(integer) 1
127.0.0.1:6379> incr count
(integer) 2
127.0.0.1:6379> exit
# exit
C:\Users\yanchun>

2 使用 Nodejs 与 redis 容器交互

node-redis 文档
https://github.com/redis/node-redis中
给出的与 node-redis v4.1.0 对应的 sample code 如下:

import { createClient } from 'redis';

const client = createClient();

client.on('error', (err) => console.log('Redis Client Error', err));

await client.connect();

await client.set('key', 'value');
const value = await client.get('key');

Nodejs 从 v14 开始支持这种 top level await 语法,
现在建一个 Node 工程,新建文件夹 redis-node-docker, 用 vscode 打开此文件夹,在 terminal 运行:
npm init --yes
npm install redis 此命令将安装当前 redis 最新版本 v4.1.0,当前安装的 Nodejs 版本是 v16.14.0,所以可以使用这种语法。

运行命令 npm install nodemon 安装 nodemon,然后在项目文件夹里新建文件 server.mjs,修改package.json,增加一行 "serve": "nodemon server.mjs":

 "scripts": {
    "serve": "nodemon server.mjs",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

server.mjs 扩展名是 .mjs,不是 .js, 因为 top level await 语法只能在 ECMAScript module 中使用。
如果不使用 .mjs 扩展名, 那么就需要在 package.json 中增加一行 "type": "module",如下所示:

{
  "name": "redis_node_docker",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",

同时 "serve": "nodemon server.mjs" 改成 "serve": "nodemon server.js"

以上是设置,server.js 或者 server.mjs 中的代码和上面的sample code几乎完全相同:

import redis from "redis"

const client = redis.createClient()

client.on('error', (err) => console.log('Redis Client Error', err));

await client.connect();

await client.set('key', 'redis');
const value = await client.get('key');
console.log(value)

terminal 运行 npm run serve,输出:

[nodemon] starting `node server.js`
redis

如果停止正在运行的 redis 容器,vs code terminal 将输出如下错误,这证明,本地 node 确实是在与容器中的 redis 通信,与容器交互也可以读取刚才使用 node 设置的key的值。

Redis Client Error Error: connect ECONNREFUSED 127.0.0.1:6379
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1157:16) {
  errno: -4078,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 6379
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值