windows

Docker Desktop no Windows rodando com WSL 2

Com a inclusão de um kernel Linux completo dentro do Windows graças ao Windows Subsystem for Linux (WSL) 2, ferramentas que antes não podiam ser utilizadas no WSL por questões de compatibilidade agora podem ser executadas sem problemas. Uma dessas ferramentas muito utilizadas pelos desenvolvedores é o Docker.

No Windows 10 é possível utilizar o Docker Desktop para ter uma experiência integrada com o Docker, se aproximando muito de um sistema Linux. Entretanto, existem algumas limitações que com a atual versão que serão tratadas com a nova integração entre o Docker Desktop com o WSL 2.

Docker Desktop

O Docker Desktop é uma solução para executar containers Linux nos sistemas Windows e macOS. Ele permite que você tenha uma experiência semelhante a uma distribuição Linux, integrando o sistema de arquivos do sistemas e a rede com a máquina virtual que executa o Docker.

Essa máquina virtual é gerenciada pelo Docker Desktop através do hypervisor de virtualização do sistema, no caso do Windows o Hyper-V e do macOS o hyperkit. A execução dos containers em si acontece nessa máquina virtual, como podemos ver no diagrama abaixo:

Arquitetura do Docker Desktop

O Docker Desktop está disponível faz alguns anos, sendo a forma recomendada de executar Docker nos sistemas Windows e macOS, sendo possível com ele até executar um cluster de Kubernetes na sua máquina local.

Restrições do Docker Desktop

Apesar de ser a forma recomendada de executar o Docker nesses sistemas, um grande fator que impacta no seu uso é a performance em operações de leitura e escrita. Por executar dentro de uma máquina virtual, existe um delay para sincronizar os arquivos que estão no sistema operacional com a máquina virtual.

Isso pode ser um problema para aplicações que exigem constante leitura em disco, como é o caso de linguagens interpretadas, como o PHP. Além disso, mais especificamente com o Docker Desktop for Windows, é preciso ter o Hyper-V habilitado, que só é incluído com o Windows 10 Pro.

Então se você utiliza o Windows 10 Home ou trabalha com uma linguagem interpretada, sua experiência com o Docker no Windows pode não ser a melhor possível. Felizmente, isso vai mudar com o Docker com WSL 2.

Docker com WSL 2

O WSL 2 traz para o Windows o kernel completo do Linux através de uma máquina virtual moderna e com uma performance de disco próxima a uma máquina rodando Linux. Você pode ler mais sobre o WSL 2 nesse artigo aqui.

Com esse anúncio, o WSL 2 se tornou uma opção mais interessante para executar o Docker nos sistemas Windows. Além do ganho de performance, o WSL 2 será compatível com o Windows 10 Home, tornando o Docker Desktop disponível para um maior número de usuários.

O suporte do Docker Desktop utilizando o WSL 2 ainda está em preview, mas você já pode testá-lo se tiver executando o Windows 10 Insider. A previsão de lançamento do WSL 2 será no release 2003, e se espera que o suporte na versão estável do Docker chegue nessa época também.

O Docker Desktop irá incluir o suporte ao WSL 2 e utilizá-lo sempre que possível, mantendo o comportamento atual de usar uma máquina virtual no Hyper-V como um fallback para versões do Windows 10 que ainda não suportam WSL 2. Com isso, teremos todas as vantagens presentes no Docker Desktop, mas com uma melhor performance e suporte para o Windows 10 Home (o que hoje não é possível por requerer o Hyper-V).

Internamente, o Docker Desktop provisiona duas distribuições Linux na sua máquina, uma contendo o daemon do Docker e outra é utilizada para armazenar dados como os containers e as imagens que você utilizará. A comunicação entre essas distribuições acontece através de sockets, tanto entre o Windows como com a distribuição que você utiliza com o WSL 2 no seu dia-a-dia. Mais detalhes dessa implementação podem ser encontrados nesse post do blog de engenharia do Docker.

Arquitetura do Docker com WSL 2

Mas será que tudo isso vale a pena? Além do tempo de carregamento para iniciar o Docker Desktop, que reduziu para poucos segundos, a performance com o disco melhorou bastante. Podemos comparar esses números com o benchmark abaixo.

Teste de performance com disco

Para esse teste, vamos comparar a diferença entre o Docker Desktop utilizando Hyper-V e o WSL 2. Ambos os testes foram executados no mesmo ambiente, com a mesma máquina e quantidade de recursos disponíveis.

