Estação de trabalho em um contêiner de docker

Para quê? Todos os tipos de idéias sempre vêm a mim e algumas delas eu quero experimentar imediatamente, mas a estação de trabalho nem sempre está disponível, então configurei o IDE para tudo o que está disponível. Como resultado, os dispositivos começaram a ficar desordenados e ficou difícil mantê-los e atualizá-los.

Para resolver esse problema, decidi colocar um "bloco de anotações" na nuvem, que seria atualizado diariamente e excluiria todo o lixo acumulado. E para trabalhar, conecte-se a ele remotamente.

imagem

Como resultado, sem suspeitar disso, ele criou uma ferramenta muito conveniente para resolver um grande número de tarefas: um notebook, um site de teste, para ver o que o telefone não mostra, uma sandbox segura e executar scripts para programas que funcionam apenas na GUI e em muitas outras. etc. E no artigo, quero compartilhar o método de criação de tais contêineres.

Para criar um contêiner, você deve gravar seu Dockerfile. E no artigo vou descrever todo o processo de sua criação. Quem não quer se criar, mas quer tirar e tentar, então, na parte inferior do artigo, haverá links para imagens prontas.

sistema operacional


Qualquer Linux fará. Pessoalmente, prefiro o belo OpenSuse, mas, comparando seu consumo de memória com o CentOS, decidi escolher o último. De fato, quanto menos memória um contêiner consome, mais você pode economizar em sua hospedagem.

Vamos começar a criar um arquivo docker:

FROM centos:7

Acesso remoto


Para conectar-se ao contêiner, é necessário configurar o servidor de acesso remoto do VNC. Dois fatores devem ser entendidos para isso:

  1. O sistema não possui um monitor. Portanto, terá que ser emulado. Existe um servidor x0vncserver especial para isso.
  2. O servidor VNC não deve ter recursos. Afinal, você tem que pagar por eles. E os atrasos na transmissão do sinal devem ser mínimos, caso contrário causam desconforto.

Para resolver os dois problemas, escolhi o TigerVNC Server para o servidor e o TightVNC para o cliente. O TigerVNC Server está incluído na entrega de qualquer Linux, leve, rápido e também suporta trabalho sem monitor através do x0vncserver. O cliente TightVNC fornece uma transferência tão rápida de fotos que parece que não é uma conexão remota, mas um programa em execução em um computador.

Estenda o 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/*

Após a instalação dos programas, limpamos o cache para diminuir o peso da imagem.

Área de Trabalho


Eu realmente amo o KDE com o tema Breeze, mas o KDE é uma área de trabalho muito gulosa. O gnomo e seus derivados eram ainda mais gulosos. Xfce, o gelo não é muito bonito. Felizmente, existe uma solução - a área de trabalho LXQT com o tema Kde-Plasma.

Instale a área de trabalho:

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/*

Um pouco mais e você pode correr.

Criação de Usuário


No contêiner, é necessário trabalhar com algum usuário. Para fazer isso, crie-o e defina uma senha, bem como defina uma senha para o usuário root:

... Dockerfile

ENV HOME=/home/headless

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

Aqui, sem cabeça, é o usuário que criamos e de quem trabalharemos, "centos" é a senha especificada pelo usuário e raiz. É melhor transmiti-lo de parâmetros externos quando o contêiner é iniciado, mas mesmo assim, o contêiner não estará vulnerável, porque a conexão será protegida por senha no VNC através da senha nos argumentos.

Configurar inicialização do servidor vnc


Para começar, você precisa de um script auxiliar que configure o nosso servidor 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

Ele deve ser colocado próximo ao Dockefile, posteriormente será incluído no contêiner e o programa será iniciado a partir dele. Neste arquivo, você deve especificar a resolução na qual planeja trabalhar, por exemplo, tenho 1820x960 definido. Se você especificar menos do que o tamanho da janela do cliente, o servidor poderá falhar devido à falta de memória. Se você especificar mais, a imagem precisará ser dimensionada e os elementos da área de trabalho ficarão muito pequenos. Também neste script, uma senha será definida a partir das variáveis ​​que serão passadas nos parâmetros de inicialização do contêiner.

Resta copiar este arquivo para o contêiner e adicionar os parâmetros para seu lançamento:

... 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"]

Isso é tudo, você pode correr. Se você estiver confuso ao compilar o Dockerfile, sua versão completa poderá ser encontrada no meu repositório e no contêiner concluído no hub do docker .

Para iniciar o contêiner acabado, você deve executar o comando:

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

E conecte-se usando o cliente TightVNC.

imagem

Após a conexão, você deve inserir a senha do usuário especificada anteriormente. Também é recomendável que você o troque imediatamente para maior segurança.

Para ativar um design bonito, como na captura de tela acima, vá para Iniciar> Preferências> Aparência> Tema LXQt e selecione o tema Kde-plasma.

Programas de trabalho


Agora você pode criar uma segunda imagem com programas de trabalho. Para fazer isso, basta pegar a imagem criada acima e complementá-la com scripts para instalar pacotes:

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

O script instala ferramentas para o desenvolvimento de TypeScript e C # no Linux. Este é o NodeJS, VS Code com as extensões necessárias e o Monodevelop (também conhecido como Visual Studio para Mac).

Começa tão simples quanto a imagem anterior:

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

Agora, em segundos, você pode implantar um ambiente de trabalho limpo.

imagem

Repositórios e imagens finalizadas


Se você precisar de repositórios e imagens prontos, ou se desejar melhorar os já existentes, por exemplo, através dos parâmetros de inicialização, defina a senha do usuário, a resolução da tela ou reinicie o servidor VNC após a falha, bem-vindo aos meus repositórios.

Imagem básica com a área de trabalho Gihub Dockerhub .

Imagem com as ferramentas Typescript e C # Gihub Dockerhub .

All Articles