关于我在Windows 上跑Docker连Redis Client的经历

338 阅读4分钟

“宿主机”(Host) 的操作系统与配置

  • Windows 10 Pro
  • 64-bit operating system, x64-based processor;
  • RAM 32.0 GB

Docker 简介

镜像Image与容器Container

首先是容器(container):容器特别像一个虚拟机,容器中运行着一个完整的操作系统。可以在容器中装 Nodejs,可以执行npm install,可以做一切你当前操作系统能做的事情。要执行的命令一般写在项目根目录下的Dockerfile里面;

然后是镜像(Image):镜像是一个文件,它是用来创建容器的。生成方式其一,可以用项目根目录的Dockerfile这个文件右键Build Image(我用的VSCode编辑器,在编辑器内打开项目找到这个文件,就可以右键菜单里面选择倒数第二个Build Image,完成以后会在Docker Desktop 出现这个Image),当然这个案例中,我没有用这个方式,请继续往下看

安装

前置条件
  1. 下载 Docker Desktop,官方下载地址: docs.docker.com/desktop/ins… ,查看是否安装成功,WIN+R打开命令窗口输入命令:docker version 验证Docker是否安装成功

  2. 下载 WSL, 命令是 wsl --install, 然后升级到 wsl 2(查看版本命令 wsl -l -v) 因为wls 1在启动docker desktop会遇到弹窗问题, 提示版本不够, 要使用命令 wsl --update, 这里我们就一步到位先升级

  3. 开启系统的Hyper-V,操作步骤 1.鼠标放在这个图标上image.png,右键展开的目录中点击 应用和功能(Apps & features), 2.在打开的窗口点击右上角 相关设置(Related settings)下面的 程序和功能(Programs and Features), 3.在打开的窗口左边菜单点击 启用或关闭Windows功能(Turn Windows features on or off), 里面就有这个 Hyper-v , 这个时候你可能发现全部都是选中的,(顺便说一句,公司电脑是英文,所以有备注,菜鸡的我当时当时没找到) 4.预防针来了!!虽然这里一切看似正常,但是后面你会发现这货居然会导致这个报错("Hardware assisted virtualization and data execution protection must be enabled in the BIOS"),我当时头都打了,在网上了一圈,最后参照下面第二个地址的文章解决了问题,整体步骤如下,这个步骤看似 有点奇怪,但是真的有用,说的是因为 Hyper-V on your system is corrupted, 所以要做下面两步骤:

    a. 首先把上面的 completely uncheck all Hyper-V. 重启.

    b. 然后再Enable Hyper-V again. 重启.

启动

启动Docker Desktop, 双击桌面图标,会显示正在加载中,正常没有遇到问题或者解决完问题以后,你会看到这个界面

image.png

由于我做这个事情的初衷是,在docker上测试我的项目testapp能不能通过读取配置环境变量去连环境变量指向redis地址服务器,所以,我没有用到上述的Dockerfile去build image,而是选择了另外的方式,即在项目根目录创建 docker-compose.yml或者docker-compose.yaml,在里面写上

version: '3.8'
services:
  redis:
    image: 'redis:alpine'
    hostname: redis
    ports:
      - '6379:6379'
  testapp:
    build:
      context: .
      dockerfile: Dockerfile (默认,你也可以新建)
    depends_on:
      - redis
    environment:
      - REDIS_URL=redis
      - REDIS_PORT=6379
    ports:
      - "3888:3888"

Dockerfile 我也给个例子吧

FROM node:版本(如18.9.0)-alpine版本(如3.16)
ENV CLASSPATH /opt/
EXPOSE 3888
COPY . /opt/
WORKDIR /opt
RUN yarn infos \
    && yarn install
CMD ["yarn", "testapp", "build-dev"]   testapp是你在package写workspace的名字 build-dev是你想要执行的命令

保存好以后,在项目文件根目录 管理员身份运行Windows Powershell,然后使用命令行 docker-compose up 就可以等待 docker image生成和container同时启动项目了,为啥要这样呢,因为有个哥们告诉我,只有这样,这俩才是关联起来的,你在代码写的访问redis client的代码就会使用到环境变量(environment)比如 REDIS_URL 这些值

image.png

创建和连接Redis的代码

import Redis from 'ioredis'
const client = new Redis({
  host: process.env.REDIS_URL,
  port: Number(process.env.REDIS_PORT) || 6379,
  maxRetriesPerRequest: 3,
  retryStrategy: times => {
    console.warn(`Retrying redis connection: attempt ${times}`)
    if (times > 3) return null
    return Math.min(times * 500, 2000)
  }
})
client.on('connecting', () => {
  console.log('Redis connecting host is: ', process.env.REDIS_URL)
})

client.on('connect', () => {
  console.log('Redis connect success')
})

client.on('error', err => {
  console.error('Redis error:', err)
})
// 还有两个方法就不贴了,就是设置和取值的

首先,说明一下,俺是个对docker一窍不通的人,文章只基于我自己实际操作测试的经验,仅代表个人,不代表任何别的人,文章总结的可能不全面,也可能有瑕疵,可以给想要试验的人做个参考,谢谢理解

最后, 参照的文档:

www.runoob.com/docker/wind…

stackoverflow.com/questions/3…