Fala galerinha, beleza? Bom, esse é um post bem rápido de um problema que há tempos estava tendo com Docker no meu Mac e que FINALMENTE consegui resolver depois de uma larga pesquisa nessa internet de meu Deus.
Problema
Como muitos aqui já sabe, eu sou desenvolvedor web e trabalho principalmente com projetos PHP e seus mais conhecidos frameworks. Há tempos que estava tendo sérios problemas de lentidão tanto ao subir os container como também abrir os projetos no navegador. Amigos que usavam no usavam no Linux e Windows disseram que não tinha esse gargalo e sim, eu sei que no Linux a parada roda mais lisa porque o Docker roda quase que nativo lá.
Solução
Dando uma navegada na interwebs eu via que muita gente estava com esse problema e todos, quase que de forma unânime, indicaram usar um sistema de arquivos chamado NFS (Network File System) ao mapear seus volumes. O “sistema de arquivos padrão” que o Docker usa é bastante lento no ambiente Mac, por esse motivo, muitos dev’s usado o NFS.
Quer saber como configurar? Então, vem comigo!
Configurando o serviço nfsd
O primeiro passo é saber se o serviço nfsd
está habilitado e se está sendo executado no seu Mac. Para isso, abra seu terminal e digite:
$ sudo nfsd status nfsd service is enabled nfsd is running (pid 60994, 8 threads)
Se seu serviço não tiver habilitado, basta executar o comando:
$ sudo nfsd enable
Antes de dá start no serviço nfsd
é preciso primeiro configurar o arquivo /etc/exports
. Caso ele não exista, que foi o meu caso, crie-o e ponha:
$ sudo nano /etc/exports # For MacOS Catalina Users /System/Volumes/Data -alldirs -mapall=501:20 localhost # For Others MacOS Versions /Users -alldirs -mapall=501:20 localhost
De forma resumida, esse comando permite o compartilhamento de qualquer diretório de Home. É bem provável que você tenha que dá permissão para salvar esse arquivo.
Feito isso basta iniciar o serviço nfsd
, como mostrado abaixo:
$ sudo nfsd start Starting the nfsd service
Agora vamos adicionar uma instrução no /etc/nfs.conf
. Abra-o e adicione isso:
$ sudo nano /etc/nfs.conf nfs.server.mount.require_resv_port = 0
Isso é para informar o daemon NFS para permitir conexões de qualquer porta. Isso é necessário pois as conexões NFS do Docker podem ser bloqueadas.
Vamos agora ao docker-compose.yml
Agora vamos configurar o seu docker-compose.yml
para que os volumes sejam feitos via NFS. Segue abaixo um simples exemplo que pode ser facilmente adaptado para o projeto em que você está trabalhando:
version: "3" services: php: image: php container_name: "your-container-name" volumes: - nfsmount:/var/www/html volumes: nfsmount: driver: local driver_opts: type: nfs o: addr=host.docker.internal,rw,nolock,hard,nointr,nfsvers=3 device: ":/System/Volumes/Data/${PWD}"
Em destaque você ver temos um volume chamado nfsmount
, que pode ser chamado de qualquer coisa que você quiser, que possui algumas parametrizações extras para o seu volume.
Feito isso, você já pode subir seus containers e ver a enorme diferença que esse vai trazer para você.
Espero que esse artifício te ajude como me ajudou. E caso eu falei alguma besteira ou você tem mais dicas dá uma melhorada no Docker em ambientes MacOS, por favor, não deixe de por nos comentários.
Forte Abraço.
Configurei como o Kilderson explicou no post e ficou bala!
Eita, massa hein ?! O meu docker aqui também ficou bem mais rápido. Espero ter ajudado =)
Ótimo artigo! Parabéns. No meu mac (Mojave) fica dando erro de “permission denied”
Alguma ideia?
Consegui. Eu estava passando o caminho errado!
Show, que bom o post te ajudou como me ajudou demais! Ainda bem que você corrigiu também o seu path.
Obrigado pelo comentário! =D
Eu fiquei com uma duvida e o que acontece quando esse docker-compose modificado é executado no linux?
Fala Smith, beleza?! Então, o que a gente fez lá na empresa foi ter um arquivo docker-compose.yml colocando os volumes como é colocado normalmente (sem o NFS) e criar um segundo arquivo chamado docker-compose.mac.yml (pode ser qualquer nome) só com as instruções necessárias do NFS e os serviços que são utilizados.
Quando fur subir no linux ou Windows, basta executar o “docker-compose up -d” normalmente e quando tiver usando MacOS, basta usar o recurso de override do docker-compose:
docker-compose -f docker-compose.yml -f docker-compose.macos.yml up -d
Mais detalhes, pode ser aqui nesse link:
https://docs.docker.com/compose/extends/#multiple-compose-files
Kilderson peguei um problema de permissão o que pode ser?
Kilderson muito obrigado pelas dicas, o post está excelente também, só que no meu container não está conseguindo escrever arquivos de log nem realizar migrações de banco de dados, pode me ajudar?
Valeu Kilderson pelo help era questão da um volume que precisava ser adicionado! 🙂
Show de bola Smith, espero ter te ajudado mano =)
Muito obrigado amigo, ajudou muito! Gastava pelo menos 30 minutos no dia esperando carregamento das páginas rsrs.
Configurei na minha máquina e ocorreu tudo certo sem nenhum problema, mas quando fui configurar em outro mac tive problema de permissão de escrita (upload de arquivo, criar migration usando artisan do laravel e etc).
O problema ocorreu porque o mac tinha 2 usuários e o que estava sendo usado era o segundo que foi criado, ao criar o arquivo, era criado pelo primeiro usuário do mac, dando erro de permissão.
Pra quem tiver o mesmo problema, a solução é:
$ id -u
502 // vai retornar o id do usuário, no meu caso retornou 502 e não 501.
Se o número for diferente de 501 como está no artigo basta editar o exports alterando de 501 para o número retornado.
Pode ser que alguém tenha problema com o id do grupo também, o comando para ver qual é o id do grupo:
$ id -g
Se for diferente de 20 é só alterar no exports.
Feito isso, a escrita vai passar a ser feita pelo usuário certo. Abraços!
Massa Patrick! Muito obrigado por adicionar essas dicas. Você me permite complementar nesse post isso?
Com certeza Kilderson, fico feliz em poder contribuir!
Muito bom artigo. Só uma duvida, como fazer nos casos em que estão assim os volumes:
volumes:
– ./:/var/www:cached
Obrigado pelo feedback Matheus. Então eu acho que segue a mesma ideia, ficaria: nfsmount:/var/www:cached. Já tentou assim?
Deu esse problem!
Cannot create container for service app: failed to mount local volume: mount
Você colocou certinho como coloquei no post? Manda um gist da vida ai pra gente ver =)
Opa bom dia obrigado por responder. Escrevi como está no post. Rodou mais continua lento!
https://gist.github.com/elbersongames/cb71a4cb0d76266ca38200ad227a2857