Docker容器中的工作站

为了什么?各种各样的想法不断出现,我立即想尝试其中的一些想法,但是工作站并不总是可用的,因此我为即将发生的所有事情设置了IDE。结果,设备开始变得混乱,并且变得难以维护和更新它们。

为了解决这个问题,我决定将这样的“笔记本”放置在云中,并且将每天进行更新并删除所有累积的垃圾。要工作,请远程连接。

图片

结果,他毫不怀疑地为解决大量任务提供了一个非常方便的工具:一个笔记本,一个测试站点,以查看手机未显示的内容,一个安全的沙箱以及为只能与GUI和许多其他程序一起使用的程序运行脚本。等。在本文中,我想分享创建此类容器的方法。

要创建这样的容器,必须编写Dockerfile。在本文中,我将描述其创建的整个过程。谁不想创建自己,但想要尝试并尝试,那么在文章底部将有指向现成图像的链接。

操作系统


任何Linux都可以。就个人而言,我更喜欢漂亮的OpenSuse,但将其内存消耗与CentOS进行比较后,我决定选择后者。实际上,容器消耗的内存越少,您可以在其托管上节省更多。

让我们开始创建一个dockerfile:

FROM centos:7

远程访问


为了连接到容器,您必须配置VNC远程访问服务器。为此,必须理解两个因素:

  1. 系统没有监视器。因此,它必须被模拟。为此有一个特殊的x0vncserver服务器。
  2. VNC服务器不应资源充足。毕竟,您必须为此付费。并且信号传输的滞后应最小化,否则会引起不适。

为了解决这两个问题,我为服务器选择了TigerVNC服务器,为客户端选择了TightVNC。TigerVNC Server包含在任何Linux中,重量轻,速度快,并且通过x0vncserver无需监视器即可支持工作。TightVNC客户端提供了如此快速的图片传输,感觉好像它不是远程连接,而是计算机上运行的程序。

扩展Dockerfile:

FROM centos:7

