使用 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 - 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

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论
VSCode可以通过SSH远程连接到Linux服务器进行代码编辑。首先,在Linux服务器上安装openssh-server和openssh-client,可以使用以下命令进行安装: ``` sudo apt-get install openssh-server openssh-client ``` 然后,生成服务器的密钥和公钥,可以使用以下命令: ``` ssh-keygen ``` 接下来,在Windows系统上安装VSCode以及必要的插件。可以从VSCode官方市场获取两个插件:“Remote - SSH”和“Remote - SSH: Editing Configuration Files”。装第一个插件时,会自动安装第二个插件。 在配置免密登录之前,确保Windows机器能够访问互联网,因为通过VSCode连接到Linux机器后,会自动在Linux机器上安装相关插件。 为了避免每次连接远程主机都要输入密码,可以在Windows上使用ssh-keygen生成公钥和秘钥。可以按下Win+R运行cmd,然后使用以下命令生成: ``` ssh-keygen.exe -t rsa ``` 以上是连接到Linux服务器进行远程编程的步骤。这样,你就可以在VSCode中通过SSH远程连接到Linux服务器,并进行代码编辑了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vscode通过ssh连接远程服务器中的容器](https://blog.csdn.net/weixin_42726887/article/details/121879598)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [VSCode使用Remote SSH连接远程服务器](https://blog.csdn.net/white_jx/article/details/127446369)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

secsilm

来一根火腿?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值