需求整理

微软在19年的build大会上公开了Visual Studio Online,相当于把Visual Studio Code和我们需要的开发相关文件装进了浏览器,随时访问。不过目前的公共预览版还没有提供在国内的服务器,定价上最基本的配置4核/8GB RAM/64GB HDD每活跃一小时需3.15元人民币,待机一小时0.05元人民币。自建服务器也必须跑在Azure上,也并不算便宜:Visual Studio Online 定价

社区也开发了相同功能的开源软件:code-server。不过如果我们专程为这个需求分配一个开发机,即使是2核/4GB RAM/40GB SSD的基本机型,不打折时包年的费用也接近2000元人民币。所以使用code-server,我们也必然需要实现按需分配。接下来我们就在阿里云上实现这个需求。

code-server用到了service worker,在不通过localhost访问时,必须使用https协议。所以我们为了实现整个需求,必须用到阿里云的如下服务:

  • 一个已经备案的域名,如果用境外服务器的话域名可以不备案
  • 一个弹性公网IP,需要的时候申请下来,将一个二级域名http://code.example.com解析到该IP上
  • 容器镜像服务,方便我们快速地使用打包好的code-server docker镜像
  • 弹性容器实例ECI,这是最为经济的算力资源,2核/4GB RAM每小时0.44元人民币,4核/8GB RAM每小时0.88元人民币,而且计价是精确到秒的。
  • 文件存储服务NAS,我们之后需要将它作为NFS Volume挂载在ECI上,存储开发常用资料。这部分需要长期运行,价格0.30元/GB/月。

实现我们想要的按需分配code-server的“算法”描述起来如下:

  • 准备阶段
  • 准备code-server的镜像上传到阿里云容器镜像仓库,镜像里需要有SSL证书相关服务
  • 申请好NAS实例
  • 需要真正使用时
  • 申请一个弹性公网IP x.x.x.x
  • 更新二级域名http://code.example.com的解析到x.x.x.x
  • 申请弹性容器实例,以准备好的docker image启动,绑定弹性IP x.x.x.x
  • 启动时执行代码,给二级域名http://code.example.com获取SSL证书后,之后便可以启动code-server了
  • 挂载NAS,阿里云这里应该是有些bug,启动时挂载NAS容易使ECI无法正常启动

docker镜像准备

我们首先要准备一个帮助我们处理SSL证书的增强版code-server docker image。

一个思路是,code-server为我们提供了它的Dockerfile,我们可以对这个Dockerfile稍加修改,以满足我们所要的功能。可惜的是,我自己试了多次,即使不更改这个Dockerfile,也无法正确地生成docker image。会遇到这个问题:Failed to build docker image · Issue #1380 · cdr/code-server

于是我转换了另一个解决方案,基于centos镜像,在这个基础上,下载code-server的Binary Release,布置好SSL证书相关软件,这里选择Let's Encrypt的Certbot。

基于此,准备好的Dockerfile如下(注意这个Dockerfile后面有更新):

FROM

更改工作目录到这个文件夹后,制作docker image:

docker image build -t my-code-server:0.1 .

成功之后查看本地images,找到需要的ID

docker images

登录阿里云的容器镜像服务,这里我选择离我最近的成都节点:

sudo docker login --username=mayundaddy registry.cn-chengdu.aliyuncs.com

tag并推送这个容器镜像:

sudo docker tag [imageID] registry.cn-chengdu.aliyuncs.com/mayundaddy/code-server:0.1
sudo docker push registry.cn-chengdu.aliyuncs.com/mayundaddy/code-server:0.1

测试一下,我们手动做好其他部分的工作,启动这个容器的时候,运行以下指令,成功之后就可以在任意设备上访问了:

&& 

不过这个方法相当于是每次启动时都申请了一个新的SSL证书,Let's Encrypt对此是有频率限制的,整个一级域名每周50个。如果启动次数没有那么频繁,这个也能将就用了。我这边后来为了解决这个问题,其实用了一个常在线的服务器不断维系一个通用*.example.com的SSL证书并且在启动时拷贝过来。

由此我更改了Dockerfile如下:

FROM

这个版本的Dockerfile不再需要处理certbot相关的SSL/HTTPS逻辑,构建起来也轻松许多。转而在`run.sh`中处理一些简单逻辑:

#!/bin/bash

阿里云API操作

既然Docker image已经构造好了,那么只需要调用阿里云的API,把其他步骤做好就是。由于我们改进了思路,所以到这一步还需要完成的任务就是:

  • 申请一个弹性公网IP x.x.x.x
  • 更新二级域名http://code.example.com的解析到x.x.x.x
  • 申请弹性容器实例,绑定弹性IP x.x.x.x,以准备好的docker image启动,绑定弹性IP x.x.x.x

可以说比较简单了,node.js实现如下:

const 

执行一下`node this.js`,很快一切都配置好了。不过域名解析还需要至多10分钟生效。这段时间如果急着用,可以通过不安全的方式访问https://IP开始使用。

云盘挂载

这一部分暂时还没来得及测试,等搞定了回来补充

