Translate

Mostrar mensagens com a etiqueta Docker Compose. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Docker Compose. Mostrar todas as mensagens

sábado, 12 de outubro de 2024

Docker para Programadores COBOL Mainframe: O "JCL" do Mundo Moderno que Todo Padawan IBM Z Precisa Entender

 

Bellacosa Mainframe e o docker no mundo cobol mainframe

☕ Um Café no Bellacosa Mainframe

Docker para Programadores COBOL Mainframe: O "JCL" do Mundo Moderno que Todo Padawan IBM Z Precisa Entender

"Você pode passar trinta anos programando COBOL sem nunca escrever uma linha de Docker. Mas provavelmente trabalhará com pessoas que usam Docker todos os dias para entregar o seu programa em produção."

Existe um mito muito comum entre profissionais de Mainframe.

"Docker é coisa de Linux."

Não.

Docker é uma tecnologia que muda completamente a forma como software é distribuído.

E isso afeta diretamente quem trabalha com COBOL.

Mesmo que seu programa execute dentro de um IBM Z rodando z/OS.

Hoje praticamente toda arquitetura moderna possui alguma camada containerizada.

Seu COBOL conversa com APIs.

As APIs estão em containers.

Os testes automatizados rodam em containers.

O banco PostgreSQL usado para homologação roda em container.

O Redis roda em container.

O RabbitMQ roda em container.

O Kafka roda em container.

Até o VS Code que conversa com seu Zowe pode estar executando dentro de um Dev Container.

Ou seja...

Mesmo que você nunca instale Docker, Docker provavelmente trabalha para você todos os dias.


A analogia que todo coboleiro entende

Imagine um JOB.

Você escreve:

//STEP01 EXEC PGM=MEUPROG

Quando o operador executa o JOB, ele sabe exatamente:

  • qual programa executar

  • quais datasets utilizar

  • quais bibliotecas carregar

  • qual ambiente existe

Docker segue exatamente essa filosofia.

Em vez de dizer

"Execute o programa."

Ele diz

"Execute exatamente ESTE ambiente."

Essa pequena diferença mudou toda a indústria.


O maior problema do desenvolvimento moderno

Todo desenvolvedor já ouviu a frase:

"Na minha máquina funciona."

Essa frase custa milhões para empresas.

Porque existem diferenças entre computadores.

Imagine três desenvolvedores.

Carlos usa Ubuntu.

João usa Windows.

Maria usa Mac.

Cada um possui:

  • versões diferentes de Java

  • versões diferentes de Python

  • bibliotecas diferentes

  • PATH diferente

  • variáveis diferentes

Resultado?

O software funciona em uma máquina.

Quebra na outra.

Docker elimina esse problema.


O container é um ambiente fechado

Pense nele como um mini sistema operacional.

Dentro dele existe tudo.

Aplicação

↓

Bibliotecas

↓

Dependências

↓

Sistema

↓

Configuração

↓

Rede

Tudo viaja junto.

Assim como um LOAD MODULE leva seu código compilado.


O paralelo perfeito com Mainframe

No z/OS nós temos:

STEPLIB

LINKLIST

LPALIB

PROCLIB

PARMLIB

SDFHLOAD

SCEERUN

DBRMLIB

Cada biblioteca influencia a execução.

Docker faz exatamente isso.

Só que empacotado.


O Dockerfile é praticamente um PROC

Olhe este Dockerfile.

FROM ubuntu

RUN apt update

RUN apt install python3

COPY app.py .

CMD python3 app.py

Ele descreve todo ambiente.

Assim como uma PROC descreve um JOB.


Um PROC

//COBPROC PROC

//COB EXEC PGM=IGYCRCTL

//LKED EXEC PGM=IEWL

// PEND

Os dois descrevem como construir um ambiente.

Só muda a linguagem.


O Build

Quando fazemos

docker build

Estamos criando uma imagem.

É semelhante a:

Compilar COBOL

↓

Link-edit

↓

Gerar Load Module

Não executa ainda.

Apenas cria.


A imagem

A imagem é imutável.

Ela funciona como um LOAD MODULE.

Você gera uma vez.

Executa milhares.


O Container

Quando fazemos

docker run

É semelhante ao operador executando

SDSF

COMMAND

S

START JOB

A imagem ganha vida.


O Registry

Docker possui repositórios.