Para esse teste utilizei a aplicação de demonstração do Symfony junto com uma configuração de containers para Symfony mantida por um de seus core contributor. O código desses dois projetos juntos se encontra no GitHub da TreinaWeb também.

Depois de clonar o projeto e ter instalado o Docker, basta executar o comando docker-compose up para iniciar o projeto. O tempo a ser medido como comparação é para o primeiro carregamento da página inicial do projeto. Graças ao Symfony Profiler temos diretamente no navegador utilitários que auxiliam o desenvolvimento da nossa aplicação, incluindo o tempo de carregamento da mesma.

No primeiro teste, abri a página inicial do projeto utilizando o Docker Desktop com Hyper-V e essa página levou 2681ms para ser carregada:

Tempo de carregamento Docker Hyper-V

Com Docker Desktop usando WSL 2, a mesma página levou apenas 249ms!

Tempo de carregamento Docker WSL 2

Tudo isso considerando o primeiro carregamento do projeto. Foi preciso baixar todas as dependências do Composer, o container do PHP não tinha nenhum OpCache, o Symfony não chegou a fazer nenhum tipo de otimização, como compilar as views do Twig, ler as rotas da aplicação presentes nas anotations. Se considerarmos essas otimizações que farão efeito nas requests subsequentes, esse tempo cai para 20ms, comparado com um Linux rodando nativamente:

Tempo de carregamento Docker WSL 2 - carregamento subsequente

Como começar a utilizar

O Docker Desktop com WSL 2 está disponível na versão edge do Docker Desktop e pode ser baixada aqui. Por enquanto é preciso utilizar a versão insider do Windows 10 para habilitar o acesso ao WSL 2 caso você queira testar hoje mesmo.

Como vimos na comparação, o Docker Desktop com WSL 2 vai trazer um grande salto na performance para aplicações que usam muito processamento em disco. Para mim, que de vez em quando trabalho com projetos em PHP vai ser uma mão na roda! 😀

E para você? Pretende testar o Docker com WSL 2 no seu projeto? Conte pra gente o que você achou!

O que esperar do Windows Subsystem for Linux (WSL) 2

O Windows Subsystem Linux (WSL) é uma alternativa para desenvolvedores que procuram utilizar ferramentas de linha de comando compatíveis somente com Linux no Windows. Disponível para Windows 10, com ele é possível executar nativamente binários Linux na sua máquina Windows, escolhendo sua distribuição Linux preferida, como Debian, Ubuntu, Suse, até mesmo Kali Linux. Entretanto, tudo na vida pode ser aprimorado.

Vamos conhecer nesse artigo quais são as limitações do WSL e como será a evolução para o WSL 2.

Windows - Fundamentos para desenvolvedores
Curso de Windows - Fundamentos para desenvolvedores
CONHEÇA O CURSO

Limitações do WSL

O WSL permite você executar qualquer binário compilado para Linux diretamente no Windows, através de um subsistema que é responsável pro traduzir as chamadas de sistema (do inglês system calls) do Linux para uma chamada equivalente para o Windows. Você pode ver com mais detalhes como o WSL funciona e como instalá-lo na sua máquina nesse artigo.

Duas grandes limitações do WSL são a sua performance envolvendo operações de disco e a sua compatibilidade com algumas system calls específicas.

Sobre a performance em disco, atividades que envolvem operações intensivas com o disco, com comandos como git clone, npm install, apt upgrade, entre outros acabam demorando mais do que deveriam. Isso acontece pois esses dados são salvos diretamente no disco do seu sistema, e toda a operação que precisa interagir com esses arquivos precisa de alguns passos extras para a tradução dos comandos enviados pela system call do Linux até a persistência do dado em si.

Outra limitação é a compatibilidade com system calls. Embora grande parte das system calls funcione graças a implementação e melhorias adicionadas pela equipe do WSL, elas não correspondem 100% de todas as system calls disponíveis para o Linux, fazendo que aplicações específicas que façam uso de chamadas mais avançadas do Linux não seja compatíveis com o WSL. Um exemplo desse tipo de aplicação é o Docker, ferramenta presente no dia a dia de muitos desenvolvedores atualmente.

Tendo em vista esses problemas, o time responsável pelo desenvolvimento anunciou o WLS 2, com o foco em melhorar a performance em disco e fornecer total compatibilidade com system calls em Linux, não mais traduzindo essas chamadas, mas fornecendo um kernel Linux dentro do Windows!