code block怎样导入整个文件夹_按需分配随时可用的在线开发环境:弹性容器+code-server踩坑记...相关推荐

  1. code block怎样导入整个文件夹_一文就能get!带你了解Python模块导入的真相,拿走不谢...

    前两天和大家探讨了Python的模块化编程,相信大家已经对于Python的模块定义啦.模块的加载啦都了如指掌啦,今天呢,咱们就一起来聊聊Python模块导入的本质吧,相信大家看完这次的东东,就真的能够 ...

  2. code block怎样导入整个文件夹_利用ArcGis导入数据之四(dxf——Geomap、CAD、CorelDraw)...

    利用ArcGis导入数据之四(dxf--Geomap.CAD.CorelDraw) 一.应用目标 在油气行业,地质方面Geomap应用相当广泛,建设方面也有CAD,作图方面CorelDraw应用也多, ...

  3. code block怎样导入整个文件夹_手机资讯:【爱思助手6.0】视频导入教程

    如今使用IT数码设备的小伙伴们是越来越多了,那么IT数码设备当中是有很多知识的,这些知识很多小伙伴一般都是不知道的,就好比最近就有很多小伙伴们想要知道[爱思助手]视频导入教程,那么既然现在大家对于[爱 ...

  4. code block怎样导入整个文件夹_怎样制作音乐相册?多种风格的背景音乐任你挑...

    以前的相册,是一张一张静态的相册,而现在的相册,却是可以"动起来"的吧!一想到这种充满黑科技的相册,你是不是觉得就是那些专业人士制作出来的呢?实际上,要制作这样的电子相册还真不需要 ...

  5. code block怎样导入整个文件夹_PR怎样大批量添加字幕? 协同AE。

    有时我们想要批量修改PR中的字幕,PR自带的字幕工具可以做到,但功能有限,有时选择字体时还会出现问题.我们可以用AE制作模板并导入PR,等到要修改时,只需修改AE模板,所有的PR字幕都会同步修改,非常 ...

  6. vue-cli3通过不同命令打包文件到不同文件夹并配置不同请求地址(开发环境、UAT环境、生产环境)

    一.区分不同环境 1.在根目录下新建3个文件(.env.development..env.production..env.uat)文件类型为.txt文件 .env.development VUE_AP ...

  7. 解决python导入当前文件夹下的包时可以运行,但编辑器报错

    比如导入当前文件夹下的config.py文件,使用: form ..config import xxx 其中..表示当前文件夹,在写代码时直接:from config import xx是不会报错的, ...

  8. 如何批量导入不同文件夹中的图片

    在标签设计印刷工作中,批量导入图片已经是非常普遍的功能了.不论图片名称是否有规律或者是否有在数据库中保存,经过一些专业的设置都可以实现批量导入.那么如果是不同文件夹中的图片该如何导入呢? 文件夹中图片 ...

  9. 自动导入指定文件夹内的文献到 Endnote 中

    简介 最近正着手写一篇综述文章,来整体把握下自己研究领域的历史.方法.最新进展与趋势.由于需要对相关文献进行搜集.阅读和分类.庄小编使用 EndNote 来进行管理文献. 在使用较长时间后,整理了几个 ...

最新文章

  1. iOS 图片渲染及优化
  2. 对CAN、USART、SPI、SCI等常见总线的简单介绍
  3. python心得体会200字_50行代码让python自动生成文章
  4. 判断点是否在三角形内
  5. ECMAScript 的部署进度
  6. 独立物理机和虚拟机比较有什么优势?
  7. sql 查询重复行数据
  8. jQuery CSS 添加/删除类名
  9. 歌曲只需要伴奏,怎么消去歌声?
  10. 微信小游戏(字节小游戏、QQ小游戏)如何实现强制更新版本
  11. CTF_ CRYPTO(Cryptography)_密码学/密码编码学
  12. golang 之时间国际化
  13. [转]大连金州不相信眼泪
  14. STL全特化 偏特化 成员特化
  15. fluent二维叶型仿真_CFX案例 | 混合器流场仿真——热和流动
  16. IBMX3650M4服务器重装window系统
  17. 聚类之层次聚类、基于划分的聚类(…
  18. WinCE 系统界面修改偏方 一
  19. oracle p6安装,Primavera P6 Professional 19.12 中文   含详细安装配置教程  修复链接...
  20. 计算机职称评定认可增刊吗,学术期刊增刊对评职称是否有用.pdf

热门文章

  1. 第三次学JAVA再学不好就吃翔(part109)--LineNumberReader类
  2. 机器学习(part2)--线性方程组的列表达
  3. Django(part8)--响应及HttpResponse对象
  4. SAP 电商云 Spartacus 产品明细页面的 OCC API 是如何被触发的
  5. Flex布局里的align-self属性
  6. SAP gateway standard mode和compatible mode的区别
  7. where is language of sap.ui.getCore().getConfiguration set - locale
  8. GM6 PageSet request didn't have target application url
  9. 如何使用sdkmanager命令行接受SDK package的license
  10. d3 line example debug 2015-05-31