GH GambleHub

컨테이너 화: 도커와 OCI

컨테이너 화: 도커와 OCI

1) 기본 OCI 개념 및 표준

OCI 이미지 스펙 - 이미지 형식 (매니페스트, 설정, 레이어, 멀티 아치 색인).
OCI 런타임 스펙-컨테이너 실행 방법 (번들, '설정. json '); 구현: 런크 및 gVisor, Kata Containers.
OCI 배포 스펙-레지스트리와의 상호 작용 (푸시/풀, 인증).

Docker = UX 및 OCI 주변 생태계: DockerFile/BuildKit/CLI/Compose/Hub. Kubernetes에서 Docker Engine은 containerd/CRI-O로 대체되지만 이미지 형식은 동일합니다.

2) 외관: 레이어, 태그, 메타 데이터

계층 파일 시스템 (계층 파일 시스템) + 구성 (입력/cmd/env/라벨) + 매니페스트.
태그: prod에서 ': latest' 를 사용하지 마십시오. 고정 ': 1. 21. 3 ', git-내부 또는 날짜 + www.
LABEL: 소유자, 연락처, vcs-url, org. 오픈 컨테이너. (제목, 설명, 개정, 출처).
다중 아치: 색인 매니페스트는 'amd64/arm64' 에 대한 올바른 옵션을 제공합니다.

3) 빌드: 도커 파일, 빌드 키트, 다단계

3. 1 가지 원칙

레이어를 최소화하고 버전을 수정하며 깨끗한 패키지 관리자 캐시를

먼저 매니페스트/잠금 파일을 복사 한 다음 'RUN 설치 덱스' 를 사용하면 캐시가 향상됩니다.
.dockersedie가 필요합니다 ('.git', 인공물, 비밀 제외).
디스트로리스/알파인/최소베이스의 예가 바람직하다.

3. 빌드 키트 칩 2 개

병렬 빌드, 어셈블리의 비밀 ('-비밀'), 캐시 마운트, 멀티 아치 용 빌드.

캐시 마운트의 예:
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 (개발자가없는 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"]
파이썬 (휠-치, 루트가 아님):
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"]
자바 (JLink/Layering 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) 최소 이미지, 페이지 1 및 신호

방해받지 않는-작은 공격 표면, 쉘/패키지 관리자 없음.

그렇지 않으면 "좀비 프로세스 '를 올바르게 프록시해야 한다. "임원 형식으로 'ENTRYPOINT' 를 사용하고 tini/init:
dockerfile
ENTRYPOINT ["tini","--","/app"]

'HEALTHCHECK' 는 합리적입니다 (주파수/시간 초과, 불필요한로드 없음).

5) 컨테이너 보안

5. 1 정책 및 강화

비 뿌리 (USER), 뿌리가없는 도커/컨테이너.
기능: 불필요한 제거 ('-cap-drop = ALL-cap-add = NET _ BIND _ SERVICE' 등).
seccomp/AppArmor/SELinux: 기본 또는 엄격한 프로필 사용.
읽기 전용 FS + 'tmpfs' 게 '/tmp ', 새로운 권한이 없습니다.
비밀: 이미지가 아님; K8/vault/docker 비밀 관리자에서 마운트하십시오.

5. 2 공급망

SBOM (CycloneDX/SPDX) 및 스캔 (Trivy/GrType).
서명 (cosign, sigstore) 및 풀 정책 (확인).
업데이트 리허설: CVE 패치가있는 기본 이미지가 정기적으로 재구성됩니다.

6) 스토리지 및 파일 드라이버

기본값은 overlay2 (빠르고 안정적) 입니다. 뿌리가없는 환경에서는 종종 퓨즈 오버 레이프가 있습니다.
데이터 및 캐시의 볼륨, 개발을위한 바인드 마운트.
'/' 에 쓰지 마십시오-이미지와 분리 된 데이터 경로 ('/data ') 를 사용하십시오.

7) 네트워크 및 DNSName

도커 네트워크: 브리지 (기본값), 호스트 (최소 오버 헤드, 포트 충돌), 없음, macvlan/ipvlan (L2/L3 통합).
Docker DNA 리솔버는 호스트로부터/데몬을 가져옵니다. json; prod를 위해 로컬 리졸버 캐시를 구성하십시오.
K8에서 네트워크는 CNI (Calico/Cilium/Flannel) 에서 관리합니다. 사이드카/메쉬의 경우-가로 채기 (iptables).

8) 리소스 및 QoS (cgroup v2)

제한 사항: '-cpus', '-memory', '-pids-limited', '-cpuset-cpus'.
요청/제한 (K8에서) 을 설정하면 예약 및 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', 'awslos', '소 로그'.

회전 설정:
json
{ "log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"5"} }

측정 항목: Docker Engine API, cAdvisor, 노드 내보내기; 컨테이너 또는 사이드카의 에이전트를 통해 추적.

10) 등록 및 인증

개인 레지스트리: ECR/GCR/ACR/Harbor/GitHub 컨테이너 레지스트리.
속도 제한 Docker Hub; 미러/캐시 (레지스트리 캐시) 를 사용합니다.
보존/불변의 태그 정책, 지역 간 복제.
'도커 로그인' 은 스크립트에 저장되지 않습니다. CI 비밀과 OIDC 연합을 사용하십시오.