Como funciona o WSL 2

O WSL 2 utiliza uma arquitetura completamente diferente do WSL 1. Ao invés de traduzir as system calls, ele utiliza diretamente um kernel do Linux atualizado através de uma máquina virtual. Mas não estamos tratando de uma máquina virtual qualquer!

O WSL 2 utiliza as mais recentes tecnologias de virtualização fornecidas pelo Hyper-V para fornecer uma máquina virtual leve, rápida e altamente integrada com o Windows. Com isso é possível utilizar de todas as vantagens que o WSL 1 trouxe, mas agora com total compatibilidade do sistema, até para rodar Docker.

Graças ao uso dessa máquina virtual, a performance com operações em disco aumentaram drasticamente. Antes, seus arquivos eram armazenados diretamente no disco do sistema, agora todos os arquivos utilizados pelo WSL 2 estão dentro de uma disco virtual do formato VHD, conseguindo entregar uma performance até 5 vezes mais em operações como npm install nessa nova arquitetura.

É possível notar essa diferença a partir do vídeo abaixo encontrado no anuncio do WSL 2. Ele mostra o tempo necessário para iniciar o WSL e executar um container Docker. Tudo isso leva menos que 30 segundos!

Performace do WSL 2

Uma desvantagem dessa abordagem é que não temos acesso direto aos arquivos armazenados dentro do WSL 2, mas temos outras formas de acessar esses arquivos, através da rede ou com extensões especialidades nas nossas IDE, como a extensão Remote WSL do Visual Studio Code. Assim podemos utilizar da melhoria de performance em disco trazido pelo WSL 2.

Instalação

O processo de instalação do WSL 2 é muito próximo WSL 1. No momento ele está disponível na versão Insider do Windows 10. Sua previsão de lançamento está para o release 2003 do Windows 10 que deve ser lançado por volta de Abril de 2020.

Para use o WSL 2, precisamos habilitar a feature do Windows Subsystem for Linux e também o Virtual Machine Platform. Isso pode ser feito executando os comandos abaixo a partir de uma janela do PowerShell com permissão de Administrador:

Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Feito isso, caso você já tenha uma distribuição Linux instalada a partir do Microsoft Store, você pode migrar essa distribuição para executar dentro do WSL 2 e poder assim utilizar de todas as suas melhorias. Por exemplo, se você tem o Ubuntu 18.04 instalado, execute o comando abaixo:

wsl --set-version Ubuntu-18.04 2

Altere o nome de acordo com a distribuição que você utiliza. Para descobrir quais distribuições estão instaladas, execute o comando:

wsl --list --verbose

Lista com distribuições WSL

Isso vai te mostrar quais distribuições estão instaladas, juntamente com a versão do WSL em uso.

Caso esteja utilizando uma instalação limpa do Windows, você pode definir a versão padrão do WSL para sua segunda versão:

wsl --set-default-version 2

O restante do processo é semelhante com o WSL 1. Você vai até a Microsoft Store e escolhe a distribuição desejada. Você pode acompanhar com mais detalhes no artigo sobre WSL como é feito esse processo.

O que esperar do WSL 2

Pelo motivo do WSL 2 ainda estar em desenvolvimento, podemos esperar que muitas melhorias sejam implementadas até seu lançamento final. Com a melhoria de performance e compatibilidade total com Linux, temos um ambiente de desenvolvimento com performance comparável o Linux instalado de forma nativa, o que é uma grande conquista.

Muitas pessoas se sentem mais confortáveis utilizando Windows, ou precisam desenvolver aplicações legadas que só funcionam no Windows, mas ao mesmo tempo trabalham com projetos que são hospedados em servidores Linux, requerendo que você tenha um ambiente mais próximo de produção. Para esses casos o WSL 2 é uma ótima solução.

Combinado com ferramentas como o Visual Studio Code com Remote extension podemos trabalhar com o WSL 2 como se estivéssemos trabalhando no sistema local, sem perceber que estamos utilizando uma máquina virtual por baixo.

Até mesmo o Docker para Windows irá se aproveitar do WSL 2, estando disponível na versão Edge do mesmo integração com o WSL 2, aproveitando também dos ganhos de performance com disco, um dos problemas que temos atualmente com o Docker ao usá-lo no Windows com aplicações que precisam de um grande volume de leitura e escrita em disco.

