Esse é o primeiro post de uma série de posts sobre Troubleshoots de alguns problemas que podemos nos deparar no cotidiano e que quebramos a cabeça para encontrar a solução no StackOverflow, nos issues do GitHub ou em outros foruns.
Neste post, o Troubleshoot problema no Docker (Windows 10 com Hyper-v), gerado ao tentar instalar qualquer imagem. O erro foi o seguinte:
An attempt was made to access a socket in a way forbidden by its access permissions.
No meu caso, o erro ocorreu ao instalar e subir a imagem do Zookeeper, mas pela pesquisa que fiz, é possível resolver esse erro em outros imagens que apresentarem o mesmo problema.
Problema
Conforme havia dito no sumário acima, o problema ocorreu quando eu estava instalando a imagem do Zookeeper. Infelizmente, não tirei um print para mostrar à vocês… mas, a mensagem do erro foi a seguinte:
Error starting userland proxy: listen tcp 0.0.0.0:2181: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
Na pesquisa que fiz, esse problema é comum. Por mais que você tenha todas as configurações corretas na sua máquina e que você já tenha subido a imagem antes, o problema acontece.
De forma simples e sem muito detalhe, por algum motivo o Hyper-v bloqueia a porta utilizada por qualquer container do Docker, no meu caso foi o Zookeeper (porta 2181). Então, a resolução é reservar essa porta.
Aparentemente, o problema começou a ocorrer nas últimas atualizações do Docker. Mas, conheço outras pessoas que atualizaram e não tiveram esse problema. De qualquer forma, a resolução evita esse problema novamente.
Mais detalhes: Unable to bind ports: Docker-for-Windows & Hyper-V excluding but not using important port ranges #3171
Solução
A resolução é simples é apenas reservar a porta para que não ocorra novamente esse problema. Para isso, vamos reiniciar o Hyper-v.
Vamos seguir os passos a abaixo. E para todos eles, você vai deve executar os comandos no CMD em modo Administrativo executando na pasta System32
( C:\WINDOWS\System32) :
1. Desativando Hyper-v: execute no CMD aberto, a linha comando abaixo
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
Durante o processo para desativar o Hyper-v, será necessário reiniciar a sua máquina.
Depois de reinicia-la, o Docker vai mostrar a mensagem de erro abaixo, porque ele não conseguiu ser iniciado (o Hyper-v está desativado), mas que ele pode tentar ativa-lo novamente.
Clique em Cancel, para cancelar essa ação do Docker. E vai aparecer a mensagem abaixo:
Clique em OK. Porque, temos que fazer o passo seguinte para ativar o Hyper-v novamente.
2. Reservando a porta para que o Hyper-v não reserve-a novamente: execute o comando abaixo:
netsh int ipv4 add excludedportrange protocol=tcp startport=2181 numberofports=1
Ao executa-lo, vai ter essa mensagem (Ok .):
3. Reativar o Hyper-v: execute a linha de comando abaixo (durante o processo, vai ser necessário reiniciar a sua máquina):
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
Vai mostrar a mensagem que a operação foi completada com sucesso e vai pedir para reiniciar a sua máquina (imagem abaixo). Fez tudo que estava aberto e digite Y
, para reiniciar imediatamente.
Depois de reiniciar a máquina, o Docker deve subir normalmente. Pronto!
É isso ai pessoal! Rápido e objetivo!