IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    chancel发表于 2023-10-19 00:00:00
    love 0
    <![CDATA[

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

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

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

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

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

    1. 系统强隔离:由于虚拟机的特性,虚拟系统与宿主系统是完全隔离的,这就导致部分场景我需要反复下载上传文件,调试web时也要注意更改host为0.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的编码

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



沪ICP备19023445号-2号
友情链接