Docker - Fundamentos
Curso de Docker - Fundamentos
CONHEÇA O CURSO

O Windows Terminal

Em maio de 2019 foi anunciado o Windows Terminal, um novo terminal que promete melhorar a experiência com a interface de linha de comandos no Windows 10. Já disponível como preview no Microsoft Store, vamos conhecer as suas principais funcionalidades.

O Windows Terminal

Durante a build 2019 que aconteceu em maio, foi anunciado o Windows Terminal, um terminal para Windows 10 que tem como objetivo entregar funcionalidades tão aguardadas como suporte a abas, temas, texto unicode (incluindo emojis 😄) e mais opções de configuração.

Mesmo com melhorias que foram incluídas nos últimos releases do Windows 10, como alterar o formato do cursor, suporte a atalhos na tecla CTRL (como CTRL+C CRTL+V), inclusão de um novo motor para parsear sequências ANSI/VT (fundamental para aplicações Linux rodando com Windows Subsystem for Linux, como tmux) e até a alteração do tema padrão do Console junto com a disponibilização de uma ferramenta para alterar as cores do console, ainda assim a experiência no Windows era inferior se comparada com terminais do Linux e Mac.

Windows - Fundamentos para desenvolvedores
Curso de Windows - Fundamentos para desenvolvedores
CONHEÇA O CURSO

Incluir todas essas funcionalidades esperadas como suporte a abas, transparência, entre outros precisariam de alterações tão profundas que precisariam quebrar a retro compatibilidade do terminal atual. Como manter a compatibilidade com aplicações antigas é algo levado a sério pela Microsoft, foi decidido criar um novo projeto para isso.

Durante a build 2019 foi anunciado o Windows Terminal, um novo terminal que permite uma experiência moderna com múltiplos shells.

O que muda com o Windows Terminal

O Windows Terminal será uma aplicação opcional e terá suporte a outros shells como prompt de comando, Powershell e o WSL. Assim todos os seus scripts continuarão funcionando como antes, porém em uma interface mais moderna.

Para ficar mais claro, precisamos entender qual a diferença entre o terminal, console e shell. Embora possam parecer a mesmo coisa, cada um tem um significado diferente.

No contexto histórico, o console se refere ao hardware que era capaz de se conectar com um servidor para executar comandos. Atualmente não utilizamos um hardware específico para isso, isso acaba sendo abstraído na forma de um console virtual, que no Linux pode ser acessado pela combinação de teclas como CTRL+ALT+F1 até F4. Atualmente esse termo tem entrado em desuso, mas é comum se referir ao console como uma interface via linha de comandos.

O terminal é um software que recebe os comandos do usuário e encaminha os mesmos para o shell. Ele é responsável por ser essa ponte entre o usuário e o sistema, enviando comandos e exibindo a sua saída para o usuário. O Windows Terminal se encaixa nessa categoria, juntamente com o gnome-terminal para Linux, iTerm para Mac e também o ConEmu para Windows.

O shell por sua vez é responsável por receber os comandos enviados pelo terminal e processar esses comandos junto ao Sistema Operacional. Como exemplos podemos citar o bash, zsh, powershell e até o cmd clássico do Windows.

O Windows Terminal permite que você configure diferentes profiles diferentes para utilizar diferentes shells. Para cada um desses profiles é possível ter configurações diferentes de fonte, transparência, temas, cursores, entre outros. Ele permite também a configuração de atalhos e da sua interface para se adaptar as necessidades do usuário.

Ao instalar o Windows Terminal, ele irá identificar automaticamente quais os diferentes shells disponíveis para você utilizar. Caso você tenha o WSL ou o Powershell Core instalado, ele irá possibilitar que você o utilize sem precisar configurar tudo do zero.

Como instalar

O Windows Terminal está disponível como preview no Windows Store. Mesmo estando em preview ele está em sua quarta versão (v0.4) e já se mostra bem estável.

Para os mais apressados, também é possível clonar o código do Terminal e fazer o build diretamente da sua máquina. O código do Windows Terminal é open source, e está disponível no GitHub de forma que você possa testa-lo e contribuir com seu desenvolvimento, sugerindo melhorias, reportando bugs ou até mesmo enviando pull requests!

Estou utilizando o Windows Terminal no meu dia a dia desde o primeiro preview e é visível a sua evolução. No próximo preview por exemplo, será possível simplificar seu arquivo de configurações, alterando somente as modificações que são diferentes do padrão:

