Você está na página 1de 4

Estudo sobre substituição do Docker

Desktop
Introdução

Recentemente, a Docker passou a precificar a utilização do Docker Desktop para Windows por
contas corporativas de grandes empresas. Isto motivou a a busca por uma alternativa para
utilizar o Docker no Windows de forma gratuita e legal. Alguns artigos sugerem a utilização do
WSL (Windows Subsystem for Linux) para execução do Docker. Portanto, o objetivo deste
documento é prover um passo-a-passo para a utilização desta técnica, além de apresentar um
caso de teste utilizado para validação dessa ferramenta.

Setup

1. É necessário ter o WSL2 instalado, pois a versão 1 não contém o kernel Linux. Sendo assim,
apenas o WSL2 tem suporte para containers. Para verificar a versão do WSL, execute o
comando no powershell:
wsl --set-default-version 2

Se o comando retornar uma mensagem de êxito, a versão correta do WSL está sendo usada.

2. Instalar o Ubuntu 20.04, que pode ser instalado pela Microsoft Store. Atentar-se para a versão
_20.04_. Concluir configurações iniciais de usuário e senha normalmente. No terminal do
Ubuntu, execute os comandos a seguir:

a. Atualização da sua distribuição Ubuntu:


sudo apt update && sudo apt upgrade

b. Remoção de possíveis residuais de instalações anteriores:


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

c. Reconfiguração de repositórios:
source /etc/os-release

curl -fsSL https://download.docker.com/linux/${ID}/gpg | sudo apt-key


add -
echo "deb [arch=amd64] https://download.docker.com/linux/${ID}
${VERSION_CODENAME} stable" | sudo tee
/etc/apt/sources.list.d/docker.list

sudo apt update

d. Instalação de release oficial do Docker:


sudo apt install docker-ce docker-ce-cli containerd.io

e. Inserção do usuário ao grupo do Docker:


sudo usermod -aG docker $USER

f. Após isso, feche a janela atual do WSL e abra uma nova.

3. Abra uma janela do terminal do Windows como administrador, e obtenha o IP com o


comando:
$ip = (wsl sh -c "hostname -I").Split(" ")[0]

a. Configure o redirecionamento da porta 2375 para a sua distro:


netsh interface portproxy add v4tov4 listenport=2375 connectport=2375
connectaddress=$ip

b. Execute o dockerd da sua distro com o IP:


wsl sh -c "sudo dockerd -H tcp://$ip"

Você deverá digitar a senha de seu usuário para executar o último comando. Após isso, caso o
comando tenha sucesso, depois de várias linhas com INFOs e WARNs, terá uma mensagem
com algo como "API listen on <IP>:2375". O que significa que o Docker está rodando no WSL,
nesta janela do terminal.

Caso o Docker Desktop esteja instalado, desinstale.

4. Para executar o Docker pelo terminal do Windows, é necessário baixar o arquivo docker.exe
deste repositório no GitHub: https://github.com/StefanScherer/docker-cli-builder/releases, e
colocar em alguma pasta que esteja no path para executáveis. Você pode se certificar disso
abrindo uma janela de terminal do Windows, e executando:
docker --version
a. Em seguida, você irá adicionar uma nova variável de ambiente do sistema:

DOCKER_HOST = tcp://localhost:2375

Contanto que a janela do terminal pela qual o Docker foi iniciado ainda esteja aberta, o
comando "docker" pode ser usado normalmente:
docker run --rm hello-world

Uma dica, é agrupar os três comandos abaixo em um arquivo de script para ser executado toda
vez que o Docker precisar ser executado. Para isso, é preciso que a política de execução
permita a execução de scripts. Comandos:
$ip = (wsl sh -c "hostname -I").Split(" ")[0]

netsh interface portproxy add v4tov4 listenport=2375 connectport=2375


connectaddress=$ip

wsl sh -c "sudo dockerd -H tcp://$ip"

Teste

Dois testes foram executados, o primeiro subindo um container e o segundo com dois
containers iguais para testar a execução simultânea de mais de um container. No segundo
teste em cada container havia uma aplicação Node.js com a biblioteca Express, contendo um
endpoint GET / retornando uma mensagem teste. Os arquivos são:

app.js : (Javascript)
import express from "express";
import dotenv from "dotenv";

dotenv.config();
const app = express();
const port = process.env.PORT;

app.use(express.json());

app.get("/", (req, res) => res.send({ message: "Hello from container"


}));

app.listen(port, () => console.log("Server listening to port: ",


port));

.env :
PORT=3000

Dockerfile :
FROM docker.io/library/node:latest
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]

docker-compose.yml:
version: "3.9"

services:
app:
container_name: app
image: app
restart: always
build:
context: .
dockerfile: Dockerfile
ports:
- "${PORT}:${PORT}"

a. Executou-se o seguinte comando no powershell:


docker compose up --build

b. Em seguida, copiou-se a pasta do projeto para uma nova, alterou-se o nome "app" para
"app2" no docker-compose.yml, e a porta 3000 para 3001 no .env, e executou-se nesta
nova pasta:
docker compose up --build

Tanto localhost:3000 quanto localhost:3001 retornaram as respostas esperadas.

Conclusão

A precificação do Docker sobre o uso do Docker Desktop para Windows por usuários
corporativos motivou o uso do Docker com o WSL. Um passo-a-passo foi elaborado e um teste
com dois containers rodando API's Express.js foi executado, obtendo resultados satisfatórios.

Com base nestes resultados, acredita-se que o WSL com o Docker pode suprir a necessidade
de utilizar o Docker Desktop.

Você também pode gostar