Introdução aos contêineres remotos do Docker no WSL 2

Este guia passo a passo ajudará você a começar a desenvolver com contêineres remotos configurando o Docker Desktop para Windows com o WSL 2 (Subsistema do Windows para Linux, versão 2).

O Docker Desktop para Windows fornece um ambiente de desenvolvimento para criar, enviar e executar aplicativos dockerized. Ao habilitar o mecanismo baseado em WSL 2, você pode executar contêineres linux e Windows no Docker Desktop no mesmo computador. (O Docker Desktop é gratuito para uso pessoal e pequenas empresas, para obter informações sobre preços de Pro, Equipe ou Empresas, consulte as perguntas frequentes do site do Docker).

Observação

É recomendável usar o Docker Desktop devido à integração com Windows e Subsistema do Windows para Linux. No entanto, enquanto o Docker Desktop dá suporte à execução de contêineres linux e Windows, você não pode executar ambos simultaneamente. Para executar contêineres linux e Windows simultaneamente, você precisaria instalar e executar uma instância separada do Docker no WSL. Se você precisar executar contêineres simultâneos ou simplesmente preferir instalar um mecanismo de contêiner diretamente na distribuição do Linux, siga as instruções de instalação do Linux para esse serviço de contêiner, como Instalar o Mecanismo do Docker no Ubuntu ou Instalar o Podman para executar contêineres do Linux.

Visão geral dos contêineres do Docker

O Docker é uma ferramenta usada para criar, implantar e executar aplicativos usando contêineres. Os contêineres permitem que os desenvolvedores empacotem um aplicativo com todas as partes necessárias (bibliotecas, estruturas, dependências etc.) e enviem tudo isso como um pacote. O uso de um contêiner garante que o aplicativo seja executado da mesma forma, independentemente de configurações personalizadas ou das bibliotecas instaladas anteriormente no computador que o executa, que poderiam ser diferentes do computador usado para escrever e testar o código do aplicativo. Isso permite que os desenvolvedores se concentrem em escrever código sem se preocupar com o sistema no qual o código será executado.

Os contêineres do Docker são semelhantes às máquinas virtuais, mas não criam um sistema operacional virtual inteiro. Em vez disso, o Docker permite que o aplicativo use o mesmo kernel do Linux que o sistema em que ele está sendo executado. Isso permite que o pacote do aplicativo exija apenas as partes que ainda não estão no computador host, reduzindo o tamanho do pacote e melhorando o desempenho.

A disponibilidade contínua, usando contêineres do Docker com ferramentas como Kubernetes, é outro motivo para a popularidade dos contêineres. Isso permite que várias versões de seu contêiner de aplicativo sejam criadas em momentos diferentes. Em vez de precisar desativar um sistema inteiro para atualizações ou manutenção, cada contêiner (e seus microsserviços específicos) pode ser substituído de forma dinâmica. Você pode preparar um novo contêiner com todas as atualizações, configurar o contêiner para produção e apenas apontar para o novo contêiner quando ele estiver pronto. Também é possível arquivar versões diferentes do aplicativo usando contêineres e mantê-los em execução como um fallback de segurança, se necessário.

Para saber mais, confira a introdução aos contêineres do Docker no Microsoft Learn.

Pré-requisitos

Observação

O WSL pode executar distribuições no modo WSL versão 1 ou WSL 2. Você pode verificar isso abrindo o PowerShell e inserindo: wsl -l -v. Verifique se a distribuição está definida para usar o WSL 2 inserindo: wsl --set-version <distro> 2. Substitua <distro> pelo nome da distribuição (por exemplo, Ubuntu 18.04).

No WSL versão 1, devido a diferenças fundamentais entre Windows e Linux, o Mecanismo do Docker não pôde ser executado diretamente dentro do WSL, portanto, a equipe do Docker desenvolveu uma solução alternativa usando VMs Hyper-V e LinuxKit. No entanto, como o WSL 2 agora é executado em um kernel do Linux com capacidade total de chamada do sistema, o Docker pode ser totalmente executado no WSL 2. Isso significa que os contêineres do Linux podem ser executados nativamente sem emulação, resultando em melhor desempenho e interoperabilidade entre suas ferramentas Windows e Linux.

Instalar o Docker Desktop

Com o back-end do WSL 2 com suporte no Docker Desktop para Windows, você pode trabalhar em um ambiente de desenvolvimento baseado em Linux e criar contêineres baseados em Linux, usando Visual Studio Code para edição e depuração de código e executando seu contêiner no navegador Microsoft Edge no Windows.