No meu dia a dia utilizo o Powershell Core e também o WSL com Ubuntu e zsh como shell. Se comparado com o gnome-terminal do Ubuntu, não senti nenhuma diferença.

Windows - Fundamentos para desenvolvedores
Curso de Windows - Fundamentos para desenvolvedores
CONHEÇA O CURSO

E você, já conhecia o Windows Terminal? O que você achou desse novo terminal? Sentiu falta de alguma funcionalidade presente em algum outro terminal? Responda nos comentários abaixo 🙂

Criando um ambiente de desenvolvimento PHP com WSL

O WSL é uma alternativa interessante para quem precisa configurar um ambiente de desenvolvimento em Linux dentro do Windows. Com ele você pode escolher a sua distribuição Linux preferida e configurar seu ambiente exatamente da mesma forma que você configuraria em uma máquina Linux ou em um servidor, por exemplo.

Nesse artigo vamos criar um ambiente de desenvolvimento PHP completo, com MySQL e Nginx dentro do WSL.

Instalação do WSL

Antes de mais nada, é preciso habilitar o WSL na sua máquina e instalar a distribuição de sua escolha. Se você ainda não conhece o WSL ou tem dúvidas se sua máquina tem suporte a ele, recomendo a leitura do artigo O que é Windows Subsystem for Linux (WSL)? para saber mais e acompanhar o processo de instalação.

Para esse tutorial vou utilizar o Ubuntu 18.04. Os comandos apresentados aqui podem não funcionar com outras distribuições, mas você pode utilizar esse artigo para ter uma ideia geral.

Instalando o Nginx

Para iniciar vamos iniciar nosso terminal com o WSL e instalar o Nginx. Ele está disponível via apt-get e pode ser instalado com os comandos abaixo como sudo:

sudo apt-get update
sudo apt-get install nginx

Aproveite esse momento e instale utilitários como o git para versionamento de código e um editor de textos de sua preferência, como o vim:

sudo apt-get install git vim

Depois é necessário habilitar o serviço do Nginx dentro do WSL, antes disso verifique se a porta 80 da sua máquina está liberada. Você pode executar o seguinte comando PowerShell como administrador para descobrir isso:

Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcess

Se o comando retornar erro, a porta 80 está liberada para uso:

Verificando a porta 80 com PowerShell

Feito isso, volte para seu terminal do WSL e execute o comando:

sudo service nginx start

Com isso seu localhost já estará funcionando:

Página inicial do nginx

Como o WSL não suporta o gerenciamento de serviços usando systemd, sempre que você reiniciar a máquina e iniciar uma nova sessão com o WSL, você precisa iniciar o serviço do Nginx novamente. Veremos como resolver isso logo mais.

Instalando o MySQL

O MySQL 5.7 pode ser instalado a partir do apt-get no Ubuntu 18.04:

sudo apt-get install mysql-server

Como também aconteceu com o Nginx, é preciso iniciar o serviço do MySQL manualmente:

sudo service mysql start

Para acessar sua instância do MySQL, é preciso criar um novo usuário no seu banco de dados para ser utilizado junto com sua aplicação. No seu terminal inicie o cliente do MySQL executando sudo mysql e execute a seguinte query:

GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Isso irá criar um usuário chamado admin com a senha password. Esse usuário será acessível apenas pelo endereço localhost. Troque o usuário e senha para algo mais seguro e digite exit para sair do cliente do MySQL.

Teste a conexão com o MySQL utilizando algum cliente, você pode utilizar o MySQL Workbench por exemplo:

Teste da conexão com o MySQL

Instalando o PHP

Agora vamos de fato instalar o PHP e configurá-lo para funcionar com o Nginx. É preciso instalar o PHP-FPM (FastCGI Process Manager) para que o Nginx consiga delegar as requisições recebidas para as páginas a serem interpretadas com PHP. Como estamos utilizando o MySQL como banco de dados, é interessante instalar a extensão do MySQL também:

sudo apt-get install php-fpm php-mysql

Com isso será instalado a versão 7.2 do PHP juntamente com o FPM e as extensões do MySQL:

Versão do php

Depois de instalado, inicie o serviço do PHP-FPM:

sudo service php7.2-fpm start

Configurando nosso site

Por fim, vamos configurar nosso site para ser executado com PHP. Crie um arquivo em /etc/nginx/sites-available/localhost com o seguinte conteúdo:

