Executando verificação de segurança...
9

Docker em MacOS (Intel ou M1) - alternativa ao Docker Desktop

Docker em MacOS

Desde Fevereiro de 2022, a popular ferramenta para rodar Docker em MacOS e Windows - Docker Desktop - passou a ter um plano pago. A ferramenta continua gratuita para estudantes, projetos open-source sem fins lucrativos ou empresas pequenas (<250 colaboradores e <$10M usd).

Mas além da motivação de usar um produto gratuito, existe quem tenha motivação de não usar ferramentas proprietárias e apoiar soluções open source. Assim, venho apresentar algumas soluções.

TDLR

Podem usar o colima.
É super simples e funciona em processadores Intel e M1, além de suportar kubernetes.

O que faz o Docker Desktop

Quando falamos de rodar containers Docker em MacOS ou Windows, normalmente falamos de rodar containers Linux nestes Sistemas. *
Por trás dos panos, o Docker Desktop é responsável por rodar um ambiente de virtualização Linux, além de criar todas as interfaces (de forma bastante bem feita) entre o Host OS e a virtualização em Linux.
Esta integração garante que podemos simplesmente rodar um servidor HTTP em docker e conseguir acessar ele através do meu navegador.

* Existem containers Docker em Windows, sem virtualização Linux, mas está fora do escopo deste artigo

Alternativas

É necessário uma alternativa que consiga:

  • gerenciar uma virtualização Linux
  • instalar e configurar o servidor Docker dentro da VM
  • disponibilizar uma conexão para o servidor Docker (dentro da VM)
  • gerenciar a ponte entre a rede do Host OS e a virtualização (port forwarding)
  • volumes (mount entre o Host e a VM)
  • suporte a docker-compose

Colima

https://github.com/abiosoft/colima

Usa lima-vm para gerenciar uma virtualização (usando QEMU).

  • Como instalar? brew install colima docker
  • Como iniciar? colima start
  • Features
    • processadores Intel e M1
    • interface CLI simples
    • suporta Docker and Containerd
    • suporta Port Forwarding
    • Volumes
    • Kubernetes
    • docker-compose funciona sem problemas

Lima

https://github.com/lima-vm/lima

Serve para rodar máquinas virtuais Linux (usando QEMU), com suporte automático para file sharing e port forwarding (semelhante a WSL2), e containerd.
Tem vários templates de VMs, incluindo Docker. Ver mais na página de exemplos no Github.

  • Como instalar? brew install lima docker
  • Como configurar? copiar e costumizar o arquivo docker.yaml
  • Como iniciar? lima start docker.yaml
  • Features
    • processadores Intel e M1
    • interface CLI simples
    • suporta Docker and Containerd
    • suporta Port Forwarding
    • Volumes (acessa caminhos no host, desde que devidamente autorizados no docker.yaml)
    • Kubernetes

Nota: pessoalmente, tive alguns problemas de instabilidade com Lima, observando a VM em estado irrecuperável, o que me fazia ter que recriar toda a VM, incluindo baixar a imagem da VM e todas as imagens Docker perdidas.

Rancher Desktop

https://rancherdesktop.io/

É um produto do Rancher (orquestrador de containers) orientado para rodar Docker e Kubernetes localmente. É muito semelhante ao Docker Desktop, mas encontrei várias limitações que me obrigaram a desistir do seu uso (mas pode não acontecer com todos).

  • Como instalar? Baixar o instalador e seguir o processo normal
  • Como iniciar? Iniciar como uma app do MacOS (igual ao Docker Desktop)
  • Features
    • processadores Intel e M1
    • interface gráfica
    • suporta Port Forwarding
    • otimizado para rodar Kubernetes

Podman

https://podman.io/getting-started/

Apesar de eu não ter experiência direta com Podman, achei digno de menção por ter um um paradigma diferente, pois não segue o padrão cliente-servidor.
O Podman gerencia diretamente os containers, sem necessidade de ter um servidor rodando em background. No entando, ainda é necessário criar a VM Linux, suportado pelo QEMU.

  • Como instalar? brew install podman
  • Como iniciar? podman machine init && podman machine start
  • Features
    • processadores Intel e M1
    • interface CLI simples
    • roda containers diretamente, sem docker nem servidor docker
    • o CLI do podman é muito semelhante ao docker, permitindo uma transição suave
    • suporta docker-compose de forma não trivial (fora do âmbito deste artigo)

Infelizmente não tenho experiência direta com Podman, então não posso assegurar as compatibilidades do mesmo.

Conclusão

Provavelmente existem mais alternativas, mas estas foram as minhas experiências pessoais.
Atualmente estou usando o colima sem qualquer problema, então é a minha recomendação pessoal.
Alguns dos problemas que tive no passado podem já ter sido corrigidas em versões mais recentes dos softwares.

Carregando publicação patrocinada...
2

Pergunta de leigo: rodando Docker no MacOS, é muito mais pesado pq ele não consegue rodar nativamente, tendo que virtualizar um Linux antes de rodar a máquina virtual, é isso? Na prática o hardware Mac, virtualiza um Linux, que virtualiza outro Linux, ou estou falando besteira? As opções que você sugeriu trabalham de forma diferente?

4

Obrigado pela pergunta @fabioaguiar

O container docker em si não é uma virtualização, é apenas um processo rodando em Linux (essa é a magia que deu toda a popularidade aos containers)
Então existe o hardware Mac que roda uma virtualização de Linux que roda um container.

Em teoria sim, é menos performático rodar rodar Docker em MacOS, comparado com Linux.
Mas também vale lembrar que o objetivo de rodar docker em Mac não é a performance, e sim a comodidade de rodar o "mesmo ambiente" de produção na minha máquina de desenvolvimento.

No entanto na prática não noto uma queda de performance nas aplicações que eu rodo.
Contra-intuitivamente, até consigo facilmente encontrar exemplos de software que roda melhor em containers do que rodando no Mac. Isso pode ter várias causas, mas é uma verdade que já me aconteceu algumas vezes.

A diferença entre as soluções que apresentei e o Docker Desktop é que o último usa Hyperkit em vez de QEMU

-2
1

Belo artigo, fiquei com uma unica duvida, procurei bem e ainda não achei, mas como eu rodo o docker compose com o Colina?

Parabens pelo artigo man, muito bom!

2

O docker-compose é ele mesmo outro projeto open-source.
Então para usar com colima, basta apenas ter o docker-compose instalado.
brew install docker-compose

Existe outra alternativa (mas que eu não uso, então não posso atestar a eficácia dele) que é usar o CLI docker com o argumento compose (usar docker compose em vez de usar docker-compose). Está documentado na página oficial.

O cliente docker (ou o docker-compose) fala com o servidor docker através de um unix socket. A configuração pode ser verificada com docker context list, que revela um unix:///Users/myuser/.colima/default/docker.sock.
O docker-compose deverá saber automaticamente como falar com o server usando o context certo.
O Colima configura automaticamente o docker context para que as coisas funcionem de forma simples e fácil, por isso a minha recomendação.