modulo_08_ambiente_desenvolvimento

View the Project on GitHub ricardotecpro/modulo_08_ambiente_desenvolvimento

ricardotecpro.github.io

🐳 Docker

Fundamentos e práticas essenciais do Docker

📜 Tópicos

  1. O Problema: “Funciona na Minha Máquina!”
  2. O Que é Docker?
    • Contêineres: A Solução Mágica
    • Imagens Docker: A Receita do Bolo
  3. Docker Hub: Seu Universo de Imagens Docker
    • Principais Características e Funcionalidades
    • Interagindo com o Docker Hub via CLI
    • Benefícios de Usar o Docker Hub
  4. Contêineres vs. Máquinas Virtuais (VMs)
  5. Vantagens de Usar Docker
    • Eficiência e Leveza
    • Portabilidade e Consistência
    • Agilidade no Desenvolvimento e CI/CD
  6. Instalando o Docker
    • Windows (com Docker Desktop e WSL2)
    • macOS (com Docker Desktop)
    • Linux (Docker Engine e Docker Desktop)
    • Verificando a Instalação (docker run hello-world)
  7. Primeiros Passos: Trabalhando com Contêineres Prontos
    • Buscando e Baixando Imagens do Docker Hub (docker search, docker pull)
    • Executando seu Primeiro Contêiner (docker run)
    • Listando Contêineres (docker ps)
    • Parando e Iniciando Contêineres (docker stop, docker start, docker restart)
    • Acessando Logs (docker logs)
    • Executando Comandos Dentro de um Contêiner (docker exec)
    • Removendo Contêineres e Imagens (docker rm, docker rmi)
  8. Criando Suas Próprias Aplicações com Docker
    • Entendendo o Dockerfile: A Receita da Sua Aplicação
    • Construindo Sua Imagem (docker build)
    • Exemplo Prático: Dockerizando uma Aplicação
    • Marcando (Tag) e Enviando (Push) Imagens para o Docker Hub
  9. Gerenciando Dados em Contêineres (Volumes)
  10. Orquestrando Múltiplos Contêineres com Docker Compose
  11. Docker no Ecossistema de Contêineres: Uma Comparação
  12. Breve Olhar: História e Evolução do Docker
  13. Integração com Ferramentas de Desenvolvimento (IDEs)
  14. Conclusão e Próximos Passos

1. 🤔 O Problema: “Funciona na Minha Máquina!”

Todo desenvolvedor já passou por isso: você desenvolve uma aplicação, ela funciona perfeitamente no seu computador, mas ao tentar executá-la em outra máquina (de um colega, do servidor de testes ou de produção), surgem problemas de compatibilidade, dependências ausentes ou versões conflitantes de software. Esse é o clássico “mas funciona na minha máquina!”.

É aqui que o Docker entra como uma solução elegante.

2. 💡 O Que é Docker?

Docker é uma plataforma de código aberto que automatiza o deploy (implantação), o dimensionamento e a gestão de aplicações dentro de unidades padronizadas chamadas contêineres. Ele permite que desenvolvedores “empacotem” uma aplicação com todas as suas dependências (bibliotecas, frameworks, arquivos de configuração, etc.) em um único objeto.

📦 Contêineres: A Solução Mágica

Contêineres são unidades leves e isoladas que empacotam aplicações e suas dependências, garantindo consistência no ambiente de execução. Eles executam diretamente sobre o kernel do sistema operacional hospedeiro, o que os torna mais eficientes em termos de recursos do que máquinas virtuais tradicionais.

📜 Imagens Docker: A Receita do Bolo

Uma imagem Docker é um template somente leitura com instruções para criar um contêiner Docker. Pense nela como uma “receita” ou um “snapshot” que define o estado inicial do contêiner, incluindo o sistema operacional base, as aplicações e todas as suas dependências.

3. ✨ Docker Hub: Seu Universo de Imagens Docker

O Docker Hub é o registro de imagens oficial e o maior do mundo, fornecido pela Docker Inc. Ele serve como um repositório centralizado para encontrar, compartilhar e gerenciar imagens de contêineres. Pense nele como o GitHub, mas para imagens Docker.

Principais Características e Funcionalidades:

Interagindo com o Docker Hub via CLI:

  1. Login:
    docker login
    # Você será solicitado a inserir seu Docker ID (nome de usuário) e senha.
    
  2. Buscar Imagens (mais eficaz no site):
    docker search termo_de_busca
    # Exemplo: docker search ubuntu
    
  3. Baixar (Pull) Imagens:
    docker pull nome_da_imagem:tag
    # Exemplo: docker pull ubuntu:22.04
    
  4. Marcar (Tag) Imagens para o Hub:
    docker tag minha-app-local:1.0 seu_docker_id/nome_do_repo_no_hub:1.0
    
  5. Enviar (Push) Imagens:
    docker push seu_docker_id/nome_do_repo_no_hub:1.0
    

