GH GambleHub

Contêiner: Docker e OCI

Contêiner: Docker e OCI

1) Conceitos básicos e normas OCI

OCI Image Spec - formato de imagem (manifesto, config, camadas, index para multi-arch).
OCI Runtime Spec - como executar o contêiner ('bundle,' config. json`); implementação: runc e gVisor, Kata Containers.
OCI Distribuição Spec - Interação de registros (push/pull, autorização).

Docker = UX e ecossistema em torno do OCI: Dockerfile/BuildKit/CLI/Compose/Hub. Em Kubernetes Docker Engine substituído por containerd/CRI-O, mas o formato de imagem é o mesmo.

2) Imagens: camadas, marcas de formatação, metadados

Образ = слои (layered filesystem) + config (entrypoint/cmd/env/labels) + manifest.
Tags: Não use ': latest' na venda; pinning '1. 21. 3 ', git-SHA ou data + SHA.
LABEL: proprietário, contato, endereço vcs, org. opencontainers. (title, description, revision, source).
Multi-arch: O índice manifesto dá a opção correta para 'amd64/arm64'.

3) Montagem: Dockerfile, BuildKit, multi-estágio

3. 1 Princípios

Minimize as camadas, capte as versões, limpe os cachês dos gerentes de lote.
Primeiro, copie os arquivos manifest/lock e, em seguida, 'RUN install deps' - melhora o dinheiro.
.dockerignore é obrigatório (exclua '.git', artefatos, segredos).
As amostras de distroless/alpine/bases mínimas são preferidas.

3. 2 fichas BuildKit

Bilds paralelos, segredos na montagem ('--secret'), cash mount, buildx para multi-arch.

Exemplo de dinheiro-mount:
dockerfile syntax=docker/dockerfile:1. 6
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements. txt

3. 3 Multi-estágio exemplos

Go (estaticamente linear, distroless):
dockerfile syntax=docker/dockerfile:1. 6
FROM golang:1. 23 AS build
WORKDIR /src
COPY go. mod go. sum./
RUN go mod download
COPY..
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o /app

FROM gcr. io/distroless/static:nonroot
USER 65532:65532
COPY --from=build /app /app
ENTRYPOINT ["/app"]
Node. js (camada de prod sem dave-deps):
dockerfile syntax=docker/dockerfile:1. 6
FROM node:22-alpine AS deps
WORKDIR /app
COPY package. json./
RUN npm ci --omit=dev

FROM node:22-alpine AS build
WORKDIR /app
COPY --from=deps /app/node_modules./node_modules
COPY..
RUN npm run build

FROM node:22-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=deps /app/node_modules./node_modules
COPY --from=build /app/dist./dist
USER node
CMD ["node","dist/server. js"]
Python (wheel-кеш, non-root):
dockerfile syntax=docker/dockerfile:1. 6
FROM python:3. 12-slim AS base
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1
WORKDIR /app

FROM base AS deps
RUN --mount=type=cache,target=/root/.cache/pip pip install --upgrade pip
COPY requirements. txt.
RUN --mount=type=cache,target=/root/.cache/pip pip wheel --wheel-dir=/wheels -r requirements. txt

FROM base
COPY --from=deps /wheels /wheels
RUN pip install --no-index --find-links=/wheels -r /app/requirements. txt && rm -rf /wheels
COPY..
USER 1000:1000
CMD ["python","-m","app"]
Java (JLink/Layered Spring):
dockerfile syntax=docker/dockerfile:1. 6
FROM maven:3. 9-eclipse-temurin-21 AS build
WORKDIR /src
COPY pom. xml./
RUN mvn -q -e -DskipTests dependency:go-offline
COPY..
RUN mvn -q -DskipTests package

FROM eclipse-temurin:21-jre
WORKDIR /app
COPY --from=build /src/target/app. jar /app/app. jar
ENTRYPOINT ["java","-XX:+UseContainerSupport","-jar","/app/app. jar"]

4) Imagens mínimas, PID 1 e sinais

Distroless - menor superfície de ataque, sem shell/gerenciador de pacotes.

O PID 1 deve proxitar corretamente os sinais, senão os processos zombies. Use 'ENTRYPOINT' no formulário exec e tini/init incorporado:
dockerfile
ENTRYPOINT ["tini","--","/app"]

'HEALTHCHECK' é razoável (frequência/tempo, sem excesso de carga).

5) Segurança dos contêineres

5. 1 Políticas e hardening

Non-root (USER), rootless Docker/containers.
Capabilities: remova o excesso ('--cap-drop = ALL -cap-add = NET _ BIND _ SERVICE', etc.).
seccomp/AppArmor/SELinux: inclua perfis padrão ou rigorosos.
Read-only FS + `tmpfs` для `/tmp`, no-new-privileges.
Segredos: não em imagens; Montem a partir de um gerente de segredos (K8s/vault/docker secret).

5. 2 Supply chain

SBOM (CycloneDX/SPDX) e digitalização (Trivy/Grype).
Legenda (cosign, sigstore) e política de pull (verify).
Ensaios de atualização: Imagens básicas com patches CVE são regularmente reaproveitadas.

6) Armazenamento e drivers de ficheiros

Por padrão, overlay2 (rápido e estável). Em ambientes rootless muitas vezes fuse-overlayfs.
volumes para dados e dinheiro, bind-mount para desenvolvimento.
Não anote em '/' - Use o caminho de dados ('/data ') e separe o estado da imagem.

7) Rede e DNS

Redes docker: bridge (padrão), host (mínimo overhead, conflitos de portas), none, macvlan/ipvlan (L2/L3 integração).
O DNS Docker tira do servidor/daemon. json; Para o prod, configure as resenhas de kesh locais.
No K8s, a rede controla a CNI (Calico/Cilium/Flannel). Para sidecar/mesh - interceptações (iptáveis).

8) Recursos e QoS (cgroups v2)

Limitações: '--cpus', '-memory', '-pids-limit', '-cpuset-cpus'.
Instale requests/limits (em K8s) → afeta o planejamento e a QoS.
Monitora OMKilled, throttling, latency spikes devido a GC/IO.

Exemplos de execução:
bash docker run --cpus=1. 5 --memory=512m --pids-limit=256 --read-only --tmpfs /tmp:rw,size=64m...

9) Logos e observação

Controladores de logs: 'json-figs' (rotativo),' jornald ',' gelf ',' awslogs', 'syslog'.

Configure a rotação:
json
{ "log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"5"} }

Métricas: Docker Engine API, cAdvisor, node exportadores; rastreamento através de um agente no contêiner ou sidecar.

10) Maiúsculas e autenticação

Registos privados: ECR/GCR/ACR/Harbor/GitHub Container Registry.
Rate-limits Docker Hub; use espelhos/cajas (registry-cache).
Política de retenção/imutable tags, replicação entre regiões.
'docker login' não seja armazenado em script; use segredos CI e OIDC.

11) docker-compose vs orquestradores

Compose - desenvolvimento local/estandes de integração.
Прод: Kubernetes (Deployment/StatefulSet/DaemonSet, Ingress, Secrets, PVC) с containerd/CRI-O; políticas de segurança e estratégias rollout.
O Swarm é obsoleto para grandes vendas, adequado para clusters simples.

Exemplo de compose (estande):
yaml version: "3. 9"
services:
api:
build:.
ports: ["8080:8080"]
environment: ["DB_URL=postgres://pg/DB"]
depends_on: ["pg"]
pg:
image: postgres:16-alpine volumes: ["pgdata:/var/lib/postgresql/data"]
volumes: { pgdata: {} }

12) Healthcheck, início/parar, graceful shutdown

Use 'HEALTHCHECK' com os horários e restrições de 'retries'.
Graceful correto: pegue no SIGTERM, complete as entradas, feche as ligações e saia.
В K8s: `preStop` hook + `terminationGracePeriodSeconds`, readiness перед liveness.

13) Best pratices em línguas/vidros (resumo)

Node: 'npm ci', 'NODE _ ENV = produtividade', desligar dave-deps em runtime, '--heapsnapshot' off, 'uWS/GZip' por proxy L7.
Python: wheels, 'gunicorn --graceful-timeout', 'GTHREADS '/' UVICorn' por CPU, não armazenar vev dentro da camada compartilhada sem necessidade.
Go: CGO off (se possível), '-ldflags =' -s -w ', distroless/static,' GOMAXPROCs' por cgroups.
Java: JAR de camada, '- XX:MaxRAMPercentage', CDS/Layered JAR para o cachê.

14) Suply chain e política de imagem

Mantenha o SBOM na CI, mantenha-o ao lado do artefato.
Escaneie as imagens em cada canhão; gate para CVE crítico.
Assine imagens (cosign), inclua policy controler (K8s - Kyverno/Conftest/Gatekeeper).
Separe build e run ensinamentos/redes; armazenem as dependências no registro privado.

15) Anti-pattern

': latest' em venda; não há marcas de formatação.
Montagem «dentro de um local de prod» sem isolamento; armazenamento de segredos em Dockerfile.
Lançamento sob root, '--privileged', amplas capabilities.
Imagens grossas (> 1-2 GB), sem. dockerignore.
A lógica init no ENTRYPOINT através do formato shell → problemas de sinalização.
Escrever dados permanentes em camada de contêiner em vez de volume.
Healthcheck, que faz pedidos caros de prod-BD.

16) Folha de cheque de implementação (0-45 dias)

0-10 dias

Normalizar Dockerfile (multi-studio, .dockerignore, LABEL, pinned base).
Activar BuildKit/buildx, cash mountain para gerentes de pacotes.
Ir para não-root e 'seccomp '/ AppArmor/SELinux perfis padrão.

11 a 25 dias

Minimizar imagens runtime (alpine/distroless), ajustar com logs (rotação).
Ajustar limites de recursos, healthchecks, PID 1/tini correto.
Levantar o registro privado/kesh, ligar o scanner CVE e a geração de SBOM.

26-45 dias

Digite uma assinatura de imagem e uma política de tolerância no cluster.
Organizar multi-arch (amd64/arm64) para os serviços desejados.
Documentar runbook de montagem/lançamento, relatório de tamanho/vulnerabilidade/tempo de montagem.

17) Métricas de maturidade

Marcas de formatação imutáveis e montagens reproduzíveis para ≥ 95% dos serviços.
Tamanho médio da imagem runtime <200-300 MB (vidro).
100% dos contêineres prod - não-root, com capabilidades limitadas e read-only FS.
SBOM e digitalização CVE para cada push; CVE crítico → bloqueado.
Assinando imagens e policy-enforcement em ambientes.
Tempo de partida do contêiner frio ≤ SLO alvo (por exemplo, 2-5 segundos), graceful shutdown correto.

18) Conclusão

Contêineres adultos são padrões OCI + disciplina de montagem + segurança padrão + observabilidade e política de fornecimento. Use multi-estágio e BuildKit, minimize imagens runtime, execute não-root sob perfis rigorosos, anote marcas de formatação, escaneie e assine, mantenha logs/recursos/rede sob controle. Assim, os contentores serão a base previsível e controlada de sua plataforma, desde o desenvolvimento até a produção.

Contact

Entrar em contacto

Contacte-nos para qualquer questão ou necessidade de apoio.Estamos sempre prontos para ajudar!

Telegram
@Gamble_GC
Iniciar integração

O Email é obrigatório. Telegram ou WhatsApp — opcionais.

O seu nome opcional
Email opcional
Assunto opcional
Mensagem opcional
Telegram opcional
@
Se indicar Telegram — responderemos também por lá.
WhatsApp opcional
Formato: +indicativo e número (ex.: +351XXXXXXXXX).

Ao clicar, concorda com o tratamento dos seus dados.