专栏首页Small Code使用 VSCODE 连接远程服务器上的容器

使用 VSCODE 连接远程服务器上的容器

自从 VSCODE 出现以来,我就立马从 pycharm 转入了。厌倦了 pycharm 的笨重,用了 vscode 之后只能说是真香,编辑器界的 flask。但是和 flask 一样,虽然轻便,但是自然基本上一切都需要你自己去配置,各种插件和扩展。有些功能 pycharm 可能自带,但是 VSCODE 就需要自己各种折腾,比如说本文的主题:本地连接远程服务器上的容器

先说需求:使用 VSCODE 在本地(如 Windows)连接远程服务器(如 Linux)上的容器,可以在编辑器内进行代码修改等操作。

pycharm 学习来的偏方

经过与同事交流,发现 pycharm 实现这个需求的方法无非就是把容器的 22 端口映射出来然后使用 ssh 登陆,相当于把容器也当成一个虚拟化的远程服务器。得益于 Remote - SSH,这在 VSCODE 中很好实现:

  1. 【远程服务器】启动容器,注意需要把容器的 22 端口映射出来,例如映射到 host 的 5222 端口:-p 5222:22
  2. 【远程服务器容器】设置 root 账户密码: passwd root 根据提示设置密码即可。如果你启动容器的时候使用 -u 参数指定了一个非 root 用户,那么相应的要设置该账户的密码。
  3. 【远程服务器容器】很多镜像都不会默认安装 ssh,所以需要在容器内安装 ssh 服务: apt update && apt install -y --no-install-recommends openssh-server
  4. 【远程服务器容器】一般进入容器时使用的都是 root 账号,但是 ssh 默认是禁止 root 账号使用密码远程登录的,所以需要修改 ssh 配置文件使其允许: sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config 但是如果你启动容器的时候使用 -u 参数指定了一个非 root 用户,那么这步可以跳过。
  5. 【远程服务器容器】启动 ssh 服务: service ssh start
  6. 【本地】使用 VSCODE 连接,添加新的 ssh host 的时候地址这么写: ssh root@your-server-ip -A -p 5222 这个 5222 就是第 1 步启动容器的时候设置的映射端口。之后输入密码即可,和正常的连接远程服务器一样。

完成!

另外,执行第 5 步之前,可以现在自己本地终端用 ssh 验证一下是否能连接上,如果出现如下的 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 错误:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
39:e5:ef:60:f1:ae:08:b9:46:36:7c:7d:61:e8:c9:41.
Please contact your system administrator.
Add correct host key in /home/ataliba/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/ataliba/.ssh/known_hosts:17
RSA host key for host.host.com.br has changed and you have requested strict checking.
Host key verification failed.

则可以在本地执行以下命令重新生成 key 解决:

ssh-keygen -R [your-server-ip]:port

其中 port 为第 1 步中映射的端口。例如

ssh-keygen -R [192.168.102.1]:5222

然后重新连接即可。

总体来说,在容器内执行的命令如下:

# 设置密码
passwd root
# 替换国内源
sed -i s:/archive.ubuntu.com:/mirrors.aliyun.com:g /etc/apt/sources.list
sed -i s:/security.ubuntu.com:/mirrors.aliyun.com:g /etc/apt/sources.list
apt update && apt install -y --no-install-recommends openssh-server
sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config
service ssh start

至此本文正文就完成了。但是解决我这个需求其实应该还有另外一种官方办法:Remote - Containers,只是我折腾了半天实在是搞不通,感觉远没有刚这个方法简单快捷。

如果你还想看看我的吐槽,可以往下继续看,否则,可以关闭这个页面了。

END

Remote - Containers?

当然首先想到的是用微软官方出的插件:Remote - Containers,这个属于远程开发套件中的一个,主要用于连接容器。其他两个如下:

  • Remote - SSH:连接远程服务器,很好用,日常使用
  • Remote - WSL:连接 Windows 的 Linux 子系统,没怎么用过