11) 도커 작곡 대 오케 스트레이터

컴파일-지역 개발/통합 스탠드.
상품: Kubernetes (배포/상태 설정/DaemonSet, 침입, 비밀, PVC) 컨테이너/CRI-O; 보안 정책 및 롤아웃 전략.
Swarm은 간단한 클러스터에 적합한 대규모 판매를 위해 구식입니다.

(PHP 3 = 3.0.6, PHP 4)

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' 를 사용하십시오.
올바른 우아함: SITERM을 잡고 들어오는 연결을 종료 한 다음 종료하십시오.
K8s: 'preStop' hook + 'terminationGracePeriodSecones', 준비 여부는 ре분위기입니다.

13) 언어/스택 별 모범 사례 (요약)

노드: 'npm ci', 'NODE _ ENV = production', 런타임에서 개발을 비활성화합니다. '-heapsnapt' off, L7 프록시 뒤에 'uWS/GZip'.
파이썬: 바퀴, '구니 콘-우아한 타임 아웃', CPU의 'GTHREADS '/' UVICorn' 은 불필요하게 venv를 공통 레이어 내에 저장하지는 않습니다.

Go: CGO off (가능한 경우), '-ldflags = "-s-w"', 디스트로리스/정적, 'GOMAXPROCS'

Java: 레이어 JAR, '-XX: MaxRAMPercently', 캐시 용 CDS/레이어드 JAR.

14) 공급망 및 이미지 정치

CI에서 SBOM을 생성하고 인공물 옆에 저장하십시오.
각 푸치에서 이미지를 스캔하십시오. 중요한 이력서로가는 문.
이미지 (cosign) 에 서명하고 정책 컨트롤러를 활성화하십시오 (K8s-Kyverno/Conftest/Gatekeeper).
별도의 계정 구축 및 실행/네트워크; 개인 레지스트리의 캐시 종속성.

15) 반 패턴

': prod의 최신'; 불변의 태그가 없습니다.
격리없이 "생산 호스트 내부" 조립; Dockerfile에 비밀 저장.

루트 '-특권', 광범위한 기능으로 실행

두꺼운 이미지 (> 1-2GB) 는 없습니다. 도커 무시.
쉘 형태 → 신호 문제를 통한 ENTRYPOINT의 초기 논리.
영구 데이터를 볼륨 대신 컨테이너 레이어에 기록하십시오.
건강 검진, prod-DB에 고가의 요청.

16) 구현 점검표 (0-45 일)

0-10 일

Standardize DockerFile (멀티 스테이지, .dockersedie, LABEL, 고정베이스).
패키지 관리자를위한 캐시 마운트 인 BuildKit/buildx 포함.
루트가 아닌 'seccomp '/AppArmor/SELinux 기본 프로파일로 전환하십시오.

11-25 일

런타임 이미지 (알파인/디스트로리스) 를 최소화하고 로그 (회전) 와 순서대로 설정하십시오.
자원 제한, 건강 검진, 올바른 PI 1/tini 설정.
개인 레지스트리/캐시를 높이고 CVE 스캐너와 SBOM 생성을 연결하십시오.

26-45 일

이미지 서명 및 클러스터 입력 정책을 입력하

필요한 서비스를 위해 멀티 아치 (amd64/arm64) 를 구성하십시오.
문서 빌드/릴리스 런북, 빌드 크기/취약성/시간 보고서.

17) 성숙도 지표

서비스의 95% 이상을 위해 불변의 태그 및 재현 가능한 어셈블리.
평균 런타임 이미지 크기는 <200-300MB (적재) 입니다.
prod 컨테이너의 100% 는 루트가 아니며 기능이 제한되어 있으며 읽기 전용 FS입니다.
푸시 당 SBOM 및 CVE 스캔; 중요한 CVE는 → 차단됩니다.
환경에서의 이미지 서명 및 정책 시행.
컨테이너 콜드 스타트 시간은 대상 SLO (예: 2-5 초), 올바른 우아한 종료.

18) 결론

성인 컨테이너화는 OCI 표준 + 빌드 규율 + 기본 보안 + 관찰 및 전달 정책입니다. 다단계 및 BuildKit을 사용하고, 런타임 이미지를 최소화하고, 엄격한 프로파일에서 루트가 아닌 실행, 태그 수정, 스캔 및 사인, 로그/리소스/네트워크를 제어하십시오. 따라서 컨테이너는 개발에서 생산에 이르기까지 플랫폼의 예측 가능하고 관리 가능한 기반이 될 것입니다.

Contact

문의하기

질문이나 지원이 필요하시면 언제든지 연락하십시오.우리는 항상 도울 준비가 되어 있습니다!

Telegram
@Gamble_GC
통합 시작

Email — 필수. Telegram 또는 WhatsApp — 선택 사항.

이름 선택 사항
Email 선택 사항
제목 선택 사항
메시지 선택 사항
Telegram 선택 사항
@
Telegram을 입력하시면 Email과 함께 Telegram에서도 답변드립니다.
WhatsApp 선택 사항
형식: +국가 코드 + 번호 (예: +82XXXXXXXXX).

버튼을 클릭하면 데이터 처리에 동의하는 것으로 간주됩니다.