Ambiente de desenvolvimento local com Windows Subsystem Linux (WSL), Docker e oh my zsh
Seja porque você gosta, seja porque foi obrigado, desenvolver utilizando o Windows é realidade na vida de muito desenvolvedor. E eu não sou exceção a regra. Na tentativa de deixar o Windows mais “amigável” para desenvolver, eu utilizava o Cygwin, mas nem tudo eram flores. Depois que o Windows 10 foi lançado e trouxe a opção de utilizar o bash do Ubuntu, confesso que fiquei impressionado, o resultado tem sido muito bom.
Este tutorial é uma tentativa de reunir as informações de vários outros tutoriais que encontrei pela internet para me ajudar a configurar um ambiente de desenvolvimento no Windows com os recursos abaixo:
- Windows Subsystem Linux (bash do Ubuntu)
- Docker
- ZSH e Oh My Zsh
Window Subsystem Linux (WSL)
Para começar, vamos fazer a instalação do WSL conforme as instruções de outro artigo aqui.
Pacotes úteis para instalar
sudo apt-get -y install build-essential bash-completion git vimDocker
Para este passo eu estou seguindo as orientações deste artigo.
Aqui nós iremos:
Instalação do Docker no Windows
- Instalar o Docker no Windows
- Expor o Docker para WSL
Instalação do Docker no WLS
- Instalar o Docker
- Atualizar
- Definir uma variável de ambiente
Instalação do Docker no Windows
Para realizar a instalação no Windows, a documentação oficial explica bem os passos necessários, dá pra seguir sem medo.
Após a instalação, abrir o painel do Docker e ativar as duas opções abaixo:


Pronto! Somente estes passos para o Windows, agora vamos configurar o Docker no WSL.
Instalação do Docker no WSL
Eu tive alguns problemas ao tentar usar o Docker do Windows no bash. Ele funcionou muito bem no PowerShell, mas no bash eu não consegui, por exemplo, acessar o container. Por este motivo sugiro instalar o Docker no WSL e configuro-lo para para acessar o serviço exposto no Windows. No bash executar os passos abaixo:
Remover qualquer versão anterior
sudo apt-get purge docker docker.io docker-ceNova instalação (apenas com uma linha de comando)
sudo curl -sSL https://get.docker.com/ | shAtualização
sudo apt-get update && sudo apt-get upgradeAgora será necessário configurar a variável de ambiente no WSL para o Docker “conversar” com o Docker do Windows. Adicionar a linha abaixo no arquivo ~/.bash_profile
export DOCKER_HOST=tcp://0.0.0.0:2375Agora, ao final do arquivo ~/.bashrc as linhas abaixo:
[ -n "$PS1" ] && source ~/.bash_profile;Pronto! Reincie o terminal e execute o comando docker info, e se deu tudo certo (eu espero que tenha) o resultado será algo semelhante a tela abaixo:

Instalação do Docker Compose
A instalação do Docker Compose é bem simples, mais detalhes sugiro a dar uma conferida na documentação oficial.
$ sudo -i$ curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose$ chmod +x /usr/local/bin/docker-compose
Bash completion para Docker e Docker Compose
$ sudo -i$ curl -L https://raw.githubusercontent.com/docker/docker/master/contrib/completion/bash/docker > /etc/bash_completion.d/docker
$ curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
Tudo instalado e configurado, neste momento já é possível, por exemplo, rodar uma versão do PHP com o Docker:

O que este humilde comando faz?
- Vai baixar uma imagem com a versão mais recente e estável do PHP (no meu caso a versão 7.1.7);
- Irá conectar no container e executar o comando
php --version;
O Docker Hub possui uma infinidade de imagens para PHP e outras tipos de ambientes (MySQL, Apache e etc). E se não existir uma imagem que atenda as suas necessidades, basta construir uma!
Outra recurso muito útil do Docker é o Docker Compose, com ele você configura em um arquivo .yml um ambiente LAMP por exemplo, e o melhor, e sem a necessidade de instalar estes serviços no Windows, olha só que coisa mais linda!
Bônus — Instalar o zsh (Z shell), oh-my-zsh e Cmder
Os próximos passos é mais uma questão pessoal minha, por isto fica como opcional.
Zsh e oh-my-zsh
O Zsh é uma alternativa ao bash e o oh-my-zsh é uma versão melhorada do zsh padrão. Algumas opções interessantes o zsh + oh-my-zsh são:
- Diversas opções de temas;
- Para desenvolvimento, exibe o branch atual do git;
- cd e git completion;
Consegui convencê-lo? Então vamos fazer a instalação logo!
Instalação do zsh e oh-my-zsh
$ sudo apt-get install zsh
$ sudo sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
Para habilitar o bash iniciar automaticamente o zsh, é necessário adicionar as linhas abaixo no inicio do arquivo ~/.bashrc:
$ vim ~/.bashrc
# Launch Zsh
if [ -t 1 ]; then
exec zsh
fiUma maneira mais interessante é utilizar o Cmder (emulador de terminal) e deixar que ele gerencie este tipo de configuração.
Instalação do Cmder
Baixe e instale o Cmder no Windows. Após a instalação, abra o Cmder e pressioneWin + Alt + P para ter acesso as configurações e siga os passos abaixo:
Passo 1: Vá em Startup > Task perceba que existem algumas tasks pré-configuradas, vamos adicionar mais uma;
Passo 2: Aperte o botão + ;
Passo 3: Vamos nomear esta task como zsh::ubuntu ;
Passo 4: Coloque o comando que será executado (abrir o bash como zsh ativado):
%windir%\system32\bash.exe ~ -c zsh -cur_console:pPasso 5: Colocar o ícone que será exibido na aba do Cmder:
/icon "%USERPROFILE%\AppData\Local\lxss\bash.ico"
Para tornar o zsh padrão para novas abas e na inicialização do Cmder, precisamos alterar duas opções:
- Nas configurações, em
Startup > Tasks, selecione a tarefa que acabamos de criar, e marque a opçãoDefault task for new console; - Ainda nas configurações, em
Startupna opçãoSpecified named taskselecione a opção{zsh::ubuntu};
Docker e zsh
Por ser outro shell, o zsh não vai carregar as variáveis de ambiente que definimos lá na configuração do bash. Será necessário fazer um source no arquivo ~/.zshrc . Para isto, adicione ao final do arquvivo ~/.zshrca as linhas abaixo:
[ -n "$PS1" ] && source ~/.bash_profile;Fazendo isto, basta definir as suas variáveis no arquivo ~/.bash_profile para que elas estejam disponíveis para ambos, bash e zsh.
Problemas
Até o momento encontrei um! No WSL, o drive C: é visível em /mnt/c , mas o Docker Engine que o drive esteja em /c/ , então ao subir um container, o volume não é montado. Para resolver eu segui as orientações que encontrei aqui. Em resumo, é necessário fazer isto:
# Criar um diretório /c
$ sudo mkdir /c# Montar o drive C nele
$ sudo mount --bind /mnt/c /c
Referências
- https://serverfault.com/questions/767994/can-you-run-docker-natively-on-the-new-windows-10-ubuntu-bash-userspace
- https://medium.com/software-development-stories/developing-a-dockerized-web-app-on-windows-subsystem-for-linux-wsl-61efec965080
- https://gingter.org/2016/11/16/running-windows-10-ubuntu-bash-in-cmder/
- http://bigfontblog.azurewebsites.net/run-docker-from-the-wsl/