AWS: Guia Completo de Cloud Computing Para Empresas
Descubra como Amazon Web Services transformou a forma como empresas constroem, escalam e operam infraestrutura tecnológica moderna.
Entenda como Docker revolucionou o deployment de aplicações com containers, eliminando o famoso 'funciona na minha máquina' para sempre.
Equipe Arkanus
27/10/2025
"Funciona na minha máquina" - a frase que assombrou desenvolvedores por décadas. Docker eliminou esse problema ao empacotar aplicações com todas as suas dependências em containers portáteis que rodam consistentemente em qualquer ambiente.
Docker é uma plataforma de containerização que permite empacotar aplicações e suas dependências em containers isolados, leves e portáteis. Ao contrário de máquinas virtuais que virtualizam hardware completo, containers compartilham o kernel do sistema operacional, resultando em footprint mínimo e startup instantâneo.
Máquinas Virtuais
Containers Docker
VM Architecture:
[App A] [App B] [App C]
[Guest OS] [Guest OS] [Guest OS]
[Hypervisor]
[Host OS]
[Infrastructure]
Docker Architecture:
[App A] [App B] [App C]
[Docker Engine]
[Host OS]
[Infrastructure]
# Dockerfile define ambiente exato
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Esse container roda identicamente em:
Múltiplas versões coexistindo pacificamente:
# App A com Node 14
docker run -p 3000:3000 app-a:node14
# App B com Node 18
docker run -p 3001:3000 app-b:node18
# App C com Python 3.11
docker run -p 3002:8000 app-c:python311
Zero conflitos. Cada container é independente.
Clone repo, rode um comando:
git clone https://github.com/user/projeto
cd projeto
docker-compose up
Em minutos, ambiente completo funciona - banco de dados, cache, APIs, tudo.
Build uma vez, deploy em qualquer lugar:
# Build
docker build -t meuapp:v1.0.0 .
# Push para registry
docker push registry.empresa.com/meuapp:v1.0.0
# Deploy (em qualquer servidor)
docker run -d -p 80:3000 registry.empresa.com/meuapp:v1.0.0
Templates read-only para criar containers:
# Baixar image
docker pull nginx:alpine
# Listar images
docker images
# Remover image
docker rmi nginx:alpine
Instâncias executáveis de images:
# Criar e iniciar container
docker run -d --name meu-nginx -p 8080:80 nginx:alpine
# Listar containers rodando
docker ps
# Parar container
docker stop meu-nginx
# Remover container
docker rm meu-nginx
Receita para construir images:
# Base image
FROM node:18-alpine
# Metadata
LABEL maintainer="dev@arkanus.app"
LABEL version="1.0"
# Variáveis de ambiente
ENV NODE_ENV=production
ENV PORT=3000
# Working directory
WORKDIR /app
# Copiar dependências
COPY package*.json ./
# Instalar dependências
RUN npm ci --only=production && \
npm cache clean --force
# Copiar código
COPY . .
# Build (se necessário)
RUN npm run build
# Expor porta
EXPOSE $PORT
# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s \
CMD node healthcheck.js
# Usuário não-root (segurança)
USER node
# Comando de inicio
CMD ["node", "dist/server.js"]
Orquestrar múltiplos containers:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DATABASE_URL=postgres://db:5432/myapp
depends_on:
- db
- redis
volumes:
- ./src:/app/src # Hot reload
networks:
- app-network
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- app-network
redis:
image: redis:7-alpine
networks:
- app-network
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- app-network
volumes:
postgres-data:
networks:
app-network:
driver: bridge
Inicie tudo:
docker-compose up -d
Problema: Time com MacOS, Windows, Linux. Versões diferentes de Node, Python, etc.
Solução:
# docker-compose.yml
version: '3.8'
services:
app:
build: .
volumes:
- .:/app
- /app/node_modules
ports:
- "3000:3000"
command: npm run dev
# Todos desenvolvem da mesma forma
docker-compose up
Cada serviço isolado:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Auth │ │ Users │ │ Orders │
│ Service │ │ Service │ │ Service │
│ (Node.js) │ │ (Python) │ │ (Go) │
└─────────────┘ └─────────────┘ └─────────────┘
↓ ↓ ↓
┌─────────────────────────────────────────────────┐
│ Service Mesh (Traefik) │
└─────────────────────────────────────────────────┘
Cada serviço em seu container, tecnologia independente.
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build Docker Image
run: docker build -t myapp:${{ github.sha }} .
- name: Run Tests
run: docker run myapp:${{ github.sha }} npm test
- name: Push to Registry
run: |
docker login registry.empresa.com
docker push myapp:${{ github.sha }}
- name: Deploy to Production
run: |
ssh production "docker pull myapp:${{ github.sha }} && \
docker-compose up -d"
# PostgreSQL
docker run -d \
--name postgres \
-e POSTGRES_PASSWORD=senha \
-p 5432:5432 \
-v postgres-data:/var/lib/postgresql/data \
postgres:15-alpine
# Redis
docker run -d --name redis -p 6379:6379 redis:7-alpine
# MongoDB
docker run -d --name mongo -p 27017:27017 mongo:6
# PGAdmin
docker run -d \
--name pgadmin \
-e PGADMIN_DEFAULT_EMAIL=admin@admin.com \
-e PGADMIN_DEFAULT_PASSWORD=admin \
-p 8080:80 \
dpage/pgadmin4
# ❌ Evite images pesadas
FROM ubuntu:latest # 77MB
RUN apt-get update && apt-get install -y nodejs
# ✅ Use Alpine quando possível
FROM node:18-alpine # 40MB
# Stage 1: Build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: Production
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/server.js"]
Image final contém apenas o necessário para produção.
# .dockerignore
node_modules
npm-debug.log
.git
.env
*.md
.vscode
coverage
.DS_Store
Evita copiar arquivos desnecessários.
# ✅ Ordem otimizada
COPY package*.json ./ # Muda raramente
RUN npm ci # Cache preservado se package.json não mudar
COPY . . # Código muda frequentemente
RUN npm run build
Builds subsequentes são muito mais rápidos.
# Escaneie vulnerabilidades
RUN npm audit
# Usuário não-root
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
USER nodejs
# Minimize permissões
RUN chmod -R 555 /app
# Health checks
HEALTHCHECK CMD curl --fail http://localhost:3000/health || exit 1
services:
db:
image: postgres:15-alpine
volumes:
- postgres-data:/var/lib/postgresql/data # Dados persistem
volumes:
postgres-data: # Volume nomeado gerenciado pelo Docker
Containers na mesma rede comunicam por nome:
services:
app:
networks:
- backend
db:
networks:
- backend
networks:
backend:
App acessa DB via http://db:5432.
Container usa rede do host diretamente:
docker run --network host nginx
Performance máxima, mas perde isolamento.
Para Docker Swarm, conecta containers entre múltiplos hosts.
docker volume create meu-volume
docker run -v meu-volume:/app/data myapp
docker run -v $(pwd)/src:/app/src myapp
Mapeia diretório do host diretamente.
Dados em memória (não persistem):
docker run --tmpfs /app/cache myapp
services:
app:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
services:
app:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# Remover containers parados
docker container prune
# Remover images não usadas
docker image prune -a
# Remover tudo não usado
docker system prune -a --volumes
Orquestração nativa do Docker:
# Inicializar swarm
docker swarm init
# Deploy stack
docker stack deploy -c docker-compose.yml myapp
# Scale service
docker service scale myapp_web=5
Orquestração enterprise:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0.0
ports:
- containerPort: 3000
Docker Hub: Público e privado AWS ECR: Registry AWS Google GCR: Registry Google Cloud Azure ACR: Registry Azure Self-hosted: Harbor, Nexus
# Push para registry privado
docker tag myapp:1.0.0 registry.empresa.com/myapp:1.0.0
docker push registry.empresa.com/myapp:1.0.0
# Logs
docker logs -f container-name
# Executar comandos
docker exec -it container-name bash
# Inspecionar container
docker inspect container-name
# Stats em tempo real
docker stats
# Top processes
docker top container-name
# Copiar arquivos
docker cp container-name:/app/log.txt ./log.txt
Docker Desktop (Mac/Windows)
Docker Engine (Linux)
Podman: Drop-in replacement, rootless, daemonless containerd: Engine usado pelo Kubernetes LXC/LXD: System containers rkt: Descontinuado, mas influente
Docker domina mercado, mas alternativas existem.
Docker transformou desenvolvimento e deployment de software. Containers eliminaram inconsistências ambientais, simplificaram deployment e permitiram arquiteturas modernas de microserviços.
Benefícios Docker: ✅ Portabilidade total ✅ Isolamento de dependências ✅ Deploy consistente ✅ Escalabilidade fácil ✅ CI/CD simplificado ✅ Desenvolvimento local espelhando produção
Na Arkanus, Docker é fundamental em nossa stack:
Se você quer modernizar sua infraestrutura com containers, estamos aqui para ajudar.
Precisa containerizar suas aplicações? Nossa equipe tem expertise em Docker e Kubernetes. Fale conosco.

Equipe Arkanus
Equipe Arkanus escreve sobre tecnologia, transformação digital e engenharia de software na Arkanus.
Descubra como Amazon Web Services transformou a forma como empresas constroem, escalam e operam infraestrutura tecnológica moderna.