Benefícios de Usar o Docker Hub:

4. 🆚 Contêineres vs. Máquinas Virtuais (VMs)

É comum confundir contêineres com Máquinas Virtuais (VMs), mas eles funcionam de maneiras diferentes:

    +-------------------+      +-------------------+
    |    Aplicação A    |      |    Aplicação B    |
    +-------------------+      +-------------------+
    | Bins/Libs (App A) |      | Bins/Libs (App B) |
    +-------------------+      +-------------------+
    |     Docker Engine / Container Runtime         |
    +-----------------------------------------------+
    |          Sistema Operacional Host             |
    +-----------------------------------------------+
    |                   Hardware                    |
    +-----------------------------------------------+
                Arquitetura de Contêineres

    +---------------+  +---------------+
    |  Aplicação A  |  |  Aplicação B  |
    +---------------+  +---------------+
    |  Bins/Libs A  |  |  Bins/Libs B  |
    +---------------+  +---------------+
    | S.O. Convidado|  | S.O. Convidado|  <-- Cada VM tem seu S.O.
    +---------------+  +---------------+
    |           Hypervisor             |
    +----------------------------------+
    |      Sistema Operacional Host    |
    +----------------------------------+
    |              Hardware            |
    +----------------------------------+
              Arquitetura de VMs

5. ✅ Vantagens de Usar Docker

Adotar o Docker traz inúmeros benefícios para o ciclo de vida de desenvolvimento de software:

⚙️ Eficiência e Leveza

📦 Portabilidade e Consistência

🚀 Agilidade no Desenvolvimento e CI/CD

6. 💻 Instalando o Docker

Para começar a usar o Docker, você precisa instalá-lo em seu sistema. A forma mais comum para desktops é o Docker Desktop.

Instalação no Windows

🍏 Instalação no macOS

🐧 Instalação no Linux

Pode ser via Docker Desktop ou instalando o Docker Engine diretamente.

✅ Verificando a Instalação (docker run hello-world)

Após a instalação, abra um terminal e verifique se tudo está funcionando:

docker --version
docker info
docker run hello-world

Se você vir uma mensagem de boas-vindas do hello-world, sua instalação está correta!

7. 🚀 Primeiros Passos: Trabalhando com Contêineres Prontos

Agora que o Docker está instalado, vamos explorar como usar contêineres existentes.

🔍 Buscando e Baixando Imagens do Docker Hub (docker search, docker pull)

O Docker Hub é o principal local para encontrar imagens.

docker search nginx
docker pull nginx:latest

▶️ Executando seu Primeiro Contêiner (docker run)

O comando docker run é utilizado para iniciar um novo contêiner a partir de uma imagem especificada.

docker run --name meu-nginx-web -p 8080:80 -d nginx

📋 Listando Contêineres (docker ps)

O comando docker ps lista todos os contêineres em execução, fornecendo informações essenciais.

docker ps
docker ps -a # Lista todos, incluindo os parados

⏯️ Parando e Iniciando Contêineres (docker stop, docker start, docker restart)

O comando docker stop é usado para parar um ou mais contêineres em execução de forma segura.

docker stop meu-nginx-web
docker start meu-nginx-web
docker restart meu-nginx-web

📜 Acessando Logs (docker logs)

docker logs meu-nginx-web
docker logs -f meu-nginx-web # Segue os logs

Executando Comandos Dentro de um Contêiner (docker exec)

docker exec -it meu-nginx-web bash

🗑️ Removendo Contêineres e Imagens (docker rm, docker rmi)

docker rm meu-nginx-web # Remove contêiner parado
docker rmi nginx # Remove imagem (se não usada por contêineres)

8. 🛠️ Criando Suas Próprias Aplicações com Docker

Empacote suas aplicações usando um Dockerfile. Isso permite criar contêineres personalizados adaptados às suas necessidades.

📄 Entendendo o Dockerfile: A Receita da Sua Aplicação

Um Dockerfile é um arquivo de texto com instruções para construir uma imagem Docker.

🧱 Construindo Sua Imagem (docker build)

docker build -t nome-da-sua-imagem:tag .

✨ Exemplo Prático: Dockerizando uma Aplicação