Para instalar o Docker (depois de já instalar o WSL):

  1. Baixe o Docker Desktop e siga as instruções de instalação.

  2. Depois de instalado, inicie o Docker Desktop no Windows menu Iniciar e selecione o ícone do Docker no menu ícones ocultos da barra de tarefas. Clique com o botão direito do mouse no ícone para exibir o menu de comandos do Docker e selecione "Configurações". Docker Desktop dashboard icon

  3. Verifique se "Usar o mecanismo baseado em WSL 2" está verificado em Configurações>General. Docker Desktop general settings

  4. Selecione entre as distribuições do WSL 2 instaladas nas quais você deseja habilitar a integração do Docker acessando: Configurações>ResourcesWSL>Integration. Docker Desktop resource settings

  5. Para confirmar se o Docker foi instalado, abra uma distribuição WSL (por exemplo, Ubuntu) e exiba a versão e o número de build inserindo: docker --version

  6. Teste se sua instalação funciona corretamente executando uma imagem simples interna do Docker usando: docker run hello-world

Dica

Aqui estão alguns comandos úteis do Docker para saber:

  • Liste os comandos disponíveis na CLI do Docker digitando: docker
  • Liste as informações para um comando específico com: docker <COMMAND> --help
  • Liste as imagens do Docker em seu computador (que é apenas a imagem hello-world neste momento), com: docker image ls --all
  • Liste os contêineres em seu computador com: docker container ls --all ou docker ps -a (sem o sinalizador -a show all, somente contêineres em execução serão exibidos)
  • Listar informações de todo o sistema sobre a instalação do Docker, incluindo estatísticas e recursos (memória de CPU & ) disponíveis para você no contexto do WSL 2, com: docker info

Desenvolver em contêineres remotos usando VS Code

Para começar a desenvolver aplicativos usando o Docker com o WSL 2, recomendamos usar VS Code, juntamente com a extensão Remote-WSL e a extensão do Docker.

  • Instale a extensão VS Code Remote-WSL. Essa extensão permite que você abra seu projeto linux em execução no WSL no VS Code (não é necessário se preocupar com problemas de caminho, compatibilidade binária ou outros desafios entre sistemas operacionais).

  • Instale o código VS Remote-Containers extensão. Essa extensão permite que você abra sua pasta de projeto ou repositório dentro de um contêiner, aproveitando o conjunto completo de recursos do Visual Studio Code para fazer seu trabalho de desenvolvimento dentro do contêiner.

  • Instale a extensão VS Code Docker. Essa extensão adiciona a funcionalidade para criar, gerenciar e implantar aplicativos em contêiner de dentro VS Code. (Você precisa da extensão Remote-Container para realmente usar o contêiner como seu ambiente de desenvolvimento.)

