Instalando e configurando o Docker no Windows Subsystem Linux (WSL)

Pré-requisitos


Antes de começar, verifique se o seu sistema possui aproximadamente a seguinte configuração:

  • Windows 10 Versão 1803 Build 1734 e posterior
  • Ubuntu para WSL 16.0.4 LTS ou algo parecido (sua versão pode variar um pouco)

É importante que a versão e a compilação do Windows não sejam inferiores às indicadas aqui. O fato é que, começando com esses números, foram feitas alterações fundamentais no kernel do Windows WSL que permitem o uso de cgroups (grupos de controle - adicionados ao kernel do Linux em 2008). E eles são necessários para o Docker gerenciar os recursos do seu sistema em contêineres.



Instale o Docker-CE 09.17.0


Instalaremos o Docker Community Edition 17.09.0 (porque no momento da redação deste artigo, as versões mais recentes caíram quando instaladas na WSL).

A primeira coisa que faremos é se livrar de todas as instalações anteriores do Docker (se houver). Para fazer isso, execute o terminal bash e escreva o seguinte:

$ sudo apt-get remove docker docker-engine docker.io containerd runc


Agora instale o repositório para o Docker CE. Através do apt-get, podemos instalar a versão necessária sem precisar compilá-la a partir das fontes. Seguindo as recomendações no site oficial do Docker, escrevemos os seguintes comandos:

#   
$ sudo apt-get update
#   ,   apt    HTTPS
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common

#      GPG   Docker
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#  Docker   :
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

#        Docker    
$ sudo apt-get update

Se você já adicionou um novo repositório usando o apt, tudo isso é familiar para você como um todo. Caso contrário, espero que você ainda tenha ficado comigo :)

Em seguida, instale o Docker:

$ sudo apt-get install docker-ce=17.09.0~ce-0~ubuntu

Se você não estiver usando WSL no estilo Ubuntu, poderá ver a lista de versões disponíveis como esta:

$ apt list -a docker-ce


... ou use um comando semelhante de alguma outra biblioteca se você abandonou o APT.

No final, você precisa adicionar seu usuário atual ao grupo de janelas de encaixe para poder usar corretamente o Docker Engine, que deve estar em execução no seu sistema com o Docker Engine. como raiz.

sudo usermod -aG docker $USER

Executando Docker no Windows


Agora que o Docker está instalado, precisamos usar um método bastante complicado para iniciá-lo como um serviço na WSL toda vez que inicializamos o Windows. Isso não é tão fácil quanto pode parecer. Precisamos agir em nome do superusuário e executar o shell de comando com privilégios elevados, o que complica um pouco a tarefa.

Para simplificar um pouco o processo, crie um novo arquivo em / usr / local / sbin / - um script que contém os comandos apropriados para iniciar o serviço Docker:

$ sudo nano /usr/local/sbin/start_docker.sh

com o seguinte conteúdo:

#!/usr/bin/env bash
sudo cgroups-mount
sudo service docker start

O primeiro comando sudo é montar o cgroups (será executado na reinicialização) e o segundo fornece o serviço docker ao systemd (este é o subsistema Ubuntu para inicializar e gerenciar serviços).

Agora deixe o script executar e execute:

$ sudo chmod +x /usr/local/sbin/start_docker.sh
#  
$ sudo chmod 755 /usr/local/sbin/start_docker.sh
$ /bin/sh /usr/local/sbin/start_docker.sh

No entanto, o serviço Docker não será iniciado por dois motivos:

  1. O script faz chamadas como superusuário, portanto, o próprio script deve ser executado com privilégios de superusuário para funcionar como pretendido. Em teoria, fazer isso é tão simples quanto escrever qualquer comando sudo, mas para isso, o usuário deve inserir seus dados após cada download, o que é muito irritante.
  2. O primeiro comando para montar o cgroups deve ser executado no bash com privilégios elevados. Para executá-lo sem a entrada do usuário, precisamos usar o Agendador de tarefas do Windows.

Tudo limpo? Então, ao ponto ...

Executando um script com privilégios de root sem entrada do usuário


Na família de sistemas operacionais Linux, o arquivo / etc / sudoers determina quem e o que pode ser executado com privilégios de superusuário. Vamos modificá-lo para que seu usuário possa chamar o script sem precisar digitar constantemente a senha root. (Mas tenha muito cuidado com este arquivo! É muito fácil sair do sistema se você não souber o que está fazendo!)

$ sudo nano /etc/sudoers

Adicione uma nova linha ao final do arquivo. Nesse caso, você deve saber exatamente o seu nome de usuário (execute echo $ USER, se não tiver certeza):

<your username here> ALL=(ALL:ALL) NOPASSWD: /bin/sh /usr/local/sbin/start_docker.sh

Agora podemos iniciar o serviço Docker como root sem a entrada do usuário:

$ sudo /bin/sh /usr/local/sbin/start_docker.sh 

Viva, camaradas!

Inicialização adequada do Docker na inicialização do Windows


Agora, quando o sistema inicializar, poderemos iniciar o Docker como administrador usando um comando separado que não requer interação do usuário.



Inicie o Agendador de tarefas do Windows e selecione a Biblioteca do agendador de tarefas no painel esquerdo. Em seguida, selecione Criar tarefa no painel direito.



Em seguida, você será solicitado a editar as configurações básicas da tarefa. Dê um nome claro à sua tarefa e verifique se o restante das configurações corresponde ao meu. É importante que você selecione Executar com os privilégios mais altos .



Na guia Triggers , adicione um novo gatilho que iniciará a tarefa assim que o usuário local efetuar login.



Alternando para a guia Actions , crie uma nova ação que será executada no bash e imediatamente executará nosso script com a opção -c :

-c "sudo /bin/sh /usr/local/sbin/start_docker.sh"


Observe que isso deve ser feito com privilégios elevados; portanto, marque a caixa de seleção Executar com mais privilégios na guia Geral .



O restante dos parâmetros depende principalmente das preferências individuais, mas mostrarei minhas configurações. Se você quiser, você pode copiá-los. Algumas configurações de energia podem não aparecer se você estiver sentado em um carro parado. Pessoalmente, eu uso um laptop.



Bem, tudo corre como pretendemos. Se você não iniciou o Docker nas etapas anteriores usando comandos com privilégios elevados, clique com o botão direito do mouse na tarefa que criamos no Agendador de tarefas e selecione "Executar"! Isso é tudo!

Verifique se tudo funciona


Se você quiser jogar com segurança, reinicie sua máquina (sim, para isso você precisará fechar as guias do navegador por algum tempo) , inicie o bash e digite:

$ docker run --rm hello-world

Se tudo correr bem, você verá a saudação padrão do Docker. O serviço será iniciado automaticamente e diretamente na WSL! Parabéns!

Arredondar


Você acabou de instalar e iniciar o Docker na WSL. Isso significa que seus contêineres agora podem compartilhar o Ubuntu já em execução no seu sistema. Portanto, não há necessidade de implantar um novo sistema operacional (virtualizado), como faz o Docker for Windows comum.

Até agora, o desempenho do Docker na WSL [no momento da redação do artigo original] deixa muito a desejar, mas à medida que a plataforma se desenvolve e as atualizações do Windows são lançadas, ela só melhora.


  1. onomatopellan GitHub: https://github.com/Microsoft/WSL/issues/2291#issuecomment-383698720
  2. Official Docker Documentation: https://docs.docker.com/install/linux/docker-ce/ubuntu/
  3. cgroupfs-mount: https://github.com/tianon/cgroupfs-mount
  4. Bash Command Line Interface: https://docs.microsoft.com/en-us/windows/wsl/reference


All Articles