server {
  listen 80;
  root /var/www/html;
  index index.php index.html index.htm index.nginx-debian.html;
  server_name localhost;

  location / {
    try_files $uri $uri/ =404;
  }

  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
  }

  location ~ /\.ht {
    deny all;
  }
}

Habilite o site criado para utilizar a nova configuração através de um link simbólico (conhecido também como symlink) no diretório /etc/nginx/sites-enabled e remova a configuração de site padrão com os seguintes comandos:

sudo ln -s /etc/nginx/sites-available/localhost /etc/nginx/sites-enabled/
sudo unlink /etc/nginx/sites-enabled/default

Reinicie o serviço do Nginx para ler essas novas configurações:

sudo service nginx restart

E crie o arquivo /var/www/html/index.php com o seguinte conteúdo:

<?php 
phpinfo();

No meu caso, eu precisei alterar o dono do diretório /var/www/html para poder criar esse arquivo:

sudo chown -R $USER: /var/www/html

Com isso, você deve conseguir ver a configuração do PHP no seu navegador:

Configurações do php

Configurando os serviços para iniciarem automaticamente

Devido a algumas limitações na arquitetura do WSL, não é possível iniciar serviços automaticamente pelo systemd. Para contornar isso podemos iniciar esses serviços a partir do nosso arquivo .bashrc e desabilitar a necessidade de perguntar a senha do sudo para esses serviços.

Lembrando que essa prática não é recomendada em ambientes de produção. Em produção utilize o systemd e nunca permita que serviços que precisam de permissões elevadas rodem sem precisar inserir uma senha.

Adicione as seguintes linhas no seu arquivo /etc/sudoers:

%sudo ALL=NOPASSWD: /etc/init.d/mysql
%sudo ALL=NOPASSWD: /etc/init.d/nginx
%sudo ALL=NOPASSWD: /etc/init.d/php7.2-fpm

E no seu arquivo do ~/.bashrc inclua o seguinte:

sudo /etc/init.d/nginx start
sudo /etc/init.d/mysql start
sudo /etc/init.d/php7.2-fpm start

Com isso, sempre que iniciar seu terminal do WSL os serviços serão iniciados automaticamente. Caso esteja utilizando alguma linguagem diferente, a ideia é a mesma: inclua os serviços necessário no .bashrc e desabilite a senha para esses serviços no /etc/sudoers.

Configurando sua IDE

Após tudo configurado, chegou a hora de configurarmos nossa IDE para utilizar o WSL. Da forma que configuramos nosso ambiente, os scripts PHP estão dentro da estrutura de arquivos do WSL.

Como o WSL não suporta ferramentas com interface gráfica, não podemos instalar nossa IDE.

Podemos resolver isso de algumas formas. Uma delas é salvar nossos arquivos nos diretórios do Windows e dentro do WSL configurar o Nginx para apontar para um diretório dentro de /mnt/c/. Esse diretório é mapeado diretamente com o C: do seu sistema e permite o WSL ter acesso a esses arquivos.

Caso você utilize o VS Code, uma melhor alternativa é utilizar os arquivos salvos diretamente dentro da estrutura do WSL. Existe uma extensão ainda em preview chamada Remote Development. Com ela é possível se conectar com sistemas externos através de SSH, Container ou WSL para trabalhar diretamente com o sistema de arquivos dessas soluções.

Para utilizar o Remote Development com o WSL, instale a extensão Remote – WSL no seu VS code e reinicie o mesmo.

Extensão Remote - WSL

Ao reiniciar, repare no canto esquerdo um novo ícone verde. A partir dele é possível abrir uma nova janela do VS Code com acesso ao sistema de arquivos da sua distribuição no WSL:

Nova janela com acesso ao WSL

Ao abrir essa nova janela, será instalado um agente dentro do WSL que permite a conexão com o VS Code. O ícone verde indicará o nome da sua distribuição que o VS Code está conectado. Ao abrir um diretório você navegará no sistema de arquivos do WSL.

Abra o diretório /var/www/html e podemos observar que nosso index.php está acessível:

Abrir diretório

Arquivos no WSL

Esse agente que é instalado no WSL permite uma melhor integração com o VS Code. Com ele é possível dentro do terminal do WSL abrir qualquer diretório que você esteja navegando utilizando o comando code . e também é possível instalar extensões do VS Code para executarem diretamente dentro do WSL, como por exemplo as extensões de intellisense e debug para PHP:

