3 pontos por GN⁺ 2024-11-15 | 6 comentários | Compartilhar no WhatsApp
  • docker-compose é uma ferramenta para lidar com contêineres Docker que resolve problemas complexos de implantação de aplicações, mas não é suficiente para uma hospedagem própria simples voltada ao mercado de massa
  • É necessário um nível mais alto de abstração, incluindo conceitos como banco de dados SQL, cache local, armazenamento persistente, descoberta de serviços e gerenciamento de recursos

O papel do Docker

  • Docker é a ferramenta que popularizou a conteinerização, e o sistema host pode ser comparado a um navio.
  • Há o hardware, o sistema operacional e o runtime de contêineres, e os contêineres são executados dentro do runtime e se comunicam com outros serviços, como bancos de dados ou servidores web.

O papel do docker-compose

  • docker-compose é uma ferramenta para especificar grupos de contêineres que funcionam juntos, facilitando a implantação de aplicações self-hosted.
  • No entanto, ele rompe interfaces padronizadas e recria os problemas que os contêineres originalmente pretendiam resolver.
  • Exemplo: Pihole
    • Pihole é um servidor DNS e exige um arquivo docker-compose complexo.
    • É preciso configurar nomes de contêiner, imagens, portas, variáveis de ambiente, volumes, recursos extras, políticas de reinicialização e mais.
    • Essa configuração complexa precisa ser gerenciada manualmente pelo usuário, o que é uma desvantagem do Docker Compose
  • Exemplo: Jitsi Meet
    • Jitsi Meet é um software complexo que gera uma configuração docker-compose com 4 contêineres, 7 volumes, 9 portas e mais de 200 definições de ambiente.
  • Exemplo: outros aplicativos self-hosted populares também enfrentam problemas semelhantes
    • Há vários aplicativos como Authentik, Nextcloud, Immich, Jellyfin e Paperless NGX, e cada configuração docker-compose substitui de dezenas a centenas de comandos docker.
    • Cada aplicação pode incluir seu próprio banco de dados, cache e manipulador HTTP, o que leva ao uso redundante de recursos.

Problemas

  • docker-compose é flexível e detalhado demais, e opera na camada errada de abstração.
  • Cada aplicação tem seu próprio processo de tratamento HTTP, cache ou banco de dados. Fazer backup dos bancos de dados fica por conta do operador do sistema.
  • Exemplo: proxy HTTP reverso
    • Um proxy HTTP reverso é um programa que encaminha requisições HTTP recebidas para outros programas. Cada programa precisa decidir se vai incluir ou não um servidor web.
    • Inclusão de servidor web
      • Se incluir um servidor web, o programa funciona, mas apenas em portas específicas; quando há vários contêineres, é preciso remapear portas.
    • Sem inclusão de servidor web
      • Se não incluir um servidor web, não há desperdício de recursos, mas a aplicação precisa ser configurada sem interface de administração.
    • DNS
      • Interfaces web têm endereços e, se você quiser TLS, precisam de um nome. Ao executar vários serviços em um único host, é necessário rotear as requisições por nome de domínio ou caminho.
    • Portas
      • docker-compose permite expor e remapear portas, mas na prática seria necessário dar suporte a configurações de rede mais complexas.
  • Exemplo: banco de dados
    • Em bancos de dados, quando um contêiner é removido, todas as alterações em arquivos também são apagadas. Um contêiner de banco de dados precisa adicionar um volume para armazenar o conteúdo do banco.
    • N+1=2 ou mais
      • Para fazer backup do banco de dados, é necessário backup offsite. Se cada serviço empacotar seu próprio processo de servidor de banco de dados separado, isso desperdiça recursos computacionais.

Solução

  • A proposta é subir para uma camada mais alta de abstração e adicionar semântica que diferencie tipos de contêiner como banco de dados, proxy web reverso, cache e ativos web estáticos.
  • Exemplo de semântica
    • Introduzir um novo formato de configuração para especificar nome da aplicação, build, proxy reverso HTTPS e serviço de cache.
  • Solução #1
    • Cada programa solicita um proxy reverso, evitando duplicação e desperdício. O proxy reverso fornece o nome DNS e encaminha todos os caminhos para o programa.
  • Solução #1.5
    • Adicionar uma seção de banco de dados para solicitar um banco compatível com o padrão SQL, e o programa espera permissões “completas”.
  • Solução para portas
    • Cada programa pode receber seu próprio endereço IPv6 e usar números de porta padrão. Para segurança, usa-se um firewall para permitir que apenas o proxy reverso acesse as portas.