Semelhantes a uma gigantesca LOADLIB.

Docker Hub

GitHub Registry

Azure Registry

IBM Registry

O COBOL moderno conversa com containers

Imagine seu programa.

COBOL

↓

CICS

↓

REST API

↓

Docker

↓

Java

↓

Banco

Você nem percebe.

Mas boa parte da aplicação vive dentro de containers.


O Docker não substitui Mainframe

Esse é outro mito.

Ele complementa.

Mainframe continua fazendo aquilo que faz melhor.

Processamento crítico.

Docker faz aquilo que faz melhor.

Microsserviços.

APIs.

Ferramentas.

Integração.


Um exemplo real

Seu COBOL chama:

CLIENTE

↓

API PIX

↓

Container

↓

Spring Boot

↓

Banco PostgreSQL

O COBOL nunca sabe.

Só vê uma URL.


Onde um coboleiro usa Docker?

Muito mais do que imagina.

Exemplos.

PostgreSQL

docker run postgres

MongoDB

docker run mongo

Redis

docker run redis

Kafka

docker run kafka

RabbitMQ

docker run rabbitmq

Jenkins

docker run jenkins

SonarQube

docker run sonarqube

GitLab Runner

Container.


Zowe

Pode rodar em container.


IBM Explorer

Ambientes de teste podem ser containerizados.


Easter Egg número 1

Docker também possui "camadas".

Assim como o Mainframe possui bibliotecas em cascata.

Quando duas imagens compartilham partes iguais...

Docker reutiliza.

É quase um:

LPA

Shared Library

LINKLIST

Easter Egg número 2

Imagem Docker.

Read Only

Load Module.

Read Only

Curiosa coincidência.


Easter Egg número 3

Containers morrem.

Dados persistem.

Parece familiar?

Datasets.

Você apaga um JOB.

Mas o VSAM continua.


Volumes

Volumes são onde vivem os dados.

Sem volume.

Tudo desaparece.

Assim como arquivos temporários em SYSDA.


Cuidado

Padawans fazem isto:

docker run mysql

Depois:

docker rm

Adeus banco.

Tudo perdido.


O equivalente ao DELETE do catálogo.

Sem backup.

Sem retorno.


Docker Compose

Imagine um sistema inteiro.

Você precisa:

  • PostgreSQL

  • Redis

  • RabbitMQ

  • API

  • Front-end

Seria trabalhoso iniciar tudo manualmente.

Então existe:

docker-compose.yml

É praticamente um scheduler.


Você escreve.

Suba tudo.

E ele sobe.

Na ordem correta.


Parece JCL?

Muito.

STEP01

↓

STEP02

↓

STEP03

Docker Desktop

É o ISPF do Docker.

Quem conhece ISPF aprende Docker Desktop rapidamente.


Como um coboleiro evolui?

Nível 1

Aprender comandos.

docker ps

docker images

docker stop

docker rm

docker logs

Nível 2

Dockerfile.


Nível 3

Volumes.


Nível 4

Networks.


Nível 5

Compose.


Nível 6

CI/CD.


Nível 7

Kubernetes.


O comando que todo mundo esquece

docker logs

É praticamente:

SDSF

OUTPUT

SYSOUT

Sem logs.

Não existe diagnóstico.


Outro comando essencial

docker exec -it container bash

É equivalente a:

TSO

LOGON

Você entra dentro da máquina.


Redes Docker

Containers conversam por rede virtual.

Pense em CICS falando com DB2.

Tudo isolado.


Variáveis de ambiente

No Mainframe temos:

PARMLIB.

PARM.

SYSIN.

No Docker temos:

ENV

Environment Variables

Mesmo conceito.


Segurança

Nunca coloque senhas.

Errado.

ENV PASSWORD=123456

Correto.

Secrets.

Vault.

Azure Key Vault.

Hashicorp Vault.


Um perigo enorme

Container não é Máquina Virtual.

Muitos iniciantes confundem.

Container compartilha o Kernel.

Máquina Virtual possui Kernel próprio.

São tecnologias diferentes.


Outro erro comum

Criar imagens gigantes.

Imagem de:

12 GB

Quando poderia ter:

300 MB

Outro erro

Executar como root.

Jamais.

Sempre criar usuário.


Outro erro

Copiar arquivos desnecessários.

Use:

.dockerignore