(Segue o exemplo Node.js já fornecido anteriormente)

  1. Crie app.js e package.json.
  2. Crie o Dockerfile:
    FROM node:18-alpine
    WORKDIR /usr/src/app
    COPY package*.json ./
    RUN npm install
    COPY . .
    EXPOSE 3000
    CMD [ "npm", "start" ]
    
  3. Construa: docker build -t meu-app-node .
  4. Execute: docker run -p 3000:3000 -d meu-app-node

⬆️ Marcando (Tag) e Enviando (Push) Imagens para o Docker Hub

Depois de construir e testar sua imagem localmente, você pode compartilhá-la no Docker Hub (ou outro registro).

  1. Login (se ainda não fez): docker login
  2. Tag: docker tag meu-app-node:latest seu_docker_id/meu-app-node:1.0
  3. Push: docker push seu_docker_id/meu-app-node:1.0

9. 💾 Gerenciando Dados em Contêineres (Volumes)

É importante entender a persistência de dados em contêineres para garantir que seus dados sejam salvos e acessíveis.

10. 🔗 Orquestrando Múltiplos Contêineres com Docker Compose

Para aplicações com múltiplos serviços, use o Docker Compose.

11. 🆚 Docker no Ecossistema de Contêineres: Uma Comparação

Característica Docker (com Docker Engine) Podman (com Buildah & Skopeo) LXC/LXD containerd (com nerdctl) Kubernetes (Orquestrador)
Arquitetura Daemon (dockerd) Daemonless (interage diretamente com o kernel) Daemon (LXD) ou bibliotecas (LXC) Daemon (containerd) Arquitetura complexa de master/nodos com múltiplos daemons
Foco Principal Plataforma completa para desenvolvimento, build e execução de apps Alternativa ao Docker CLI, foco em segurança (rootless by default) Contêineres de sistema (mais parecidos com VMs leves) Runtime de contêineres de baixo nível, padrão da indústria Orquestração de contêineres em larga escala
OCI Compliance Sim (usa containerd por baixo) Sim Sim (para imagens OCI com LXD) Sim (é um runtime OCI) Sim (usa runtimes OCI como containerd ou CRI-O)
Build de Imagens docker build (Dockerfile) podman build (Dockerfile), buildah bud Suporte para Dockerfile via LXD, ou criação de templates LXC nerdctl build (Dockerfile) Não constrói imagens diretamente; consome imagens prontas
CLI docker podman (compatível com muitos comandos Docker) lxc, lxd (com lxc) nerdctl (compatível com Docker CLI), ctr (mais baixo nível) kubectl
Segurança (Rootless) Suportado (requer configuração) Padrão e mais robusto Suportado Suportado (com configuração) Suportado (configurável nos Pods e runtimes)
Gestão de Imagens Docker Hub, registros privados Registros OCI (Docker Hub, Quay.io, etc.) Registros de imagens LXD, Docker Hub Registros OCI Registros OCI
Composição (Multi-contêiner local) Docker Compose Podman Compose, ou gerenciamento de Pods (conceito do K8s) Não tem ferramenta de composição análoga direta nerdctl compose Pods (definidos em YAML)
Comunidade/Ecossistema Enorme, muito maduro Crescente, forte na comunidade Red Hat/Linux Estabelecida, especialmente para contêineres de sistema Linux Forte (componente central do Docker e Kubernetes) Enorme, padrão de fato para orquestração
Casos de Uso Típicos Desenvolvimento de apps, CI/CD, deploy em pequena/média escala Ambientes que exigem mais segurança, alternativa ao daemon Docker Isolar serviços ou aplicações completas como se fossem VMs Componente de runtime para plataformas como Docker ou K8s Deploy, escalonamento e gerenciamento de apps em produção

12. ⏳ Breve Olhar: História e Evolução do Docker

13. 🛠️ Integração com Ferramentas de Desenvolvimento (IDEs)

14. 🎉 Conclusão e Próximos Passos

Docker revolucionou o desenvolvimento de aplicações. Com este manual, você possui as bases para começar a utilizar o Docker. Ele oferece funcionalidades poderosas que melhoram a eficiência e a escalabilidade.

Próximos Passos:

  1. Pratique! Containerize suas aplicações.
  2. Explore Dockerfiles avançados (multi-stage builds).
  3. Aprofunde-se em Redes Docker.
  4. Estude Orquestração (Kubernetes).
  5. Segurança em Contêineres.

📘 Referências e Recursos Adicionais

15. 📚 Exemplos Práticos

Exemplo 1: Dockerizando uma Aplicação Java Simples

Para criar uma aplicação Java simples e dockerizá-la, siga os passos abaixo:

Docker Exemplo 1