“宿主机”(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),当然这个案例中,我没有用这个方式,请继续往下看
安装
前置条件
-
下载 Docker Desktop,官方下载地址: docs.docker.com/desktop/ins… ,查看是否安装成功,WIN+R打开命令窗口输入命令:
docker version验证Docker是否安装成功 -
下载 WSL, 命令是 wsl --install, 然后升级到 wsl 2(查看版本命令 wsl -l -v) 因为wls 1在启动docker desktop会遇到弹窗问题, 提示版本不够, 要使用命令 wsl --update, 这里我们就一步到位先升级
-
开启系统的Hyper-V,操作步骤 1.鼠标放在这个图标上
,右键展开的目录中点击 应用和功能(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, 双击桌面图标,会显示正在加载中,正常没有遇到问题或者解决完问题以后,你会看到这个界面
由于我做这个事情的初衷是,在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 这些值
创建和连接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一窍不通的人,文章只基于我自己实际操作测试的经验,仅代表个人,不代表任何别的人,文章总结的可能不全面,也可能有瑕疵,可以给想要试验的人做个参考,谢谢理解
最后, 参照的文档: