menu Chancel's blog
rss_feed
Chancel's blog
有善始者实繁,能克终者盖寡。

使用Docker容器取代虚拟机作为远程开发的服务器

作者:Chancel Yang, 创建:2023-10-19, 字数:2477, 已阅:45, 最后更新:2023-10-20

一直以来,开发环境都是通过Visual Studio Code(以下简称VSC)远程SSH进行的

这套方案有以下几个好处:

  1. 开发环境统一:无论我是在家或是在外都可以保持同一份代码以及同一个系统环境,免除了在家写一半代码来公司前需要commit的操作,也无需记忆不同设备上的不同代码路径了
  2. 开发环境隔离:客户端无任何要求,只需要可以安装VSC都可以随时进入开发状态,不再需要在不同的操作系统之间反复安装开发环境

而远程服务器我选择的是本地虚拟机Debian12,通过Gost组网实现在任何设备下都可以随时访问

但是这套方案也有不足之处:

  1. 系统强隔离:由于虚拟机的特性,虚拟系统与宿主系统是完全隔离的,这就导致部分场景我需要反复下载上传文件,调试web时也要注意更改host0.0.0.0否则宿主机无法访问
  2. 硬件资源浪费:虚拟机需要规划好性能,提前划出硬盘、CPU、网络等资源作为独立的虚拟资源,颇为不方便,尤其涉及到显卡训练等场景更为不方便

Docker可以很好的弥补这些缺点,与宿主机实现统一网络环境与文件系统

1. Debian12容器

1.1. 构建

Docker设计理念与虚拟机不同,一个容器是生命进程等于一个应用的生命进程,而不是虚拟机这种完全独立的操作系统

所以这一点需要稍微注意,要给容器一个永久可以运行的应用,这里我选择是使用容器来运行SSH服务

Dockerfile文件参考如下

FROM debian:12.1

# 安装SSH服务端和其他依赖项
RUN apt-get update && \
    apt-get install -y openssh-server  vim wget proxychains gcc make net-tools openssl curl sudo git && \ 
    mkdir -p /run/sshd

# 生成SSH服务器的密钥
RUN ssh-keygen -A

# 设置root用户的密码
RUN echo 'root:root' | chpasswd

# 开放SSH服务端口
EXPOSE 22

# 启动sshd服务
CMD ["/usr/sbin/sshd", "-D"]

构建这个镜像

sudo docker build -t debian12.1:latest . --no-cache

将当前目录下的data文件夹映射给容器并运行容器

sudo docker run --name debian12.1 --restart=always -d -p 20022:22 -v "$(pwd)/data":/data debian12.1:latest

之后可以将代码项目全部放到data目录下,也方便编译后随时验证

1.2. 运行

运行成功后,在宿主机使用ssh容器连接

ssh root@127.0.0.1 -p 20022

给系统升级并安装常用的软件

apt update
apt install -y vim wget proxychains gcc make net-tools openssl screen unzip htop curl sudo git zsh

接下来创建用户,这里创建chancel用户

adduser chancel

编辑/etc/sudoers,添加如下一行授权chancel用户为超级管理员

chancel ALL=(ALL:ALL) ALL

到此,一个初步的远程环境便配置完成了,其他单独的语言开发环境配置与上面类似,这里不展开赘述了

2. 问题

Docker的镜像debian:12.1不是一个完整的操作系统,会出现很多小问题,以下是一些记录与修复

2.1. 光标输入错位

这是缺失中文编码的问题,输入locale可以检查

chancel@6a57fa21dec6 locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=zh_CN.UTF-8
LC_TIME=zh_CN.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=zh_CN.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=zh_CN.UTF-8
LC_NAME=zh_CN.UTF-8
LC_ADDRESS=zh_CN.UTF-8
LC_TELEPHONE=zh_CN.UTF-8
LC_MEASUREMENT=zh_CN.UTF-8
LC_IDENTIFICATION=zh_CN.UTF-8
LC_ALL=

修复需要安装locales,如下

sudo apt install -y locales

然后使用dpkg-reconfigure locales来重新设置本地编码,在出现的菜单中记下en_US.UTF-8 UTF-8的编码

在随后的输入中输入该序号,并设置为默认编码即可


[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]