GH GambleHub

コンテナ化:DockerとOCI

コンテナ化: DockerとOCI

1)基本的なOCIの概念と標準

OCI Image Spec-画像フォーマット(マニフェスト、構成、レイヤー、マルチアーチ用インデックス)。
OCI Runtime Spec-コンテナ(bundle、 'config。json');実装:runcならびにgVisor、 Kata Containers。
OCI Distribution Spec-レジストリとの相互作用(プッシュ/プル、承認)。

Docker=UXとOCI周辺のエコシステム:Dockerfile/BuildKit/CLI/Compose/Hub。Kubernetesでは、Docker Engineはcontainerd/CRI-Oに置き換えられますが、画像形式は同じです。

2)外観: レイヤー、タグ、メタデータ

mainest (entrypoint/cmd/env/labels)+config (entrypoint/cmd/env/labels)

タグ:prodで':latest'を使用しないでください。ピン留め':1。21.3'、git-SHAまたはdate+SHA。
LABEL:オーナー、コンタクト、vcs-url、 org。opencontainers。(タイトル、説明、リビジョン、ソース)。
マルチアーチ:インデックス・マニフェストは'amd64/arm64'の正しいオプションを与えます。

3)ビルド: Dockerfile、 BuildKit、マルチステージ

3.1原則

レイヤーの最小化、バージョンの修正、パッケージマネージャキャッシュのクリーン化。
最初にマニフェスト/ロックファイルをコピーし、'RUN install deps'-キャッシュを改善します。
。dockerignoreが必要です('。git'、アーティファクト、シークレットを除く)。
distroless/alpine/minimumの塩基の例は好まれます。

3.2 BuildKitチップ

並列ビルド、アセンブリ内の秘密('--secret')、キャッシュマウント、マルチアーチ用のbuildx。

キャッシュマウントの例:
dockerfile syntax=docker/dockerfile:1. 6
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements. txt

3.3マルチステージの例

移動(静的にリンクされ、歪みのない):
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"]
ノード。js (dev-depsのないprod-layer):
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(ホイール-ルートなし):
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)最低のイメージ、PID 1および信号

ディストロレス-攻撃面が小さく、シェル/パッケージマネージャがありません。

PID 1は正しくプロキシ信号、そうでなければ"ゾンビプロセス。"exec形式で'ENTRYPOINT'を使用し、tini/init initを使用します:
dockerfile
ENTRYPOINT ["tini","--","/app"]

'HEALTHCHECK'は合理的です(周波数/タイムアウト、不要な負荷なし)。

5)容器の保証

5.1方針と硬化

root以外(USER)、 rootless Docker/containers。
機能:不要な削除('--cap-drop=ALL --cap-add=NET_BIND_SERVICE'など)。
seccomp/AppArmor/SELinux:デフォルトまたは厳密なプロファイルを有効にします。
読み取り専用のFS+'tmpfs'は'/tmp'、新しい権限はありません。
秘密:画像ではありません。K8s/vault/dockerの秘密のマネージャーからマウント。

5.2サプライチェーン

SBOM (CycloneDX/SPDX)とスキャン(Trivy/Grype)。
署名(cosign、 sigstore)とプルポリシー(verify)。
更新のリハーサル:CVEパッチを使用したベースイメージは定期的に再構築されます。

6)ストレージとファイルドライバ

デフォルトはオーバーレイ2(高速で安定)です。ルートレス環境では、しばしばヒューズ-オーバーレイフ。
データとキャッシュのボリューム、開発用のバインドマウント。
'/'に書き込まないでください-データパス('/data')を使用してください。

7)ネットワークおよびDNS

Dockerネットワーク:ブリッジ(デフォルト)、ホスト(最小オーバーヘッド、ポート競合)、なし、macvlan/ipvlan (L2/L3統合)。
Docker DNSリゾルバは、ホストから/デーモンを取得します。json;prodの場合は、ローカルリゾルバーキャッシュを設定します。
K8sでは、ネットワークはCNI (Calico/Cilium/Flannel)によって管理されています。サイドカー/メッシュ-インターセプト(iptables)。

8)リソースとQoS (cgroups v2)

制限:'--cpus'、 '--memory'、 '--pids-limit'、 '--cpuset-cpus'。
リクエスト/リミットの設定(K8s)→スケジュールとQoSに影響します。
GC/IOによるOOMKilled、スロットリング、レイテンシのスパイクを監視します。

起動の例:
bash docker run --cpus=1. 5 --memory=512m --pids-limit=256 --read-only --tmpfs /tmp:rw,size=64m...

9)ログと観測可能性

ログドライバ:'json-file'(回転付き)、'journal'、 'gelf'、 'awslogs'、' syslog'。

回転をセットアップして下さい:
json
{ "log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"5"} }

メトリクス:Docker Engine API、 cAdvisor、 node exporter;コンテナまたはサイドカーのエージェントをトレースします。

10)登録と認証

