Docker lento no Mac? Use NFS!

[English Version]

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!

Vem Nenem GIF by MTV Brasil

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.

Referências