Mainframe Self-Hosted com Docker
Rodando MVS 3.8j em Docker para aprender COBOL e JCL de verdade
Durante anos, mainframe foi tratado como algo distante, caro e inacessível — quase um “dinossauro” da computação. A realidade é outra: o mainframe continua extremamente relevante, e hoje é possível estudar MVS, COBOL e JCL em casa, com custo zero, usando Docker.
Neste artigo, vou mostrar como montei um ambiente de mainframe no meu homelab, os erros que cometi no caminho (importantes!) e a arquitetura que realmente funciona para aprender MVS 3.8j (TK4-) de forma séria.
⚠️ Este não é um artigo “nostálgico”.
É um guia técnico, baseado em tentativa, erro e aprendizado real.
Por que estudar mainframe hoje?
Antes da parte técnica, a pergunta inevitável: por quê?
Alguns motivos objetivos:
- COBOL ainda processa trilhões de dólares por dia (bancos, seguros, governos)
- Sistemas core críticos continuam rodando em mainframe
- Há escassez de profissionais
- O modelo mental de batch, JCL e datasets forma engenheiros mais disciplinados
Aprender mainframe não é sobre o passado, é sobre entender a base da computação corporativa.
O objetivo do ambiente
O que eu queria desde o início:
- Rodar um mainframe realista
- Usar MVS 3.8j
- Programar COBOL
- Escrever JCL
- Ter persistência de dados
- Evitar “simuladores simplificados”
A solução acabou sendo:
- Hercules (emulador de mainframe)
- TK4- (MVS 3.8j Turnkey System)
- Docker
- Cliente 3270 no host (Mac)
- A arquitetura correta (e o erro que quase me desviou)
O erro: tentar usar noVNC / browser
Em um primeiro momento, tentei algo “moderno”:
- noVNC
- X11
- VNC
- x3270 dentro de container
- browser como frontend
Isso foi um erro arquitetural.
Por quê?
Porque 3270 não é gráfico.
Mainframe não trabalha com pixels, trabalha com buffers de tela e campos.
Ao usar VNC, eu criei camadas desnecessárias:

Resultado:
- problemas de DISPLAY
- teclas PF quebradas
- timing errado
- complexidade inútil
A solução correta
Separar responsabilidades:

Simples. Estável. Funcional.
Docker Compose: apenas o essencial
Este é o docker-compose final, limpo e funcional:
version: "3.8"
services:
tk4:
image: skunklabz/tk4-hercules:latest
container_name: tk4
restart: unless-stopped
tty: true
stdin_open: true
ports:
- "13270:3270"
- "18038:8038"
volumes:
- tk4-conf:/tk4-/conf
- tk4-local_conf:/tk4-/local_conf
- tk4-local_scripts:/tk4-/local_scripts
- tk4-prt:/tk4-/prt
- tk4-dasd:/tk4-/dasd
- tk4-pch:/tk4-/pch
- tk4-jcl:/tk4-/jcl
- tk4-log:/tk4-/log
volumes:
tk4-conf:
tk4-local_conf:
tk4-local_scripts:
tk4-prt:
tk4-dasd:
tk4-pch:
tk4-jcl:
tk4-log:
Esse setup garante:
- persistência de DASD
- persistência de JCL
- logs
- ambiente reutilizável
Para construir um mainframe self-hosted com Docker, utilizei a imagem skunklabz/tk4-hercules, disponível no Docker Hub, que reúne o Hercules Mainframe Emulator e o TK4- (MVS 3.8j Turnkey System) em um único container pronto para uso. Essa imagem Docker simplifica drasticamente o processo de rodar MVS 3.8j em ambiente local, eliminando a necessidade de instalações complexas e permitindo que desenvolvedores estudem COBOL, JCL, TSO e ISPF em um homelab moderno. Ao executar o mainframe dentro de um container Docker, é possível obter isolamento, reprodutibilidade e persistência de dados, tornando o ambiente ideal tanto para aprendizado quanto para experimentação técnica com tecnologias clássicas de mainframe integradas a práticas modernas de infraestrutura.
Conectando ao mainframe
No Mac, instalei o cliente 3270:
brew install x3270No meu caso, uso c3270 (modo texto):
c3270 HOST:13270Login padrão do TK4-:
USERID: HERC01
PASSWORD: CUL8TRE pronto: TSO/E READY.

O papel do Web Console (porta 8038)
A porta 8038 não é para trabalhar, mas é extremamente útil:
- acompanhar boot do sistema
- ver mensagens do Hercules
- confirmar conexões 3270
- troubleshooting
Acessando:
http://HOST:18038Trabalhando no MVS: a experiência real
Depois do login, tudo acontece via ISPF:
- datasets em vez de arquivos
- JCL em vez de scripts
- batch como cidadão de primeira classe
Fluxo típico:
- Criar dataset de fonte COBOL
- Criar dataset de JCL
- Escrever programa
- Submeter JOB
- Ler JOBLOG
- Iterar
Nada é mágico. Tudo é explícito.
O que eu aprendi com essa experiência
Algumas lições importantes:
- Mainframe exige disciplina
- Erros sempre têm mensagem (se você souber ler)
- Menos abstração = mais clareza
- Docker é excelente para infra, não para terminal
- Nem tudo precisa ir para o browser
E talvez a principal:
Mainframe te obriga a pensar antes de executar.
Isso muda completamente a forma de programar.
Para quem esse ambiente faz sentido?
✔ Desenvolvedores curiosos
✔ Estudantes de COBOL
✔ Profissionais migrando para área de alta plataforma bancária
✔ Quem quer entender computação “raiz”
Conclusão
Rodar um mainframe no homelab hoje é:
- tecnicamente viável
- barato
- extremamente educativo
Mais do que aprender COBOL ou JCL, essa experiência ensina:
- organização
- leitura de logs
- execução controlada
- respeito à infraestrutura
Se você trabalha com sistemas distribuídos modernos, estudar mainframe te torna um engenheiro melhor.
El primer paso consiste en precisar la conveniencia de una prenda para regalo o uso propio. Para interpretar correctamente la información, conviene consultar las instrucciones de lavado y conservación. Consultar «» ayuda a confirmar los detalles esenciales antes de tomar una decisión. Antes de confirmar la compra, conviene revisar que la descripción coincida con las fotografías.
衣装の候補を絞る場合は、サイズ、素材、装飾、付属品を同じ基準で見比べることが大切です。商品仕様や選び方を比べたい場合は、コスプレ衣装 即日発送から関連情報を確認できます。商品が届いたら付属品とサイズを早めに確認し、必要な調整を本番前に済ませましょう。
El primer paso consiste en precisar la conveniencia de una prenda para regalo o uso propio. Para interpretar correctamente la información, conviene consultar las instrucciones de lavado y conservación. Consultar «camiseta versión jugador de la selección de Colombia» ayuda a confirmar los detalles esenciales antes de tomar una decisión. Antes de confirmar la compra, conviene revisar que la descripción coincida con las fotografías.