内容提要
作者将评论系统容器化,用Docker解决eggjs服务无故关闭问题。在Windows安装Docker需手动装Hyper-V,配置Dockerfile后成功运行,但Hyper-V导致安卓模拟器无法启动,尝试多种关闭方法均失败,最终用Dism++删除Hyper-V相关包才恢复。结论:Windows下Docker与模拟器难以共存,建议改用虚拟机。
延伸解读
Windows 下 Docker 与安卓模拟器的冲突根源
文章指出,在 Windows 上安装 Docker 需要启用 Hyper-V,而 Hyper-V 会占用硬件虚拟化功能,导致依赖 VT 的安卓模拟器无法启动。作者尝试雷电、夜神、蓝叠等模拟器,均出现报错、蓝屏或提示关闭 Hyper-V。这说明冲突并非个别模拟器问题,而是底层虚拟化技术互斥。
常规关闭 Hyper-V 方法为何失效
作者尝试了命令、控制面板、注册表、服务禁用等多种关闭 Hyper-V 的方法,每次重启后均无效,甚至服务被禁用后仍会自动运行。最终通过 Dism++ 删除 Hyper-V 相关包才解决问题。这提示在部分 Windows 版本中,Hyper-V 可能以系统组件形式深度集成,常规开关无法彻底移除。
容器化 eggjs 的实践要点
文章提到 eggjs 服务无故关闭,日志显示收到 SIGTERM,容器化是解决方向。作者编写 Dockerfile 并成功运行,但过程中因混淆 EXPOSE 与端口映射,导致容器无法访问。正确做法是在 docker run 时使用 -p 7001:7001 暴露端口。这提醒初学者注意 Dockerfile 中 EXPOSE 仅声明端口,实际映射需在运行时指定。
给 Windows 用户的替代方案建议
基于此次经历,作者最终删除了 Windows 上的 Docker,并建议在虚拟机中折腾 Docker。对于同时需要安卓模拟器和 Docker 的 Windows 用户,文章暗示两者难以共存,强行安装可能引发模拟器故障甚至系统蓝屏。若必须使用,可考虑将 Docker 运行于 Linux 虚拟机,避免与宿主机的 Hyper-V 冲突。
Q&A
为什么作者要把评论系统 Docker 化?
因为评论系统(使用 eggjs)一直不稳定,服务开启后会无端关闭,导致经常一两天要重启一次,非常影响使用。作者翻看日志发现关键字“receive signal SIGTERM, closing and exit process”,虽然没找到根本原因,但有人提供了容器化的解决方向。
在 Windows 10 上安装 Docker 需要先安装什么?
需要先手动安装 Hyper-V。作者通过一段命令(使用 dism 添加 Hyper-V 相关包并启用 Microsoft-Hyper-V-All 功能)成功安装,然后重启电脑,Docker 就能顺利打开了。
作者为 eggjs 项目编写的 Dockerfile 内容是什么?
Dockerfile 内容如下: FROM node:12.16.2-alpine RUN apk --update add tzdata \ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone \ && apk del tzdata RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY package.json /usr/src/app/package.json RUN npm i --registry=https://registry.npm.taobao.org COPY . /usr/src/app EXPOSE 7001 CMD npm start
运行 Docker 容器时如何正确暴露端口?
在创建容器时使用 docker run -p 7001:7001 来暴露端口。作者曾误将 EXPOSE 写成 EXPOSE 7001:7001,后来才记起 EXPOSE 只需写容器内部端口,映射端口应在 docker run 时指定。
安装 Hyper-V 后对安卓模拟器有什么影响?
安装 Hyper-V 后,安卓模拟器无法正常运行。雷电模拟器提示 VT 未开启或磁盘错误,夜神模拟器直接导致蓝屏重启,蓝叠则提示需要关闭 Hyper-V 才能启动。
如何彻底关闭 Hyper-V 以恢复安卓模拟器?
作者尝试了运行命令、控制面板删除、改注册表、禁用服务等方法均无效。最终使用 Dism++ 工具,在“更新”一栏中找到大量 Hyper-V 相关包并全部删除,重启后模拟器恢复正常。
作者对 Windows 下同时使用 Docker 和安卓模拟器有什么建议?
作者认为 Windows 用户如果想用模拟器玩手游的同时使用 Docker 恐怕没那么简单,建议改用虚拟机来折腾 Docker,因为 Windows 虽然好用,但出起事来比 Linux 麻烦多了。