Estou avaliando uma série de ferramentas para substituir o Docker Desktop. A ideia é ficar no máximo possível com ferramentas livres, que não é o caso desta específica do Docker. Além disso, como o Docker Desktop agora é pago para quem trabalha em empresas maiores, corre-se o risco de a ferramenta não estar licenciada.

Encontrei há um tempo o Rancher Desktop,  que não funcionava muito bem, mas recentemente os problemas que ele apresentava foram resolvidos. Porém, infelizmente, ele não oferece (pelo menos por enquanto) suporte a contêineres Windows, então fui atrás de resolver isso.

O processo para rodar contêineres Windows é muito fácil, você precisa primeiro habilitar essa funcionalidade. Faça isso em um terminal administrativo usando PowerShell:

Enable-WindowsOptionalFeature -Online -FeatureName Containers

Você provavelmente vai precisar reiniciar. Se ele reclamar, você pode precisar primeiro habilitar a funcionalidade de Hyper-V:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

Então instale o Docker. Estou usando o Scoop, porque ele já traz também o dockerd.exe, mas você pode usar outro método se preferir, baixando esses executáveis diretamente no site do Docker. O Rancher Desktop trará o docker.exe, mas não o dockerd.exe, então não é suficiente para este passo, mesmo que você o tenha instalado.

Lembrando que o Scoop é usado fora de um terminal administrativo.

scoop install docker # pra ganhar o docker.exe e o dockerd.exe

Então, em um terminal administrativo, instale e configure o serviço do Docker:

# cria o Serviço NT Docker
dockerd --register-service
# configura o serviço para iniciar manualmente assim ele não inicia com o Windows
Set-Service docker -StartupType Manual
# inicia o serviço
Start-Service docker
# Checa se o pipe foi criado
Get-Item //./pipe/docker_engine
# Verifica se o Docker está funcionando no terminal de admin
docker info

Até esse momento você precisou de um terminal administrativo para usar o Docker, mas agora vamos permitir que seu usuário faça o acesso por um terminal normal. O Docker usa o named pipe //./pipe/docker_engine para se comunicar. Alguns tutoriais indicam mexer nas ACLs deste pipe, mas isso não é o ideal. A melhor opção é alterar o arquivo de configuração do Docker e deixá-lo controlar o acesso, assim (de novo no terminal administrativo):

# Configura o Docker para funcionar com o usuário atual sem precisar de um terminal admin
mkdir $env:ProgramData\docker\config
@{ group = "docker-users" } | ConvertTo-Json | Out-File $env:ProgramData\docker\config\daemon.json
# Coloca usuário atual no grupo `docker-users`, se ele já não existe e já está lá
$dockerUsers = Get-LocalGroup docker-users -ErrorAction SilentlyContinue
if (!($dockerUsers)) {
    dockerUsers = New-LocalGroup docker-users
    Add-LocalGroupMember -Group $dockerUsers -Member $(whoami)
} else {
    if (!(Get-LocalGroupMember $dockerUsers | ? { $_.Name -eq $(whoami) })) {
        Add-LocalGroupMember -Group $dockerUsers -Member $(whoami)
    }
}
# Reinicia o serviço do Docker
Stop-Service docker
Start-Service docker

E a partir daí você já pode usar o Docker direto pelo terminal não-administrativo:

docker info
docker ps
docker build ...

Lembrando que você não vai poder usar o Rancher (ou qualquer outro runtime de contêineres) enquanto o serviço do Docker estiver rodando. Para usá-lo, pare o serviço primeiro:

Stop-Service docker

E, quando for usar contêineres Windows, primeiro inicie o serviço:

Start-Service docker

É isso. Simples, né?

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.