Tealok - um novo runtime de contêineres

  • Tealok é um novo runtime de contêineres que oferece um nível mais alto de abstração e interfaces padronizadas.
    • Ele lida automaticamente com certificados TLS, configuração de proxy reverso, registros DNS, gerenciamento de backups e mais.
    • Ele utiliza IPv6 para que cada contêiner tenha um endereço IP independente e possa usar números de porta padrão.
    • Desenvolvedores de aplicações podem implantar aplicativos por meio de interfaces padrão, sem configurações complexas.
  • Para operadores, oferece boas práticas consistentes, redução de desperdício de recursos e menor carga de administração.
  • Para desenvolvedores, simplifica a forma de implantação e reduz a carga de decisões.
  • Os usuários podem ter garantidos a propriedade dos dados e a independência da computação em nuvem.

6 comentários

 
luminance 2024-11-15

Entrei no tealok e, pelo que vi, ele não está num estado que pareça poder ser uma alternativa.

 
savvykang 2024-11-15

Teria sido muito bom se também tivessem removido o runtime.

 
tujuc 2024-11-15

Ainda acho necessário usar docker-compose para montar um ambiente de produção e acessá-lo, mas...

Com base na experiência em um ambiente próprio e muito específico, dizer algo como “isso está errado, então criamos uma coisa nova”... é difícil concordar.. hahaha

É um conteúdo que pode facilmente causar mal-entendido, hahaha...

Como só vi o título, minha reação foi algo como: “opa, realmente não curto usar isso em ambiente de desenvolvimento....” hahaha

 
ilbanin00 2024-11-15

Acho que tentar usar docker compose para a mesma finalidade do texto já é, desde o início, uma abordagem equivocada.

 
tujuc 2024-11-15

Concordo em parte com o que foi dito, mas não acho que a abordagem tenha sido errada.
Dentro do ambiente em que eles podiam atuar, provavelmente foi o melhor que conseguiram fazer :)

 
GN⁺ 2024-11-15
Comentários do Hacker News
  • Existe uma solução simples para os problemas de mapeamento de portas e backup de volumes de dados

    • É possível usar um arquivo docker-compose separado para o ambiente de desenvolvimento, definindo configurações diferentes para cada ambiente
    • Também é possível escrever um script Bash simples para backup e fazer upload para o S3
  • Como alguém que faz self-hosting em um servidor pessoal usando Docker, avalia positivamente a flexibilidade das configurações do Docker

    • A configuração inicial levou tempo, mas depois ficou fácil de gerenciar
    • Adicionar novos serviços quase não leva tempo, e por segurança cria um usuário não root para cada serviço
    • Usa a rede macvlan para atribuir um IP e um endereço MAC exclusivos a cada contêiner
    • Usa o Nginx Proxy Manager para gerenciar o proxy reverso, e não há problema em executar várias instâncias com banco de dados
  • O docker-compose é usado principalmente para desenvolvimento ou uso pessoal, e a V2, diferente da V1, é um plugin integrado ao Docker

  • Em ambiente de produção, é melhor usar Kubernetes, enquanto o docker-compose é mais adequado para desenvolvimento local

  • O docker-compose é um produto para self-hosting de pequeno porte, voltado para pessoas sem formação técnica

    • Há ceticismo de que migrar para TOML tornaria o self-hosting mais fácil
  • Escrever um programa para controlar o Docker é mais simples do que parece, e é possível resolver problemas com um script em Python

  • Está em desenvolvimento o uso do canine.sh para tornar um cluster Kubernetes tão fácil de usar quanto o Heroku

    • Está sendo usado em projetos pessoais, permitindo hospedar vários apps a baixo custo
  • É interessante que a Tealok esteja desenvolvendo uma alternativa ao docker-compose

  • Há quem considere docker-compose, Kubernetes e Helm camadas de abstração erradas

    • Existem muitas tentativas de desenvolver diferentes formas de executar e fazer contêineres se comunicarem
  • Há confusão em relação à afirmação de que o docker-compose é a camada de abstração errada

    • Parece haver a expectativa de uma interface de alto nível para resolver problemas específicos
    • O problema de criar instâncias duplicadas não é algo grave na maioria das aplicações
    • Forçar o design de aplicações de uma determinada maneira só funcionará bem em situações específicas