Vamos usar o Docker para criar um contêiner de desenvolvimento para um projeto de aplicativo existente.

  1. Para este exemplo, usarei o código-fonte do meu tutorial de Olá, Mundo para o Django no ambiente de desenvolvimento do Python, configurando documentos. Você pode ignorar esta etapa se preferir usar seu próprio código-fonte do projeto. Para baixar meu aplicativo Web HelloWorld-Django do GitHub, abra um terminal WSL (Ubuntu, por exemplo) e insira:git clone https://github.com/mattwojo/helloworld-django.git

    Observação

    Sempre armazene seu código no mesmo sistema de arquivos no qual você está usando ferramentas. Isso resultará em um desempenho de acesso mais rápido ao arquivo. Neste exemplo, estamos usando uma distribuição do Linux (Ubuntu) e queremos armazenar nossos arquivos de projeto no sistema \\wsl\de arquivos WSL. Armazenar arquivos de projeto no sistema de arquivos Windows diminuiria significativamente as coisas ao usar ferramentas do Linux no WSL para acessar esses arquivos.

  2. No terminal do WSL, altere os diretórios para a pasta de código-fonte deste projeto:

    cd helloworld-django
    
  3. Abra o projeto em VS Code em execução no servidor de extensão local do Remote-WSL inserindo:

    code .
    

    Confirme se você está conectado à distribuição do WSL Linux verificando o indicador remoto verde no canto inferior esquerdo da instância VS Code.

    VS Code WSL Remote indicator

  4. Na palete de comando VS Code (Ctrl + Shift + P), insira: Remote-Containers: Open Folder in Container... Se esse comando não for exibido quando você começar a digitá-lo, verifique se você instalou a extensão de Contêiner Remoto vinculada acima.

    VS Code Remote Container command

  5. Selecione a pasta de projeto que você deseja colocar em contêiner. No meu caso, isso é \\wsl\Ubuntu-20.04\home\mattwojo\repos\helloworld-django\

    VS Code Remote Container folder

  6. Uma lista de definições de contêiner será exibida, pois ainda não há nenhuma configuração de DevContainer na pasta do projeto (repositório). A lista de definições de configuração de contêiner exibidas é filtrada com base no tipo de projeto. Para meu projeto do Django, selecionarei Python 3.

    VS Code Remote Container config definitions

  7. Uma nova instância de VS Code será aberta, começará a criar nossa nova imagem e, depois que o build for concluído, iniciará nosso contêiner. Você verá que uma nova .devcontainer pasta apareceu com informações de configuração de contêiner dentro de um arquivo e devcontainer.json um Dockerfile arquivo.

    VS Code .devcontainer folder

  8. Para confirmar se o projeto ainda está conectado ao WSL e em um contêiner, abra o terminal integrado VS Code (Ctrl + Shift + ~). Verifique o sistema operacional inserindo: uname e a versão do Python com: python3 --version. Você pode ver que o uname voltou como "Linux", portanto, você ainda está conectado ao mecanismo WSL 2 e o número da versão do Python será baseado na configuração de contêiner que pode ser diferente da versão do Python instalada na distribuição WSL.

  9. Para executar e depurar seu aplicativo dentro do contêiner usando Visual Studio Code, primeiro abra o menu Executar (Ctrl+Shift+D ou selecione a guia na barra de menus à esquerda). Em seguida, selecione Executar e Depurar para selecionar uma configuração de depuração e escolha a configuração que melhor combina seu projeto (no meu exemplo, este será "Django"). Isso criará um launch.json arquivo na .vscode pasta do seu projeto com instruções sobre como executar seu aplicativo.

    VS Code run debug configuration

  10. De dentro VS Code, selecione Depuração do RunStart> (ou pressione apenas a tecla F5). Isso abrirá um terminal dentro de VS Code e você verá um resultado dizendo algo como: "Iniciando o servidor de desenvolvimento em http://127.0.0.1:8000/ Sair do servidor com CONTROL-C". Mantenha pressionada a tecla Control e selecione o endereço exibido para abrir seu aplicativo no navegador da Web padrão e veja seu projeto em execução dentro do contêiner.

    VS Code running a docker container

Agora você configurou com êxito um contêiner de desenvolvimento remoto usando o Docker Desktop, alimentado pelo back-end do WSL 2, que pode codificar, compilar, executar, implantar ou depurar usando VS Code!

Solução de problemas

Contexto do docker WSL preterido

Se você estava usando uma visualização de tecnologia antecipada do Docker para WSL, talvez tenha um contexto do Docker chamado "wsl" que agora está preterido e não é mais usado. Você pode verificar com o comando: docker context ls. Você pode remover esse contexto "wsl" para evitar erros com o comando: docker context rm wsl como você deseja usar o contexto padrão para Windows e WSL2.

Os possíveis erros que você pode encontrar com esse contexto wsl preterido incluem: docker wsl open //./pipe/docker_wsl: The system cannot find the file specified. ou error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_wsl/v1.40/images/json?all=1: open //./pipe/docker_wsl: The system cannot find the file specified.

Para obter mais informações sobre esse problema, consulte Como configurar o Docker no Windows System for Linux (WSL2) no Windows 10.

Problemas ao localizar a pasta de armazenamento de imagens do Docker

O Docker cria duas pastas de distribuição para armazenar dados:

  • \wsl$\docker-desktop
  • \wsl$\docker-desktop-data

Você pode encontrar essas pastas abrindo sua distribuição do WSL Linux e inserindo: explorer.exe . para exibir a pasta no Windows Explorador de Arquivos. Insira: \\wsl\<distro name>\mnt\wsl substituindo <distro name> pelo nome da distribuição (ou seja, Ubuntu-20.04) para ver essas pastas.

Saiba mais sobre como localizar locais de armazenamento do Docker no WSL, consulte esse problema no repositório WSL ou nesta postagem StackOverlow.

Para obter mais ajuda com problemas gerais de solução de problemas no WSL, consulte o documento de solução de problemas .

Recursos adicionais