# Como instalar o Docker e Docker Compose no Windows 11 sem o aplicativo Docker Desktop e no Linux Ubuntu

%[https://youtu.be/NMsQ6V97YaQ] 

---

## Introdução

### Docker

`Docker` é uma ferramenta que facilita a criação e administração de ambientes isolados possibilitando o empacotamento de uma aplicação ou ambiente dentro de um container. Os contêineres permitem que os devs empacotem um aplicativo com todas as partes necessárias, como bibliotecas e outras dependências, e envie tudo como um pacote.

Então, você consegue criar, implantar, copiar e migrar de um ambiente para outro com maior flexibilidade, pois um container do Docker abstrai todo o sistema operacional. Um jeito fácil de pensar sobre isso é imaginando que um container do Docker é a execução de uma imagem/foto pronta da sua aplicação e não importa qual o sistema operacional ou ambiente você estiver, se lá tiver o Docker instalado, ele poderá "subir" sua imagem/foto pronta e executar esse container.

Esse é um dos motivos pelo sucesso do Docker, de certa forma ele "acabou" com aquela famosa e velha frase dos devs "na minha máquina funciona, mas em produção não". Isso porque agora com o Docker independentemente do ambiente, o pacote/container do Docker contém toda a aplicação exatamente igual em qualquer lugar.

---

### Docker Compose

O Docker simplifica o processo de gerenciamento de processos de aplicativos em contêineres. Embora os contêineres sejam semelhantes às máquinas virtuais de certas maneiras, eles são mais leves e amigáveis ​​aos recursos. Isso permite que os desenvolvedores dividam um ambiente de aplicativo em vários serviços isolados.

Para aplicativos que dependem de vários serviços, orquestrar todos os contêineres para iniciar, comunicar e desligar juntos pode se tornar rapidamente complicado. O `Docker Compose` é uma ferramenta que permite executar ambientes de aplicativos de vários contêineres com base em definições inseridas em um arquivo `YAML`. Ele usa definições de serviço para criar ambientes totalmente personalizáveis ​​com vários contêineres que podem compartilhar redes e volumes de dados.

---

## Vantagens da instalação através do WSL2 ao invés do aplicativo Docker Desktop

Se você está procurando uma maneira eficiente de trabalhar com o Docker no Windows, o WSL2 pode ser a solução ideal.

Se você não sabe o que é WSL2, talvez você ache interessante ler nosso artigo que fala sobre isso antes de continuar:

* 👉 [WSL2 - Instalação e Configuração](https://simplescloud.io/wsl2)
    

Ao usar o aplicativo `Docker Desktop`, no background de seu computador você poderá visualizar duas distribuições do WSL2 criadas para ele:

* `docker-desktop`
    
* `docker-desktop-data`
    

Onde o primeiro é responsável por armazenar o código do `docker daemon` e sua infraestrutura ao redor, já o segundo será responsável por armazenar imagens e configurações do container. Aqui está um exemplo:

```plaintext
NAME                     STATE           VERSION
* Ubuntu-20.04           Running         2
  docker-desktop         Running         2
  docker-desktop-data    Running         2
```

Então embora isso funcione, em um cenário que você esteja conectado na distribuição ubuntu, ao usar o docker você estará "passando" por uma camada a mais e perdendo performance, esse é o principal motivo de preferir instalar o docker diretamente na distribuição do WSL2 ao invés de usar o aplicativo Docker Desktop e evitar essas distribuições adicionais.

Além disso, a instalação do Docker e Docker Compose no WSL2 apresenta várias outras vantagens em relação ao Docker Desktop, tais como:

### Desempenho superior

Uma das principais vantagens da instalação do Docker e Docker Compose no WSL2 é o desempenho superior. Como o WSL2 fornece uma camada de compatibilidade mais eficiente para a execução de programas Linux no Windows, o desempenho é significativamente melhor em comparação ao Docker Desktop. Além disso, a instalação do Docker e Docker Compose no WSL2 é mais enxuta e não inclui a interface gráfica do Docker Desktop, o que pode impactar positivamente na performance.

### Maior compatibilidade

O Docker e Docker Compose no WSL2 é executado em um ambiente Linux nativo, o que significa que oferece uma maior compatibilidade com as ferramentas e bibliotecas Linux. Isso pode ser especialmente útil para desenvolvedores que trabalham com aplicações em que a compatibilidade com o Linux é essencial.

### Acesso a todas as funcionalidades do Docker

O Docker e Docker Compose no WSL2 oferece acesso a todas as funcionalidades do Docker, incluindo o `Docker Swarm` e o `Kubernetes`. Além disso, a instalação do Docker e Docker Compose no WSL2 é mais simples e não depende de uma interface gráfica, o que pode ser especialmente útil para usuários avançados e para a automação de tarefas.

### Melhor para Aprender

Se o seu objetivo for evoluir em uma carreira de DevOps, muito provavelmente você precisará se familiarizar com os comandos, a interface gráfica torna as coisas visivelmente mais fáceis, mas também nos torna mais preguiçosos, então usar o docker através de comandos desde o momento de sua instalação já pode ir te ajudando a se acostumar, a medida que você pratica, achará até mais fácil.

---

## Desvantagens da instalação através do WSL2 ao invés do aplicativo Docker Desktop

Essa abordagem também oferece desvantagens, sendo a principal delas que o Docker Desktop torna os comandos docker disponíveis em qualquer ambiente ou ferramenta que você usar, por exemplo os comandos estarão disponíveis tanto no `terminal`, como no `powershell`, como no `cmd`, etc. Sem a necessidade de instalar um a um.

Por mais que eu não perceba grande utilidade nisso, pois na maioria das vezes executo os comandos docker apenas no meu terminal e não tenho necessidade de fazer o mesmo no `powershell` ou no `cmd`, posso imaginar que para alguns cenários isso seja importante, então neste caso você talvez considere a instalação através do aplicativo Docker Desktop bom.

Se você preferir uma interface gráfica ao invés de comandos, com certeza usar o aplicativo docker desktop para você será mais adequado.

---

<div data-node-type="callout">
<div data-node-type="callout-emoji">☑</div>
<div data-node-type="callout-text">Com essas vantagens e desvantagens em mente, a instalação do Docker + Docker Compose através do WSL2 é uma opção atraente para desenvolvedores que buscam uma maneira mais eficiente de trabalhar com o Docker no Windows. Se você ainda não experimentou o WSL2, pode ser a hora de dar uma chance e ver como ele pode melhorar o seu fluxo de trabalho.</div>
</div>

---

## Instalação

1- Abra seu terminal `ssh`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1680699673926/fe4903fa-b5a9-46b5-b8a3-3ab68f641dc7.png align="center")

2- Insira o comando:

> **Embora o site oficial do Docker mencione um mínimo de 4GB de RAM necessários, na maioria das vezes 2 GB de RAM poderá ser o suficiente para muitas cargas de trabalhos, esse script funcionou bem para:**
> 
> * Mínimo de 512 MB RAM
>     
> * Mínimo de 2vCPU (core)
>     
> * Mínimo de 20 GB SSD
>     
> 
> Em versões:
> 
> * **Ubuntu 20.04 Focal Fossa**
>     
> * **Ubuntu 22.04 Jammy Jellyfish**
>     
> 
> Em arquiteturas:
> 
> * amd64
>     
> * arm64
>     

```bash
# Detect architecture
ARCH=$(dpkg --print-architecture) && \

# Update package index
sudo apt update -y && \

# Get latest Docker version
DOCKER_VERSION=$(curl -s https://api.github.com/repos/docker/docker-ce/releases/latest \
| grep 'tag_name' \
| cut -d'"' -f4) && \

# Get latest Docker Compose version
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest \
| grep 'tag_name' \
| cut -d'"' -f4) && \

# Install packages necessary to add repositories over HTTPS
sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release && \

# Add Docker's GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg \
--dearmor \
--yes \
--output /etc/apt/trusted.gpg.d/docker.gpg && \

# Add Docker repository
sudo add-apt-repository -y \
"deb [arch=$ARCH] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" && \

# Update package index again
sudo apt update -y && \

# Install latest Docker, Docker Compose, and containerd
sudo apt install -y \
docker-ce \
docker-ce-cli \
containerd.io && \

# Download latest Docker Compose
sudo curl \
-L "https://github.com/docker/compose/releases/download/$COMPOSE_VERSION/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose && \

# Make Docker Compose executable
sudo chmod +x /usr/local/bin/docker-compose && \

# Add current user to "docker" group
sudo usermod -aG docker $USER && \

# Checks if you are on WSL 2
if grep -qE "(Microsoft|WSL)" /proc/version; then

  # Configure Docker to start on WSL boot
  if ! grep -q "service docker start" /etc/wsl.conf; then
    echo "[boot] command = service docker start" \
      | sudo tee -a /etc/wsl.conf > /dev/null
  fi

fi && \

# Show Docker and Docker Compose versions
echo "============================================" && \
echo "Docker and Docker Compose Versions Installed" && \
docker --version && \
docker-compose --version && \
echo "============================================" && \

# Restart shell to apply settings
if [ -n "$BASH" ]; then
    exec bash
elif [ -n "$ZSH_VERSION" ]; then
    exec zsh
fi
```

<div data-node-type="callout">
<div data-node-type="callout-emoji">☑</div>
<div data-node-type="callout-text">Pronto! Isso é o suficiente para a instalação mais atuais do Docker e Docker Compose! 🥳🎉🚀</div>
</div>

  
Mas se você estiver curioso em descobrir o que cada etapa do comando está fazendo, continue aqui...

---

### Explicando o comando

Para um melhor entendimento, vamos quebrar o comando acima em várias partes e ir explicando passo a passo:

```bash
# Detect architecture
ARCH=$(dpkg --print-architecture) && \
```

Detecta se seu dispositivo possui arquitetura amd64 ou arm64.

```bash
# Update package index
sudo apt update -y && \
```

Atualiza o índice de pacotes disponíveis no sistema.

```bash
# Get latest Docker version
DOCKER_VERSION=$(curl -s https://api.github.com/repos/docker/docker-ce/releases/latest \
| grep 'tag_name' \
| cut -d'"' -f4) && \
```

Obtém a versão mais recente do Docker disponível no repositório do GitHub, analisando a resposta JSON para obter a versão mais recente.

```bash
# Get latest Docker Compose version
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest \
| grep 'tag_name' \
| cut -d'"' -f4) && \
```

Obtém a versão mais recente do Docker Compose disponível no repositório do GitHub, analisando a resposta JSON para obter a versão mais recente.

```bash
# Install packages necessary to add repositories over HTTPS 
sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release && \
```

Instala os pacotes necessários para adicionar repositórios através do protocolo HTTPS. Isso é importante para garantir que o software seja instalado a partir de fontes confiáveis. Os pacotes instalados incluem `apt-transport-https`, `ca-certificates`, `curl`, `gnupg` e `lsb-release`.

```bash
# Add Docker's GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg \
--dearmor \
--yes \
--output /etc/apt/trusted.gpg.d/docker.gpg && \
```

Adiciona a chave pública GPG (GNU Privacy Guard) do Docker, que é usada para verificar a integridade e autenticidade do software. A chave é baixada da URL especificada e adicionada ao sistema.

```bash
# Add Docker repository  
sudo add-apt-repository -y \
"deb [arch=$ARCH] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" && \
```

Adiciona o repositório oficial do Docker à lista de repositórios do sistema operacional. A arquitetura do sistema é definida através da variável de ambiente `ARCH` sendo `amd64` ou `arm64` . E a versão do Ubuntu é obtida a partir do comando `lsb_release -cs`.

```bash
# Update package index again
sudo apt update -y && \
```

Atualiza o índice de pacotes do sistema novamente para garantir que as informações do repositório Docker estejam disponíveis para o sistema operacional.

```bash
# Install latest Docker, Docker Compose, and containerd
sudo apt install -y \
docker-ce \
docker-ce-cli \
containerd.io && \
```

Instala as últimas versões do Docker, Docker Compose e containerd. O pacote `containerd.io` é um contêiner runtime.

```bash
# Download latest Docker Compose
sudo curl \
-L "https://github.com/docker/compose/releases/download/$COMPOSE_VERSION/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose && \
```

Baixa a versão mais recente do Docker Compose e salva-a no diretório `/usr/local/bin/`

```bash
# Make Docker Compose executable
sudo chmod +x /usr/local/bin/docker-compose && \
```

Torna o arquivo docker-compose baixado executável.

```bash
# Add current user to "docker" group
sudo usermod -aG docker $USER && \
```

Adiciona o usuário atual ao grupo `docker` para poder executar comandos Docker sem usar `sudo`.

```bash
# Checks if you are on WSL 2
if grep -qE "(Microsoft|WSL)" /proc/version; then

  # Configure Docker to start on WSL boot
  if ! grep -q "service docker start" /etc/wsl.conf; then
    echo "[boot] command = service docker start" \
      | sudo tee -a /etc/wsl.conf > /dev/null
  fi

fi && \
```

Verifica se está em um ambiente WSL2 (Windows Subsystem for Linux) e adiciona uma linha de comando ao arquivo `/etc/wsl.conf`, que configura o Docker para iniciar automaticamente quando o WSL2 (Windows Subsystem for Linux) é iniciado.

```bash
# Show Docker and Docker Compose versions
echo "============================================" && \
echo "Docker and Docker Compose Versions Installed" && \
docker --version && \
docker-compose --version && \
echo "============================================" && \
```

Mostra as versões do Docker e Docker Compose instaladas.

```bash
# Restart shell to apply settings
if [ -n "$BASH" ]; then
    exec bash
elif [ -n "$ZSH_VERSION" ]; then
    exec zsh
fi
```

Reinicia o shell do usuário, a ideia é que, ao instalar o Docker, algumas configurações do ambiente precisam ser atualizadas, e isso pode não ser feito automaticamente pelo sistema. Portanto, o script verifica se o shell em uso é o Bash ou o Zsh e executa o comando `exec` para reiniciar o shell e aplicar as novas configurações.

O comando `exec` é usado para substituir o processo atual pelo processo especificado, neste caso, o shell. Isso faz com que as novas configurações sejam aplicadas sem a necessidade de reiniciar a sessão do usuário ou reiniciar o computador.

---

## Conclusão

Neste artigo descobrimos como podemos instalar as versões mais atuais do Docker e Docker Compose no Windows 11 sem a necessidade de usar o aplicativo Docker Desktop e também no Linux Ubuntu, vimos também algumas vantagens nessa instalação através do WSL2, disponibilizamos um único comando que faz tudo e ainda explicamos cada etapa para um melhor entendimento.

<div data-node-type="callout">
<div data-node-type="callout-emoji">✅</div>
<div data-node-type="callout-text">Espero que essas informações tenham sido úteis 😀👍</div>
</div>