RUN yum install -y epel-release dnf \
        && \
        dnf install -y \
            tigervnc-server \
        && \
        yum clean all && dnf clean all \
        && \
        rm -rf /var/cache/yum/* && rm -rf /var/cache/dnf/*

安装程序后,我们清除缓存以减轻图像的重量。

桌面


我真的很喜欢Breeze主题的KDE,但是KDE是一个非常贪吃的桌面。侏儒及其衍生物更为。Xfce,Ice不太漂亮。幸运的是,有一个解决方案-具有Kde-Plasma主题的LXQT桌面。

安装桌面:

FROM centos:7

RUN yum install -y epel-release dnf \
        && \
        dnf install -y \
            tigervnc-server \
            openbox obconf-qt \
            lxqt-about lxqt-common lxqt-config lxqt-globalkeys lxqt-notificationd \
            lxqt-openssh-askpass lxqt-panel lxqt-policykit lxqt-qtplugin lxqt-runner \
            lxqt-session pcmanfm-qt \
            dejavu-sans-mono-fonts \
            xterm nano htop expect sudo \
        && \
        yum clean all && dnf clean all \
        && \
        rm -rf /var/cache/yum/* && rm -rf /var/cache/dnf/*

多一点,您可以运行。

用户创建


在容器中,必须由某些用户来工作。为此,请创建它并设置密码,并为root用户设置密码:

... Dockerfile

ENV HOME=/home/headless

RUN /bin/dbus-uuidgen --ensure && \
        useradd headless && \
        echo "centos" | passwd --stdin root && \
        echo "centos" | passwd --stdin headless

在这里,无头是我们创建并与之合作的用户,“ centos”是由用户和root指定的密码。最好在容器启动时从外部参数传递它,但是即使采用这种形式,容器也不会受到攻击,因为 VNC中的连接将通过参数中的密码进行密码保护。

配置vnc服务器启动


首先,您需要一个辅助脚本来配置我们的VNC服务器:

#!/usr/bin/expec

spawn /usr/bin/vncserver :1 -fg -geometry 1820x960
expect "Password:"
send "$env(password)\r"
expect "Verify:"
send "$env(password)\r"
expect "Would you like to enter a view-only password (y/n)?"
send "n\r"

set timeout -1
expect eof

必须将其放在Dockefile旁边,稍后将其包含在容器中,程序将从其启动。在此文件中,您必须指定计划使用的分辨率,例如,我设置了1820x960。如果指定的值小于客户端窗口的大小,则服务器可能会由于内存不足而崩溃。如果指定更多,则将需要缩放图片,并且桌面的元素将变得太小。同样在此脚本中,将从将在容器启动参数中传递的变量中设置密码。

仍然需要将此文件复制到容器并添加启动参数:

... Dockerfile

COPY ./startup.sh ${HOME}
RUN mkdir -p ${HOME}/.vnc \
        && \
        echo '#!/bin/sh' > ${HOME}/.vnc/xstartup && \
        echo 'exec startlxqt' >> ${HOME}/.vnc/xstartup && \
        chmod 775 ${HOME}/.vnc/xstartup \
        && \
        chown headless:headless -R ${HOME}


WORKDIR ${HOME}
USER headless
ENTRYPOINT ["expect", "./startup.sh"]

就这样,您可以运行。如果在编译Dockerfile混淆,那么它的完整版可以在发现我的仓库,并在成品容器泊坞窗枢纽

要启动完成的容器,必须运行以下命令:

docker run -it --rm -e password='YOUR_VNC_PASSWORD' -p5901:5901 labeg/centos-lxqt-vnc

并使用TightVNC客户端进行连接。

图片

连接后,必须输入先前指定的用户密码。还建议您立即进行更改以提高安全性。

要启用上面的屏幕截图中的精美设计,请转到开始>首选项>外观> LXQt主题,然后选择Kde-plasma主题。

工作程序


现在,您可以使用工作程序创建第二个图像。为此,只需获取上面创建的映像,并用用于安装软件包的脚本对其进行补充:

FROM labeg/centos-lxqt-vnc:latest

USER root

# dotnet vscode monodevelop nodejs git2
RUN rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm \
        && \
        rpm --import https://packages.microsoft.com/keys/microsoft.asc && \
        sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo' \
        && \
        rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF" && \
        su -c 'curl https://download.mono-project.com/repo/centos7-vs.repo | tee /etc/yum.repos.d/mono-centos7-vs.repo' \
        && \
        yum install -y https://centos7.iuscommunity.org/ius-release.rpm \
        && \
        curl -sL https://rpm.nodesource.com/setup_13.x | bash - \
        && \
        dnf install -y geany git2u git2u-gui code monodevelop firefox dotnet-sdk-3.1 nodejs gnome-terminal gnome-system-monitor \
        && \
        npm install -g gulp typescript npm-check-updates \
        && \
        chown headless:headless -R ${HOME}

USER headless

RUN code --install-extension ms-vscode.vscode-typescript-tslint-plugin && \
    code --install-extension dbaeumer.vscode-eslint && \
    code --install-extension mrmlnc.vscode-scss && \
    code --install-extension visualstudioexptteam.vscodeintellicode && \
    code --install-extension ms-dotnettools.csharp && \
    code --install-extension joelday.docthis && \
    code --install-extension mrmlnc.vscode-remark && \
    code --install-extension eamodio.gitlens

该脚本为Linux下的Typescript和C#开发安装工具。这是NodeJS,带有必要扩展的VS Code和Monodevelop(又名Visual Studio for Mac)。

它的开始与上一张图像一样简单:

docker run -it --rm -e password='YOUR_VNC_PASSWORD' -p5901:5901 labeg/devpc

现在,您可以在几秒钟内部署一个干净的工作环境。

图片

储存库和完成的图像


如果您需要现成的存储库和映像,或者想要改善现有存储库和映像,例如,通过启动参数,设置用户密码,屏幕分辨率或在崩溃后重新启动VNC服务器,那么欢迎使用我的存储库。Gihub Dockerhub桌面的

基本映像 具有Typescript和C#Gihub Dockerhub工具的图像


All Articles