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
Entrei no tealok e, pelo que vi, ele não está num estado que pareça poder ser uma alternativa.
Teria sido muito bom se também tivessem removido o runtime.
Ainda acho necessário usar
docker-composepara 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
Acho que tentar usar
docker composepara a mesma finalidade do texto já é, desde o início, uma abordagem equivocada.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 :)
Comentários do Hacker News
Existe uma solução simples para os problemas de mapeamento de portas e backup de volumes de dados
docker-composeseparado para o ambiente de desenvolvimento, definindo configurações diferentes para cada ambienteComo alguém que faz self-hosting em um servidor pessoal usando Docker, avalia positivamente a flexibilidade das configurações do Docker
macvlanpara atribuir um IP e um endereço MAC exclusivos a cada contêinerO
docker-composeé usado principalmente para desenvolvimento ou uso pessoal, e a V2, diferente da V1, é um plugin integrado ao DockerEm ambiente de produção, é melhor usar Kubernetes, enquanto o
docker-composeé mais adequado para desenvolvimento localO
docker-composeé um produto para self-hosting de pequeno porte, voltado para pessoas sem formação técnicaEscrever 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.shpara tornar um cluster Kubernetes tão fácil de usar quanto o HerokuÉ interessante que a Tealok esteja desenvolvendo uma alternativa ao
docker-composeHá quem considere
docker-compose, Kubernetes e Helm camadas de abstração erradasHá confusão em relação à afirmação de que o
docker-composeé a camada de abstração errada