Extensões instalados no WSL

Para a extensão intellisense do PHP funcionar, é preciso que o executável do PHP esteja disponível no sistema. Instalando essa extensão dentro do WSL você consegue utilizar do executável já disponível no WSL, concentrando todas as funcionalidades necessárias para o seu ambiente em um único lugar.

Conclusão

Aprendemos nesse artigo como criar do zero um ambiente de desenvolvimento para PHP dentro do WSL. Esse ambiente pode ser uma alternativa para quem precisa executar um projeto em ambiente Linux dentro do Windows. Vimos também como configurar o VS Code para acessar diretamente os arquivos dentro do sistema de arquivos do WSL, tornando uma experiência muito próxima com a que teríamos com o Linux.

O que é Windows Subsystem for Linux (WSL)?

Durante nosso dia a dia como desenvolvedores usamos diversas ferramentas pela linha de comando. Podemos utilizar git para versionar nossos projetos, instalar dependências com npm ou executar scripts para automatizar tarefas. Algumas dessas ferramentas são compatíveis com diversos sistemas operacionais, porém algumas delas são criadas levando em consideração somente o sistema Linux, não levando em conta as particularidades para serem executadas no Windows.

Como não é viável tornar todas as ferramentas compatíveis tanto com Windows como Linux, por que não tornar o Windows compatível com essas ferramentas? O Windows Subsystem for Linux (WSL) vem para resolver esse problema.

Windows - Fundamentos para desenvolvedores
Curso de Windows - Fundamentos para desenvolvedores
CONHEÇA O CURSO

Como o WSL funciona?

O WSL é um recurso opcional disponível no Windows 10 (a partir da versão 1607) que te permite executar binários e scripts em Linux diretamente no Windows, traduzindo as instruções enviadas para o sistema (as chamadas de sistema ou system calls) para uma instrução válida para o kernel do Windows. Com ele é possível ter um ambiente idêntico a de uma distribuição Linux que você já esteja acostumado sem precisar usar uma máquina virtual ou algo do tipo para isso.

O WSL permite que você instale múltiplas distribuições Linux na sua máquina, cada qual com uma estrutura de arquivos isolada e independente do sistema e de outras distribuições, similar com o que ocorre com uma máquina virtual.

Instalação

É possível habilitar o WSL executando o comando abaixo a partir de uma janela do PowerShell com permissão de Administrador:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Após reiniciar sua máquina você pode instalar uma versão da sua distribuição preferida a partir da Microsoft Store. Digite Linux na barra de busca e você encontrará várias distribuições como Ubuntu, Debian, Suse e até o Kali Linux.

Distribuições disponíveis na Microsoft Store

Após instalar e executar o aplicativo da distribuição desejada, é solicitado que você crie um usuário e senha para usar como o sudo da sua distribuição. Como exemplo, escolhi o Ubuntu 18.04 como a distribuição na minha máquina e criei um usuário chamado treinaweb:

Configuração do Ubuntu 18.04

Você pode encontrar no menu iniciar a distribuição instalada para usá-la posteriormente, digitando na barra de busca o nome da distribuição. Você pode fixar esse atalho na barra de tarefas, no iniciar ou na área de trabalho se desejar.

Ubuntu 18.04 no menu iniciar

Funcionalidades

Ao contrário de uma máquina virtual, o WSL é integrado com o sistema, permitindo o acesso dos arquivos tanto do sistema como os arquivos da distribuição. Dentro da distribuição os discos da sua máquina estão mapeados dentro do diretório /mnt/ e no Windows os arquivos da distribuição estão no caminho de rede \\\\wsl$

Arquivos do Windows dentro do WSL

Arquivos da distribuição como caminho de rede

Com o utilitário wslpath é possível converter os caminhos de diretório entre o WSL e Windows e vice-versa.

Exemplo wslpath

É possível também utilizar executáveis do Linux dentro do PowerShell ou Prompt de comando diretamente com wsl e até mesmo rodar executáveis do Windows dentro do WSL.

Executáveis do Windows junto com binários Linux

Outro uso comum é utilizar o WSL como ambiente de desenvolvimento web. Tanto o sistema como o WSL compartilham o mesmo IP de rede, logo para acessar o servidor web do seu ambiente basta utilizar localhost e informar a porta que você deseja acessar.

Servidor interno do PHP rodando no WSL

