1 创建并运行 redis 容器
- 从 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
- 创建一个名称为 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
- 可以查看正在运行的容器:
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
- 可以查看刚创建的 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
- 可以与 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
}