Se parece com uma VM, nada como uma VM e grasna como uma VM, mas é um container
  • Shell 76.2%
  • Dockerfile 12.5%
  • Python 8%
  • HTML 3.3%
Find a file
2025-07-22 21:10:21 -04:00
application Corrigido necessidade das permissões 2023-12-22 14:18:12 -04:00
docker-vm voltando como estava a versão do php 2025-07-22 21:10:21 -04:00
.gitignore Agora tudo é configurável em um único arquivo 2023-12-22 13:09:02 -04:00
.gitlab-ci.yml voltando como estava a versão do php 2025-07-22 21:10:21 -04:00
Dockerfile.mydockerdind Instalar extensões via terminal funciona, limpando cache para diminuir tamanho da imagem 2023-09-03 20:37:32 -04:00
README.md Agora tudo é configurável em um único arquivo 2023-12-22 13:09:02 -04:00

Docker Container VM

Criar containers docker que funcionam quase idêntico à uma máquina virtual. Com capacidade de executar outros containers docker e programas, apenas dentro do container sem afetar o host.

Utilização Rápida

Primeira vez:

  • Editar o application/templates/docker-compose.yml e escolher se irá utilizar sysbox, e também para controlar a limitação de cpu e memória, bem como configurar outras variáveis de ambiente, portas, volumes, etc...
  • (Opcional) Editar o arquivo application/env.sh e colocar as configurações desejadas
    • erickweil/container-vm:code (Padrão) - Possui apenas o code-server e utilitários básicos de terminal instalado
    • erickweil/container-vm:complete - Costruído a partir da imagem :code, docker, web server nginx com php ativado, servidor ssh, node, python, java, kubectl, cliente mysql
  • Se deseja utilizar o mysql, deve ter o cliente de terminal mysql instalado e o arquivo .my.cnf com a senha em $HOME/.my.cnf
[client]
user=root
password=SENHA-BANCO-DE-DADOS

Caso não queira utilizar mysql, apague os scripts 01-run-mysql.sh e 01-create-mysql-user.sh

  • Executar o script de instalação:
cd application
bash ./install.sh

Para cada container: Executar o script new_container.sh recebendo o usuário, senha, porta do code server e porta do ssh.

Por exemplo:

cd application
bash ./new_container.sh joao 12345678 8080 22
  • Usuário: 'joao'
  • Senha: '12345678'
  • Porta do Code-Server: 8080
  • Porta SSH: 22

Recomendações:

  • Instalar o Sysbox (Devido ao uso de Systemd e Docker dentro dos containers, Sem Sysbox os container previsam ser iniciados com --privileged, além dos problemas de segurança que isso causa com algumas dezenas de containers já se torna impossível subir mais containers dando um erro too many open files Veja #1 #2 )

Como funciona:

Objetivos:

  • Prover a experiência de uma máquina virtual para cada aluno.
  • Desacoplar a dependência do aluno com computadores específicos, desenvolver em qualquer lugar e a qualquer hora.
  • Eliminar a exigência de um computador/notebook com sistema operacional específico e softwares pré-instalados.
  • Permitir subir aplicações online na internet publicamente de forma fácil.

Todos esse objetivos serão atendidos com o uso de um container docker que se comporta como uma máquina virtual para cada aluno, contendo o Code-Server, o VSCode direto do navegador.

Existem imagens docker do code-server (codercom/code-server:latest ou linuxserver/code-server) porém estas imagens docker possuem pouco ou quase nenhum software pré-instalado, e considerando as necessidades específicas deste cenário foi preciso a criação de uma imagem Docker própria.

Pode-se perguntar: Mas e porquê utilizar containers docker e não criar logo uma Máquina virtual para cada um? A vantagem de containers docker é que os recursos de memória, cpu e armazenamento serão compartilhados quase como numa internet banda larga a banda é compartilhada, não é necessário possuir todos os recursos previstos pré-reservados, apenas os recursos que se tornarem realmente necessários pelo uso. Leitura relacionada: https://blog.nestybox.com/2020/09/23/perf-comparison.html

Imagem Docker

O arquivo Dockerfile e scripts necessários desta imagem Docker estão disponíveis no diretório docker-vm do repositório: https://github.com/erickweil/testedocker/tree/main/docker-vm

A imagem Docker Base, com usuário admin:admin está publicada no DockerHub container-vm

A imagem basicamente constrói um ambiente que imita uma máquina virtual, contendo vários utilitários de linha de comando (nano, ping, nslookup, curl, wget, etc...), systemd para gerenciar os serviços, um servidor ssh, instalação code-server via script, e programas que são comumentes utilizados no desenvolvimento (docker, git, node, python3).

Sysbox

Para subir um container docker dentro do docker, é necessário executá-lo com a flag --privileged, o que abre uma série de brechas de segurança, portanto seguindo algumas recomendações desta postagem de um blog que os próprios desenvolvedores do docker:dind sugerem ( https://github.com/jpetazzo/dind -> http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/ ) chega-se à solução Sysbox

Veja uma explicação sobre docker-in-docker para entender melhor porque usar Sysbox.

O Sysbox é um container runtime open-source e gratuito que melhora containers por prover maior isolamento e permitindo executar softwares à nível de sistema (Como docker) sem a necessidade da flag --privileged, eliminando então parte dos problemas de segurança e garantindo maior simplicidade no processo como um todo.

Qualquer imagem docker pode ser executada neste container runtime, o que muda é apenas como o container se comporta. Não há nada de especial a não ser a necessidade de instalar o Sysbox na máquina host e passar a opção --runtime=sysbox-runc ao executar o container.

É importante notar que a instalação do Sysbox exige o Shiftfs instalado caso o kernel do linux seja menor que 5.19 (uname -a para ver a versão do kernel). Veja: https://github.com/nestybox/sysbox/blob/master/docs/distro-compat.md

A solução para isso é ou fazer upgrade do kernel (Veja https://github.com/pimlie/ubuntu-mainline-kernel.sh) ou utilizar uma distribuição mais recente (O Ubuntu Lunar Lobster já está no kernel 6.2)