Vale lembrar que o WSL não substitui completamente uma máquina virtual. O público alvo do WSL são desenvolvedores que precisam executar ferramentas em linha de comando. Aplicações que usam a interface gráfica não são compatíveis com o WSL.

Aplicativos que invocam funções nativas do kernel do Linux também não são compatíveis com o WSL, como por exemplo, o Docker. Nesses casos uma máquina virtual ou o Docker for Desktop podem ser melhores soluções.

O que vem por aí

O WSL se mostrou até agora uma alternativa interessante para quem precisa executar ferramentas e aplicações Linux dentro do Windows de forma leve e integrada. Entretanto, na sua versão atual o WSL não tem compatibilidade total com as funções do kernel do Linux e com aplicações que fazem uso intenso de disco existe um gargalo no desempenho de leitura de disco se comparado com outras soluções.

Tendo isso em vista a Microsoft anunciou o WSL 2, uma nova versão que promete compatibilidade total com o kernel do Linux e performance de disco mais rápida. Para que isso seja possível o WSL 2 contará com o próprio kernel do Linux distribuído dentro do Windows ao invés de uma camada de tradução de system calls! O código do kernel utilizado é baseado na versão 4.19 e pode ser encontrado aqui.

O WSL 2 ainda está em desenvolvimento, disponível somente a partir do build 18917 do Windows Insider.

Alternativas para substituir o prompt de comando do Windows

Programadores que desenvolvem utilizando o Windows e necessitam fazer o uso do prompt de comando (cmd), entendem que é uma ferramenta extremamente limitada, por isso diversas alternativas estão disponíveis.

Windows - Fundamentos para desenvolvedores
Curso de Windows - Fundamentos para desenvolvedores
CONHEÇA O CURSO

Neste artigo veremos as principais e o que elas podem prover.

ConEmu

O ConEmu é um emulador de terminal Open Source para o Windows. É extremamente útil por permitir a subdivisão de janelas com vários terminais, abertura de múltiplas abas, customização de cores e fontes, etc.

No link https://conemu.github.io/ encontra-se toda documentação, passo a passo da instalação e o download gratuito da ferramenta.

cmder

Considerada uma das melhores ferramentas para substituir o cmd por possibilitar a utilização de comandos UNIX (rm, ls, mv, cd e etc.) mais utilizados pelos desenvolvedores. O cmder possui poderosos recursos de edição de linha de comando, histórico dos comandos já utilizados anteriormente e auto-complete, permitindo maior agilidade no uso do terminal.

No link http://cmder.net/ é possível baixar a ferramenta e acessar sua documentação.

Git Bash

É basicamente um terminal Linux para seu Windows. É o terminal padrão do Git e possui integração nativa com a ferramenta, além disso, permite ao usuário a customização de cores, auto-complete e cópia de texto. Possui auto-complete de todos os comandos utilizados para o controle de versão com o git.

O download da ferramenta pode ser feita a partir do link https://gitforwindows.org/

console2

É o aprimoramento do prompt de comando do Windows. De fácil utilização e que apresenta diversas funcionalidades, como: Seleção de texto semelhante a um editor de texto, diferentes tipos de plano de fundo, fonte configurável, diferentes estilos de janelas, etc.

Altamente personalizável, o console2 possui recursos como Ctrl + c e Ctrl + v (o famoso selecionar para copiar), atalhos para abertura de novas guias e alternar abas, fazendo com que a experiência em seu uso seja simples e desejável.

O download pode ser feito acessando o link https://sourceforge.net/projects/console/

PowerCmd

Com uma interface de fácil utilização, o PowerCmd simplifica o uso do prompt de comando. Suas funcionalidades são similares ao ConEmu. Permite salvar e restaurar as últimas sessões, realizar a personalização da barra de ferramentas para aplicativos de inicialização rápida, possibilita a utilização de múltiplas abas e a subdivisão da mesma janela com vários terminais, dentre outras funcionalidades.

Para fazer o uso da ferramenta, é possível fazer seu download a partir do link http://www.powercmd.com/

Concluindo:

As ferramentas listadas são ótimas opções para substituição do prompt de comando do Windows, para que recursos simples sejam adicionados ao seu dia a dia de forma rápida e prática. E você, utiliza ou possui alguma outra ferramenta para substituir o prompt de comando do Windows? Conta pra gente sua experiência e o por que de sua escolha, adoraríamos saber sobre. 🙂