プライベートレジストリ:ECR/GCR/ACR/Harbor/GitHubコンテナレジストリ。
レート制限Docker Hub;mirrors/cache (registry-cache)を使用します。
保持/不変タグポリシー、リージョン間のレプリケーション。
'docker login'はスクリプトに保存されません。CIシークレットとOIDCフェデレーションを使用します。

11) docker-compose vsオーケストレーター

構成-ローカル開発/統合スタンド。
Kubernetes (Deployment/StatefulSet/DaemonSet、 Ingress、 Secrets、 PVC)-containerd/CRI-O;セキュリティポリシーとロールアウト戦略。
Swarmは大規模な販売のために時代遅れで、シンプルなクラスターに適しています。

例compose (stand):
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'をタイムアウトと'再試行'制限で使用します。
正しいgraceful: SIGTERMをキャッチし、着信を終了し、接続を閉じてから終了します。
*K8s: 'preStop'フック+'terminationGracePeriodSeconds'、準備が整いました。

13)言語/スタックによるベストプラクティス(要約)

ノード:'npm ci'、 'NODE_ENV=production'、実行時にdev-depsを無効にします。'--heapsnapshot' off、 'uWS/GZip' L7プロキシの後ろにあります。
Python: wheels、 'gunicorn --graceful-timeout'、 'GTHREADS'/'UVICorn' by CPUは、不必要に共通レイヤー内にvenvを格納しません。
Go: CGO off(可能であれば)、'-ldflags=」-s -w「'、distroless/static、 'GOMAXPROCS' by cgroup。
Java: layered JAR、 '-XX: MaxRAMPercentage'、キャッシュ用のCDS/Layered JAR。

14)サプライチェーンとイメージ政治

CIでSBOMを生成し、アーティファクトの横に保存します。
各poochのイメージをスキャンして下さい;重要なCVEへのゲート。
サインイメージ(コサイン)、ポリシーコントローラを有効にします(K8s-Kyverno/Conftest/Gatekeeper)。
アカウント/ネットワークを個別にビルドおよび実行する。プライベートレジストリの依存関係をキャッシュします。

15)アンチパターン

prodの':latest';不変のタグの欠如。
分離なしで「本番ホスト内」アセンブリ。Dockerfileに秘密を格納します。
'--privileged'、広範な機能をrootとして実行します。
厚い画像(>1-2 GB)、なし。dockerignore。
シェルフォーム→シグナルの問題を介してENTRYPOINTのinitロジック。
ボリュームではなく、コンテナ層に永続データを書き込みます。
Healthcheck、これはprod-DBに高価な要求を行います。

16)実装チェックリスト(0-45日)

0-10日

Dockerfileの標準化(マルチステージ、。dockerignore、 LABEL、ピン留めベース)

BuildKit/buildx、パッケージマネージャのキャッシュマウントを含める。
非ルートおよび'seccomp '/AppArmor/SELinuxデフォルトプロファイルに切り替えます。

11-25日

実行時の画像(アルパイン/ディストロレス)を最小限に抑え、ログ(回転)で整理します。
リソース制限、ヘルスチェック、正しいPID 1/tiniを設定します。
プライベートレジストリ/キャッシュを上げ、CVEスキャナとSBOMの生成を接続します。

26-45日

画像署名とクラスタ入場ポリシーを入力します。
必要なサービスのためにマルチアーチ(amd64/arm64)を整理します。
build/release runbook、 build size/vulnerability/timeレポートを文書化します。

17)成熟度の指標

不変のタグと再現可能なアセンブリは、サービスの≥ 95%のために。
平均ランタイム画像サイズは<200-300 MB(スタック)です。
prod-containerの100%は非rootであり、限られた機能と読み取り専用FSを備えています。
プッシュごとのSBOMおよびCVEスキャン;重要なCVEは→ブロックされます。
環境における画像署名とポリシー執行。
コンテナのコールドスタート時間≤ターゲットSLO(例:2-5秒)、正しい優雅な操業停止。

18)結論

大人のコンテナ化はOCI標準+構築規律+デフォルトのセキュリティ+観察可能性と配信ポリシーです。マルチステージとBuildKitを使用し、ランタイムイメージを最小限に抑え、厳格なプロファイルの下で非ルートを実行し、タグを修正し、スキャンして署名し、ログ/リソース/ネットワークを管理下に保ちます。したがって、コンテナは、開発から生産まで、プラットフォームの予測可能で管理可能な基盤になります。

Contact

お問い合わせ

ご質問やサポートが必要な場合はお気軽にご連絡ください。いつでもお手伝いします!

Telegram
@Gamble_GC
統合を開始

Email は 必須。Telegram または WhatsApp は 任意

お名前 任意
Email 任意
件名 任意
メッセージ 任意
Telegram 任意
@
Telegram を入力いただいた場合、Email に加えてそちらにもご連絡します。
WhatsApp 任意
形式:+国番号と電話番号(例:+81XXXXXXXXX)。

ボタンを押すことで、データ処理に同意したものとみなされます。