虽然为远程开发套件(Remote Development)之一,但是真的能解决我的需求吗?这要看这个 Remote 怎么定义了。

默认情况下,这个 Remote 指的是本地的容器,没错,是本地的。这是经过我一番折腾后才意识到的。先看下官方文档是如何定义这个插件的:

The Visual Studio Code Remote - Containers extension lets you use a Docker container as a full-featured development environment. It allows you to open any folder inside (or mounted into) a container and take advantage of Visual Studio Code’s full feature set.

里面只字未提 Remote,而提到的时候,是在 Advanced Container Configuration 这一文档中的 Developing inside a container on a remote Docker host 部分。在这里的介绍中,我清楚地认识到 Remote - Containers 默认确实指的是连接本地容器(毕竟本地的容器相对于本地来说,也算是远程操作系统了):

Sometimes you may want to use the Remote - Containers extension to develop inside a container that sits on a remote server. Docker does not support mounting (binding) your local filesystem into a remote container, so VS Code’s default devcontainer.json behavior to use your local source code will not work. While this is the default behavior, in this section we will cover connecting to a remote host so that you can either attach to any running container, or use a local devcontainer.json file as a way to configure, create, and connect to a remote dev container.

看第一句话:Sometimes you may want to use the Remote - Containers extension to develop inside a container that sits on a remote server,Really?真的是 Sometimes 吗?如此经常的操作没想到被归为「非正常需求」。

然而经过安装 dockers for Windows,重启两次开启虚拟化,等等等等,半天的一顿折腾后,我放弃了。还要 ssh 免密登陆,还得本地安装 docker。这真的不如同事说的 pycharm 那样好用。

REAL END

Reference

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python NumPy 基础

    这两天读完《利用Python进行数据分析》 这本书的第4章:NumPy 基础:数组和矢量计算 后,在进行下一步阅读高级应用前,先整理本章内容,做个笔记备查,也好...

    Alan Lee
  • Python-NumPy基础

    前言 这两天读完《利用Python进行数据分析》 这本书的第4章:NumPy 基础:数组和矢量计算 后,在进行下一步阅读高级应用前,先整理本章内容,做个笔记备查...

    Alan Lee
  • 【TensorFlow】学习率、迭代次数和初始化方式对准确率的影响

    想必学过机器学习的人都知道,学习率、训练迭代次数和模型参数的初始化方式都对模型最后的准确率有一定的影响,那么影响到底有多大呢? 我初步做了个实验,在 Tenso...

    Alan Lee
  • CentOS7+rsync+sersync实现数据实时同步

    一、为什么要用Rsync+sersync架构? 1、sersync是基于Inotify开发的,类似于Inotify-tools的工具 2、sersync...

    拓荒者
  • 采用更好的私有云意味着更好的多云策略

    导语 在许多情况下,增强的私有云可能是企业实现多云战略的最佳选择,而IBM公司估计,从2017年开始,企业采用私有云每年的支出将超过500亿美元,到2020年将...

    静一
  • 卸载CUDA9安装CUDA8

    但是发cuda9很难卸载干净,安装cuda8时又给我自动安装到cuda9去了,后来终于成功干净彻底地删除cuda9了,于是记录一下

    TeeyoHuang
  • sersync实现数据实时同步

    1.1 第一个里程碑:安装sersync软件 1.1.1 将软件上传到服务器当中并解压 1、上传软件到服务器上 rz -E 为了便于管理上传位置统一设置为 /s...

    惨绿少年
  • 掌握Python 装饰器,其实只需要一盏茶的功夫

    用户2176428
  • 框架篇-Django博客应用-文章列表

    1.首页指的是博客首页 /index/,首页分两栏,左边放文章列表,右边可根据个人喜好放一些标签、最新评论...

    小团子
  • 大数据与认识论

    摘要 大数据认识论的主体高度分化并社会化,认识的对象是世界2作用于(包括认识与实践活动)世界1,以及世界2自身相互作用(同样包含认识与实践活动),这两项相互作用...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券