最近开始有大量需要用到linux的开发环境的课,但是又不想给我的主力台式机装上Debian,便想要找一种方式可以远程一个linux进行开发。通常linux支持的VNC作为开发严重受限于网络质量,并且延迟较高,遂放弃。于是选择使用VSCode链接远程服务器的SSH作为开发环境。同时docker可以轻松切换各种开发环境而不影响宿主机。

服务器配置

最近刚好买了台搭载Intel N100 CPU的微型机作为一个微型服务器。功耗及声音极低,非常适合放在房间里挂一些服务。配置如下:

  • CPU: Intel N100
  • RAM: 16GB LPDDR5
  • SSD: 256GB
  • NIC: 2x 1000Mbps Ethernet

这个配置作为个人微型服务器非常合适,并且具有双网口,有需要也可以做软路由。

这里不是广告

Dockerfile

最重要的一步就是完成Dockerfile,可以参考如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
FROM python:3.11.5-bookworm as builder-image

ARG SSH_PASSWORD
ARG SSH_PUBLIC_KEY

COPY requirements.txt .
RUN pip install --default-timeout=1000 --no-cache-dir -r requirements.txt

WORKDIR ./app

COPY . .

RUN apt-get update -y \
&& apt-get install -y libaio1 vim nano openssh-server locales

RUN echo "root:${SSH_PASSWORD}" | chpasswd

RUN echo "${SSH_PUBLIC_KEY}" >> /root/.ssh/authorized_keys

RUN chmod 600 /root/.ssh/authorized_keys && chmod 700 /root/.ssh

RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen

# Set environment variables for the locale for haskell
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

EXPOSE 8088 22

CMD service ssh restart && tail -f > /dev/null

并且目录结构如下
1
2
3
4
5
WorkingFolder
├─ Dockerfile
├─ requirements.txt
├─ docker
└─sshd_config

  • python:3.11.5-bookworm: 基础镜像,可以选择自己需要的开发环境作为基础镜像。这里使用的是Python3.11.5 + Debian 12.
  • requirements.txt: Python需要安装的包,根据自己的需要添加
  • sshd_config: SSHD 的配置文件,可以从自己的linux机器中copy出来。
  • 安装软件: 可以在apt-get install后面添加需要安装的包。

打包Docker

使用如下命令可以打包docker

1
docker build --build-arg SSH_PASSWORD=${{ secrets.SSH_PASSWORD }} --build-arg SSH_PUBLIC_KEY="${{ secrets.SSH_PUBLIC_KEY }}" -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.REPO_NAME }}:latest .

  • secrets.SSH_PASSWORD: 想要使用的ssh密码
  • secrets.SSH_PUBLIC_KEY:想要使用的SSH公钥证书
  • secrets.DOCKERHUB_USERNAME: DockerHUB 用户名(如果不需要这里可以删掉)
  • secrets.REPO_NAME:DockerHub 仓库名称
  • latest:可以替换成你想要的Tag

注意这里最后一个点,这个不可省略,表示构建当前目录

如果只需要本地build和运行,${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.REPO_NAME }}:latest 这一部分可以换成 <image-name>:<tag>

运行Docker

创建持久化Volume:

1
docker volume create --name <volume-name>

运行Docker:
1
docker run -d -v <volume-name>:/root -p 8022:22 <image-name>:<tag>

自行替换缺失部分

由于已经生成了ssh密码以及公钥证书,可以直接通过证书进行ssh链接

VSCode 配置

打开VSCode,安装Remote SSH 插件

Remote SSH

从最左侧任务栏中间打开Remote菜单, 点击设置按钮

点击第一个配置文件

在尾端加上如下配置

1
2
3
4
5
6
Host Docker-Python-3.11
HostName 192.168.10.5
User root
Port 10001
PreferredAuthentications publickey
IdentityFile "D:\ssh_keys\dockerssh"

根据个人配置修改IP,端口,用户以及证书
VSCode只能使用证书才能不用每次登录输入密码。如果使用密码SSH,每次链接需要输入密码

SSH 密钥权限

存放在客户端的私钥VSCode要求严格的权限控制

对于Linux用户,可以执行以下命令

1
chmod 400 ~/.ssh/<private_key>

对于Windows用户,可以使用如下Powershell脚本
1
icacls "privateKeyPath" /grant :R

注意替换路径

然后在Windows资源管理器中导航到私钥文件,右键单击并选择属性。选择安全性选项卡> 高级> 禁用继承> 从此对象中删除所有继承的权限。

Done

至此基本操作均已完成,可以在VSCode中间使用terminal执行命令。并且可以安装许多VSCode插件。

同时也可以上传到Github,并且配置Github Actions进行自动构建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
name: Docker Build and Push

on:
push:
branches:
- main # Trigger the workflow on push to the main branch

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v2

- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}

- name: Build Docker image
run: |
docker build --build-arg SSH_PASSWORD=${{ secrets.SSH_PASSWORD }} --build-arg SSH_PUBLIC_KEY="${{ secrets.SSH_PUBLIC_KEY }}" -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.REPO_NAME }}:latest .

- name: Push Docker image
run: |
docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.REPO_NAME }}:latest

此脚本会自动上传到DockerHub。注意配置Github Variables。

可以按照自己需求上传到 Github registry 或者其他 Docker 仓库管理。

具体可以参考仓库:此处

Enjoy !!