在服务器容器中实现python远程开发调试的方法:vscode篇
链接
本系列教程会讨论基于vscode和jupyterlab工具,在服务器容器中的远程开发方式。
vscode: 在服务器容器中实现python远程开发调试的方法:vscode篇
jupyterlab: 在服务器容器中实现python远程开发调试的方法:jupyterlab篇
端口受限: 在服务器容器中实现python远程开发调试的方法:端口受限篇
常见问题: 在服务器容器中实现python远程开发调试的方法:常见问题篇
准备工作
docker相关(服务器端)
- 确保 docker 已经安装,且已经创建相关容器(比如基于nvidia/cuda镜像创建的cuda环境)。
- Manage Docker as a non-root user(不用每次输入 sudo)
#Step1: $ sudo groupadd docker #Step2: $ sudo usermod -aG docker $USER #Step3: $ newgrp docker
- Configure Docker to start on boot with systemd. On Debian and Ubuntu, the Docker service starts on boot by default. Below is for other Linux distributions using systemd.
$ sudo systemctl enable docker.service $ sudo systemctl enable containerd.service $ sudo systemctl disable docker.service $ sudo systemctl disable containerd.service
vscode 相关
- 已安装vscode
- vscode需要安装的插件:
- Dev Containers
- Remote-SSH
- Python
- 调试用config文件后面会单独说明
- 远端服务器和或服务器容器内需要装 vscode-server,第一次使用 vscode 连接时会自动安装(确保网络正常连接即可)。
ssh相关
- 确保已经安装 ssh
$ ssh -V OpenSSH_9.0p1, OpenSSL 1.1.1q 5 Jul 2022
- ssh 免密登录:服务器A要免密登录服务器B,则要把服务器A的公钥存到服务器B的授权公钥文件中;先在服务器A上生成一对秘钥(ssh-keygen),然后将公钥拷贝到服务器B的authorized_keys文件中
# 客户机端:远程登录方式 PS ssh -p xxxx user@remote # 比如 ssh user1@192.168.10.1 # 客户机端:生成密钥{id_rsa(私钥文件) id_rsa.pub(公钥文件)} PS ssh-keygen -t rsa # 三个回车(默认) # 第一?询问你保存在什么位置, Enter file in which to save the key(.ssh/id_rsa) # 第二?询问你密钥保护, Enter passphrase # 第三?再次输入相同的密码, Enter same passphrase again # 客户机端复制公钥id_rsa.pub的内容到 远端服务器 user1 用户(authorized_keys), 不再需要输入密码 PS ssh-copy-id user1@192.168.10.1 # 如果客户端是 windows, ssh-copy-id不可用,则需要先对其进行定义,然后再执行上一句 PS >> function ssh-copy-id([string]$userAtMachine, $args){ >> $publicKey = "$ENV:USERPROFILE" + "/.ssh/id_rsa.pub" >> if (!(Test-Path "$publicKey")){ >> Write-Error "ERROR: failed to open ID file '$publicKey': No such file" >> } >> else { >> & cat "$publicKey" | ssh $args $userAtMachine "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1" >> } >> } # 或者直接将id_rsa.pub 拷贝到 服务器和/或容器的 authorized_keys中
vscode 访问容器的方式
M1. 客户机A通过 vscode 连接服务器B,再连接容器C
- 配置vscode的ssh配置文件:~.ssh\config(当需要多个不同的连接时,使用 IdentityFile 指定公钥位置)
Host server_B HostName 192.168.10.1 Port 22 User user1 ForwardAgent yes IdentityFile "~\.ssh\id_rsa"
- 登录服务器B:按下图顺序点击后进入服务器B
- 登录相关容器C:将2处切换到 Dev Containers ,3处 start(若没有开启)并 attach 相关容器。
- Dev Containers 目录下为服务器当前用户拥有的容器
- other Containers 目录下为其他用户拥有的容器
- 打开相关目录进行开发:按 vscode 的使用方式打开即可
M2. 客户机A通过 vscode 直接连接容器C
- 创建容器C时,加一个端口映射(比如C的ssh使用的22端口映射到B的30022。即加一个 -p 30022:22)
- 配置vscode的ssh配置文件(与上面的方法不太一样,端口号为映射后的端口号,用户名为容器的用户名)
Host container_C HostName 192.168.10.1 Port 30022 User root ForwardAgent yes IdentityFile "~\.ssh\id_rsa"
- 启动容器 C ,通过ssh登录到服务器B端使用docker container start 命令启动容器C
- 连接到容器C,按下图操作
M1和M2的区别
- M1需要通过ssh连接到服务器B,然后通过服务器B启动并连接到容器C;而M2直接连接容器C(需要C已经开启)。如果M2方法前面已经使用过,则vscode的welcome–>recent里面会用记录,直接点击记录可以直接进入容器C(可能会提示start 容器)
- M1可以访问其他的容器(B上所有的容器都可以访问);M2只能访问映射端口(比如30022)的容器
- M1不需要额外的端口号,M2需要额外的端口号