View the Project on GitHub ricardotecpro/modulo_08_ambiente_desenvolvimento
Fundamentos e práticas essenciais do Docker
docker run hello-world
)docker search
, docker pull
)docker run
)docker ps
)docker stop
, docker start
, docker restart
)docker logs
)docker exec
)docker rm
, docker rmi
)Dockerfile
: A Receita da Sua Aplicaçãodocker build
)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.
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 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.
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.
Dockerfile
.docker run <imagem>
, o Docker usa essa imagem para criar e iniciar uma instância executável: o contêiner.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:
ubuntu
, nginx
, node
, python
, postgres
.Dockerfile
e atualizar a imagem no Hub.Interagindo com o Docker Hub via CLI:
docker login
# Você será solicitado a inserir seu Docker ID (nome de usuário) e senha.
docker search termo_de_busca
# Exemplo: docker search ubuntu
docker pull nome_da_imagem:tag
# Exemplo: docker pull ubuntu:22.04
docker tag minha-app-local:1.0 seu_docker_id/nome_do_repo_no_hub:1.0
docker push seu_docker_id/nome_do_repo_no_hub:1.0
Benefícios de Usar o Docker Hub:
É 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
Adotar o Docker traz inúmeros benefícios para o ciclo de vida de desenvolvimento de software:
Para começar a usar o Docker, você precisa instalá-lo em seu sistema. A forma mais comum para desktops é o Docker Desktop.
.dmg
do Docker Desktop..dmg
e arraste o Docker para a pasta Aplicativos.Pode ser via Docker Desktop ou instalando o Docker Engine diretamente.
sudo apt update
, sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
, etc.)sudo yum remove ...
, sudo yum install -y yum-utils
, etc.)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!
Agora que o Docker está instalado, vamos explorar como usar contêineres existentes.
docker search
, docker pull
)O Docker Hub é o principal local para encontrar imagens.
docker search nginx
docker pull nginx:latest
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
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
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
docker logs
)docker logs meu-nginx-web
docker logs -f meu-nginx-web # Segue os logs
docker exec
)docker exec -it meu-nginx-web bash
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)
Empacote suas aplicações usando um Dockerfile
. Isso permite criar contêineres personalizados adaptados às suas necessidades.
Dockerfile
: A Receita da Sua AplicaçãoUm Dockerfile
é um arquivo de texto com instruções para construir uma imagem Docker.
FROM <imagem_base>
WORKDIR /caminho/no/container
COPY <origem> <destino>
RUN <comando>
EXPOSE <porta>
CMD ["executavel", "param1"]
docker build
)docker build -t nome-da-sua-imagem:tag .
(Segue o exemplo Node.js já fornecido anteriormente)
app.js
e package.json
.Dockerfile
:
FROM node:18-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]
docker build -t meu-app-node .
docker run -p 3000:3000 -d meu-app-node
Depois de construir e testar sua imagem localmente, você pode compartilhá-la no Docker Hub (ou outro registro).
docker login
docker tag meu-app-node:latest seu_docker_id/meu-app-node:1.0
docker push seu_docker_id/meu-app-node:1.0
É importante entender a persistência de dados em contêineres para garantir que seus dados sejam salvos e acessíveis.
docker run -v meu-volume:/app/dados minha-imagem
docker run -v /caminho/no/host:/app minha-imagem
Para aplicações com múltiplos serviços, use o Docker Compose.
docker-compose.yml
.docker-compose.yml
:
version: '3.8'
services:
webapp:
build: .
ports: ["3000:3000"]
volumes: [".:/usr/src/app"]
environment: ["DB_HOST=db"]
depends_on: [db]
db:
image: postgres:15-alpine
volumes: ["postgres_data:/var/lib/postgresql/data"]
environment: ["POSTGRES_USER=user", "POSTGRES_PASSWORD=pass"]
volumes:
postgres_data:
docker-compose up -d
, docker-compose down
, docker-compose ps
, docker-compose logs webapp
.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 |
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:
Para criar uma aplicação Java simples e dockerizá-la, siga os passos abaixo: