Ambiente de desenvolvimento local com Windows Subsystem Linux (WSL), Docker e oh my zsh

Humberto Rodrigues
Jul 25, 2017 · 6 min read

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 vim

Docker

Para este passo eu estou seguindo as orientações deste artigo.

Aqui nós iremos:

Instalação do Docker no Windows

  1. Instalar o Docker no Windows
  2. Expor o Docker para WSL

Instalação do Docker no WLS

  1. Instalar o Docker
  2. Atualizar
  3. 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:

Expor o daemon do docker sem TLS
Habilitar o compartilhamento do drive C:\ para o containers Docker

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-ce

Nova instalação (apenas com uma linha de comando)

sudo curl -sSL https://get.docker.com/ | sh

Atualização

sudo apt-get update && sudo apt-get upgrade

Agora 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:2375

Agora, 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?

  1. Vai baixar uma imagem com a versão mais recente e estável do PHP (no meu caso a versão 7.1.7);
  2. 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
fi

Uma 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:p

Passo 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:

  1. Nas configurações, em Startup > Tasks , selecione a tarefa que acabamos de criar, e marque a opção Default task for new console ;
  2. Ainda nas configurações, em Startup na opção Specified named task selecione 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

  1. https://serverfault.com/questions/767994/can-you-run-docker-natively-on-the-new-windows-10-ubuntu-bash-userspace
  2. https://medium.com/software-development-stories/developing-a-dockerized-web-app-on-windows-subsystem-for-linux-wsl-61efec965080
  3. https://gingter.org/2016/11/16/running-windows-10-ubuntu-bash-in-cmder/
  4. http://bigfontblog.azurewebsites.net/run-docker-from-the-wsl/

Humberto Rodrigues

Written by

Desenvolvedor “resolvedor de problemas” fullstack.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade