by:沐沐
前言
事情起因是多种的
- 有越来越多的APP启动,如果有时候不一定哪一个会被找到解决一些问题,那么就需要不断切换开发仓库
- 如果想要去翻翻其他APP的代码,想运行了解一下,就要容忍一段
npm install
时间 - 虽然不断迭代更新,但是还是会有些老项目可能会依赖一些其他版本node,nvm来回切换
- 部分老应用,新人想维护搭建环境都比较费力
- 最重要的原因吧,其实就是觉得好玩 ......
就一直想这怎么可以远程快速启动一个开发环境,本地只需要连接上就可以,这次终于下定决心进行尝试了。
玩起来
整体思路其实也挺简单,就是打一个已经搭建好的 Docker 镜像,谁想跑了就可以重新拉起一个 container 就可以了,然后应用 vscode 的插件来进入容器开发环境进行开发或尝试。
vscode一些好用插件:
- Remote - SSH:连接远程服务器
- Remote - Containers:连接本地 container
- Remote - WSL:这个就是针对 windows 系统了,连接 wsl
环境
- 服务器:≥ CentOs7.x,方便运行 Docker 的服务器环境都可以,要是有私有的 docker registry 更好(本人尝试过程中,使用 CentOs7.4,有私有 docker registry 环境)
- vscode:一些插件很好用,开发也还是很方便的(尝试过程实际上就是依赖了 vscode 的能力)
- 本机:可以安装 Docker,选择去服务器上打镜像也可以;还可以使用 wsl2,windows 运行 Ubuntu 来跑起来也挺有趣的(本人win10主机)
基础镜像搭建
为什么需要基础镜像?理论上前端大部分项目,除了对应的 git 仓库不同,其他的 node、git、ssh 等环境都是相同的,这里就是搭建一个可以运行前端开发的基础环境镜像,方便后续每个 app 都可以基于该镜像二次搭建。
本人尝试过程中,主要搭建了两种基础镜像:
- git+node:这个主要考虑本地 docker 运行,这里就可以直接 vscode “Remote - Containers”插件进container,进行开发操作,这个也可以被下一种兼容
- git+ssh+node:这个用于远程服务器的 docker 镜像的运行,这里可以通过 vscode “Remote - SSH”插件连接远程 container,进行开发操作
git-node:12.13.1-slim
拉取镜像
通过命令行,拉取镜像:docker pull node:12.13.0-slim
(也可以选择其他自己想要的镜像)
安装git
- 命令行设置代理:
export http_proxy="<IP>:<Port>"
(可以参考下方:node-slim 报错了) - 运行:apt-get update
- 运行:apt-get install git -y
git-ssh-node:12.13.1-slim
基于上面镜像,安装ssh
即可。
想要ssh
自启动,需要通过Dockerfile
CMD
命令里添加对应脚本,同事还有bash
和node
也要添加到CMD
里,不然构建的镜像启动不起来(怀疑:docker启动后需要有进程一直启动,通过添加命令达到进程跟着容器启动目的)
APP 镜像搭建
到了这一步,就和我们搭建好了环境,只需要正常开发一样了。
- 启动容器(这个需要根据你启动容器的主机环境决定怎么启动,windows 可能就是点击就启动了,linux 需要
docker run
命令) - 进入容器
git clone
代码到容器内部
需要学习一些必要docker操作,对于win10操作系统:
- 会发现GUI操作不能拉取镜像,我也没发现,反正整体就是界面操作不了就用cmd命令行操作即可,当然通过Ubuntu命令行来操作也一样的
- 启动镜像、进入镜像之类的,倒是不需要命令行了,感觉还是很舒服的
用起来
多种使用方式:
- 本机运行,可以通过vscode
Remote - Containers
打开本机容器进行尝试 - 远程运行,可以通过vscode
Remote - SSH
插件连接远程服务器容器尝试
这里仅介绍远程服务器容器连接开发尝试步骤。
- vscode安装
Remote - SSH
插件 - 添加配置
Host <name> HostName <host address> User <host username> Port <host ssh port> ForwardAgent yes
- 连接,需要输入 docker ssh 密码
- 打开项目:每次遇到输入密码,输入回车即可,项目地址:APP搭建过程中,git clone 代码地址
- 尝试启动项目:这里就是代码正常开发启动命令,比如我这里项目是通过webpack,运行
npm run dev
启动,就在vscode终端对应文件夹输入命令启动即可。
技术点合集
为什么使用node:12.13.1-slim
?
node镜像根据tag其实分为三种类型:
node:<version>
: 我们直接用的node:12.13.1
这种,就是稳定版,内部除了nodejs,还会有一起相关的基础设施,一般用都不会出现问题,但是镜像会大一些node:<version>-alpine
: 这个是最简版,基本是nodejs运行的基础外没有其他,镜像体积也是最小的node:<version>-slim
: 这里就是选择的版本,在上边两者之间,但是体积还是远小于稳定版。选择这个主要是构建难度和构建体积间的一个平衡吧,我本来也不是特别精通镜像与linux
然后就是版本问题,这里其实是随意选择了一个代码支持的最小稳定版而已,大家可以随意选择自己项目合适的版本。
以上都是个人理解,具体还是参考dockerhub-node上的Image Variants部分吧。
代理是 socket5 咋办?
下载 privoxy windows版本,privoxy_3.0.32.zip,下载压缩包版本就是避免安装。
- 解压到自己想要安装的目录里
- 编辑 config.txt文件
- 修改
listen-address
配置,例如改为:listen-address 0.0.0.0:1080
- 修改
forward-socks5
配置,例如修改为:forward-socks5 / <socket5 address>:<socket5 port> .
(注意最后的那个点,不要丢了)
node-slim 报错了
Could not connect to deb.debian.org:80 (151.101.110.132)...
这个报错是安装git过程中报错,解决方案:
- socket5转http协议,转换socket5代理为http代理
docker exec -it <container> bash
进容器(可视化界面点击可以直接进命令行)- 运行:
export http_proxy="<IP>:<Port>"
- 运行:
apt-get update
怎么上装 docker?
linux安装官方教程安装即可,已经安装过多次,都没有出问题。
windows 官网下载安装包,按步骤安装即可。但是中间会遇到一些错误,可以通过以下解决。
windows wsl2 报错了
没有启动wsl2
有一些wsl2的报错,可以通过先启动 windows Ubuntu 即可避免错误。
wsl2版本问题
安装docker会遇到wsl2报错问题:
- 查看wsl2信息:
wsl -l -v
,可能查询不到,是正常现象 - 关联docker:
wsl --import docker-desktop C:\Users\<user>\AppData\Local\Docker\wsl\distro 'C:\Program Files\Docker\Docker\resources\wsl\wsl-bootstrap.tar' --version=2
- 这里会报错,报错后给了一个地址:docs.microsoft.com/zh-cn/windo…,执行步骤4、5两步
- 下载应用后执行,更新wsl内核版本
- 重新运行,关联docker
- 重启docker即可,可以查看wsl里存在了docker信息:
docker-desktop-data Running 2
docker-desktop Running 2
虚拟机与docker
如果原来有VMware(VBox未确定),那么会和docker存在冲突,不能同时运行,需要关闭虚拟技术(windows功能里,取消Hyper-V,然后重启电脑,以后不要想运行VMware了)
再多聊会
其实写到这里,也仅仅是做了一次尝试,仅是一个开端,还是有不少问题:
- 多人开发,怎么快速给一个人启动一个容器。每次登录服务器去手动启动,还是每个人必须安装 docker 环境从远程拉去镜像启动。
- 如果启动了,ssh-key 还需要每个容器生成一次,每次生成后还需要绑定到个人的 git 仓库。如果共用 ssh-key 倒是可以减少绑定,但是操作代码会发现都是同一个账号,没法区别账号。
- 怎么提高性能。如果远程服务器的话,对于多人的话,远程服务器性能要求高,如果本地运行的话,我在 windows 测试出来,docker 启动会比较慢,好在启动好后性能与直接本地跑前端开发环境性能差别不太大。
- ......
这些都是实际要正式使用会遇到的一些问题,也都需要慢慢解决,当前的一个想法是:构建一个项目,通过可视化界面来填写配置、下发快速启动命令,服务端 nodejs 就可以把上面各种问题通过代码解决了,仔细思考发现,理论上都是可行的。
前端岗位不断招聘中,一起来做更好的用户体验,欢迎来撩:yan.zheng@qingteng.cn