Assim como usamos:

EXCLUDE

Em utilitários.


Docker e DevOps

Hoje praticamente toda pipeline faz:

Git

↓

Build

↓

Testes

↓

Docker

↓

Deploy

Mesmo sistemas Mainframe participam desse fluxo.


Onde entra o COBOL?

Exemplo.

GitHub

↓

Compila COBOL

↓

Executa testes

↓

Publica API

↓

Container

↓

OpenShift

↓

Consome CICS

O COBOL continua sendo protagonista.

Docker apenas ajuda.


Curiosidade

IBM possui imagens oficiais.

Ferramentas IBM também utilizam containers.

OpenShift é baseado em Kubernetes.

Kubernetes nasceu para gerenciar milhares de containers.


Easter Egg número 4

No Mainframe aprendemos cedo:

Nunca altere produção diretamente.

Docker leva isso ao extremo.

Você nunca altera um container.

Você destrói.

Cria outro.

É uma filosofia muito parecida com a imutabilidade dos artefatos promovida por pipelines modernos.


Easter Egg número 5

O famoso:

docker kill

Lembra muito um operador fazendo:

CANCEL JOB

A diferença é que o impacto pode ser ainda maior.

Se aquele container fazia parte de um cluster, outro poderá assumir automaticamente.

É como um Sysplex distribuindo a carga para outro membro.


Docker e IBM Z: um casamento cada vez mais comum

Muitos padawans imaginam que Docker existe apenas em servidores x86. Na prática, o ecossistema IBM Z também abraçou containers. É comum encontrar ambientes onde aplicações Java, Node.js, Python ou Go executam em Linux on IBM Z ou LinuxONE dentro de containers, enquanto os sistemas críticos permanecem em z/OS.

Um cenário típico é:

Internet
     │
API Gateway
     │
Container Spring Boot
     │
IBM MQ
     │
CICS
     │
Programa COBOL
     │
DB2

Perceba que o COBOL continua onde sempre esteve: no coração da transação. O Docker atua nas camadas de integração, autenticação, observabilidade e exposição de serviços.


Como identificar problemas em Docker com a mentalidade de um operador de Mainframe

Um bom programador COBOL costuma pensar de forma estruturada. Essa habilidade ajuda muito ao trabalhar com containers. Ao investigar um problema, faça perguntas parecidas com as que faria diante de um ABEND:

  • O container iniciou corretamente?

  • O processo principal terminou inesperadamente?

  • Os logs mostram mensagens de erro?

  • Há portas em conflito?

  • O volume de dados foi montado?

  • A variável de ambiente obrigatória foi definida?

  • A imagem está na versão correta?

  • Existe comunicação entre os containers?

  • O serviço externo está disponível?

Essa abordagem sistemática reduz drasticamente o tempo de diagnóstico.


Conclusão: Docker é mais familiar ao coboleiro do que parece

Quando um padawan olha para Docker pela primeira vez, tudo parece novo: imagens, containers, volumes, registries, compose, redes. Porém, um veterano de Mainframe rapidamente percebe padrões conhecidos.

Você já entende de ambientes controlados.

Já entende de bibliotecas.

Já entende de versões.

Já entende de promoção entre desenvolvimento, homologação e produção.

Já entende da importância dos logs.

Já entende que uma alteração aparentemente pequena pode causar um grande incidente.

Docker apenas utiliza outra linguagem para resolver muitos dos mesmos problemas que o Mainframe resolveu décadas atrás.

No fim das contas, um bom programador COBOL não precisa abandonar sua experiência para aprender Docker. Pelo contrário: sua disciplina, seu cuidado com mudanças, sua visão de estabilidade e sua capacidade de diagnosticar problemas são exatamente as qualidades que diferenciam um excelente profissional de containers.

E fica um último pensamento para os Padawans do Bellacosa Mainframe:

"Quem domina JCL entende que infraestrutura também é código. Docker apenas tornou essa ideia popular para o restante da indústria."

A tecnologia muda, as ferramentas evoluem, mas os princípios continuam os mesmos: ambientes reproduzíveis, processos previsíveis, mudanças controladas e software confiável. E nisso, poucos profissionais têm tanto a ensinar quanto um bom coboleiro de Mainframe.

Docker na Stack Mainframe

