自从 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 用户,那么相应的要设置该账户的密码。

  1. 【远程服务器容器】很多镜像都不会默认安装 ssh,所以需要在容器内安装 ssh 服务:
apt update && apt install -y --no-install-recommends openssh-server
  1. 【远程服务器容器】一般进入容器时使用的都是 root 账号,但是 ssh 默认是禁止 root 账号使用密码远程登录的,所以需要修改 ssh 配置文件使其允许:
sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config

但是如果你启动容器的时候使用 -u 参数指定了一个非 root 用户,那么这步可以跳过。

  1. 【远程服务器容器】启动 ssh 服务:
service ssh start
  1. 【本地】使用 VSCODE 连接,添加新的 ssh host 的时候地址这么写:
ssh root@your-server-ip -A -p 5222

这个 5222 就是第 1 步启动容器的时候设置的映射端口。之后输入密码即可,和正常的连接远程服务器一样。

完成!

vscode连接docker vscode连接linux服务器_vscode


另外,执行第 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 - Containers 中,默认情况下,这个 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