Não houve um único ano, um release ou um anúncio dizendo "Docker agora suporta COBOL Mainframe". O que aconteceu foi uma convergência gradual de tecnologias.

Esta é uma linha do tempo que ajuda a entender essa evolução:

AnoMarcoImpacto para Mainframe
2013Docker é lançado pela dotCloudNasce o conceito moderno de containers Linux.
2014Docker 1.0Empresas começam a adotar containers em produção.
2015Kubernetes ganha forçaOrquestração de milhares de containers.
2016-2017IBM passa a investir fortemente em containers e microserviçosIntegrações com IBM Z tornam-se prioridade.
2017IBM adquire a Red Hat? (não, o anúncio foi em 2018 e conclusão em 2019)Estratégia híbrida começa a se consolidar.
2018IBM anuncia a aquisição da Red HatOpenShift torna-se a principal plataforma de containers da IBM.
2019Conclusão da aquisição da Red HatOpenShift passa a ser peça central da estratégia IBM Hybrid Cloud.
2020+OpenShift chega amplamente ao IBM Z e LinuxONEContainers tornam-se parte da arquitetura corporativa junto ao z/OS.
2021-2024APIs, z/OS Connect, Ansible, Zowe e OpenShift amadurecemCOBOL passa a conviver naturalmente com aplicações containerizadas.

O ponto importante

Docker não executa programas COBOL do z/OS.

Quem continua executando o COBOL é:

  • z/OS

  • CICS

  • Batch

  • IMS

  • Db2

  • JCL

O Docker normalmente executa o que está ao redor do COBOL:

  • APIs REST

  • Java

  • Spring Boot

  • Node.js

  • Python

  • NGINX

  • Redis

  • PostgreSQL

  • Kafka

  • RabbitMQ

  • Ferramentas DevOps

O cenário típico hoje é:

Internet
      │
OpenShift / Docker
      │
API REST
      │
z/OS Connect
      │
CICS
      │
Programa COBOL
      │
DB2

O programa COBOL continua exatamente onde sempre esteve.

O Docker apenas fornece uma maneira moderna de consumir seus serviços.

Quando o COBOL "abraçou" Docker?

Se tivermos que escolher um período, eu diria que foi entre 2018 e 2022.

Isso ocorreu porque várias tecnologias amadureceram ao mesmo tempo:

  • IBM OpenShift no IBM Z

  • Linux on IBM Z

  • z/OS Connect Enterprise Edition

  • Zowe

  • Git e pipelines DevOps para Mainframe

  • APIs REST consumindo programas COBOL

  • Arquiteturas híbridas (Hybrid Cloud)

Foi nessa época que deixou de ser incomum ver um sistema como este:

Docker
      │
Spring Boot
      │
REST
      │
z/OS Connect EE
      │
CICS
      │
COBOL
      │
DB2

Hoje essa arquitetura é bastante comum em bancos, seguradoras, telecomunicações e grandes empresas.

Existe Docker rodando diretamente no z/OS?

Não.

O Docker utiliza recursos do kernel Linux (namespaces, cgroups etc.), portanto não roda nativamente sobre o kernel do z/OS.

No ecossistema IBM Z, o mais comum é:

  • Docker rodando em Linux on IBM Z ou LinuxONE.

  • OpenShift gerenciando containers nesses ambientes Linux.

  • z/OS executando COBOL, CICS, IMS, Db2 e batch.

  • Comunicação entre ambos via REST, IBM MQ, gRPC, eventos ou APIs.

Uma curiosidade para o coboleiro

O Docker nunca substituiu o Mainframe. Na verdade, ele acabou reforçando seu papel.

Quando uma empresa cria dezenas ou centenas de microsserviços em containers, muitos deles precisam consultar dados críticos. Em vez de migrar décadas de regras de negócio, eles chamam as aplicações COBOL existentes por meio de APIs. Assim, o COBOL permanece como o sistema de registro (System of Record), enquanto os containers atuam como camada de apresentação, integração e inovação.

É por isso que, atualmente, um programador COBOL moderno não precisa aprender Docker para "rodar COBOL", mas sim para compreender o ecossistema onde seu código vive e como ele se integra ao restante da arquitetura corporativa. Esse conhecimento facilita a comunicação com equipes de DevOps, SRE, desenvolvimento Java, APIs e nuvem híbrida, tornando o profissional de Mainframe ainda mais valioso.