본문으로 바로가기
OCI: 컨테이너 이미지와 런타임의 공통 표준
LinkedInGitHub
WORKSPACE

EXPLORER

157 POSTS
BLOG
면접질문
해야하는 거
AI 시대, 개발자는 사라지는가?
Python Counter, 빈도수를 쉽게 세는 방법
정렬
1. 투 포인터
DFS와 BFS
알고리즘 논리
코딩 테스트 핵심 알고리즘 정리파이썬 딕셔너리와 코딩 테스트 활용
예시로 살펴보는 AXAX 프로젝트, 문제 정의부터 확산까지AX 시대의 가치 정의와 현장 리딩
MSA
1. Singleton PatternSOLID
Kafka의 핵심 설계 원리Kafka 메시징 시스템의 구성과 동작 방식Kafka 기본 개념과 EC2 Docker 구성
쿠버네티스 입문
Modular Monolith1. MonolithMSA, 서비스 분리와 운영의 원리
Socket이란 무엇인가
네크워크 참조 모델
전체 데이터 구조REST API의 개념과 설계 원칙2. Field/ Parameter / Argument/ this
Actuator 란?EntityManagerJPA 연관관계 매핑JPA 트랜잭션(Transaction)입력값 검증Java의 AOP(Aspect Oriented Programming)Async : AsynchronousBeanJPA(Java Persistence API)Proxy 패턴Spring MVCdocker container1. Spirng 필요컴포넌트 스캔
Spring 컨테이너
application.yamlLombok
이번 강의는 무엇을 노리고 있을까?Spring AI를 배우기 전에 정리할 것23
1. 기술 스택
개발 문서를 읽기 위한 핵심 기술 용어
Docker를 이해하기 위한 운영체제 기초
sigterm
6. 설정과 저장소, 앱을 운영할 수 있는 상태로 만들기5. Service와 Ingress, 요청은 어디로 흐를까4. 직접 실험하는 Kubernetes, Pod 복구부터 롤백까지3. kubectl과 Pod, 상태에서 원인을 찾는 법2. 클러스터는 명령을 어떻게 Pod로 바꿀까1. 쿠버네티스, 원하는 상태와 컨테이너 이미지Calico쿠버네티스 입문, 원하는 상태를 유지하는 시스템
Psql JSONB, 행 잠금, 멱등성Psql 함수,프로시져,트리거
머신러닝 입문딥러닝 학습 기본 개념데이터 시각화기초 통계와 ML 파이프라인 연결분석 자동화와 파이프라인 설계
CNN 아키텍처 발전 과정이미지 세그멘테이션 모델과 핵심 개념객체 탐지 모델과 핵심 개념
딥러닝 데이터셋 엔지니어링
딥러닝 학습 문제 진단과 디버깅
도메인 적응 방법현대 LLM 워크플로의 패턴
Transformer에서 LoRA 적용 대상 정하기LoRA (Low-Rank Adaptation)
LLM 양자화와 QLoRA
분산 학습과 MLOps딥러닝 모델 경량화와 추론 최적화딥러닝 기본 학습 테크닉딥러닝 중급 학습 테크닉
Mixture of Experts(MoE) 핵심 개념멀티모달 파운데이션 모델 핵심 개념State Space Model과 MambaTransformer와 Vision Transformer
Latent Space
1Chunking?
DevOps 기초 1편
실습에서는?Agile 개요, 왜 필요한가?
CI/CD 기초 4편: 배포 전략과 운영CI/CD 기초 3편: Jenkins와 Argo CD를 이용한 GitOps 배포CI/CD 기초 2편: Docker 이미지와 배포 파이프라인CI/CD 기초 1편: 개념과 GitHub Actions
OCI: 컨테이너 이미지와 런타임의 공통 표준Docker 기초 13편: Compose Healthcheck와 실전 구성Docker 기초 12편: Compose 네트워크와 VolumeDocker 기초 11편: Compose 명령어와 환경 변수Docker 기초 10편: Compose 기본 구조와 이미지 빌드Docker 기초 9편: Docker 및 Kubernetes 네트워크Docker 기초 8편: 컨테이너 런타임과 격리Docker 기초 7편: 이미지 Layer와 tar 내부 구조Docker 기초 6편: 이미지 Layer와 빌드 최적화Docker 기초 5편: 컨테이너 기본 명령어와 VolumeDocker 기초 4편: 가상화와 컨테이너 이미지 생명주기Docker 기초 3편: CI/CD 연결과 배포 원칙Docker 기초 2편: Layer, Registry, Volume과 NetworkDocker 기초 1편: Dockerfile, Image와 Container
NginxNginx 로드 밸런싱과 HTTPSNginx 리버스 프록시와 Spring Boot 연결Nginx 기초와 동작 구조
05. Pinia 상태 관리: store 설계와 사용법04. Vue 컴포넌트 설계: props, emit, slot과 생명주기03. Vue Composition API 정리02. Vue 기초 문법 점검: JavaScript, 템플릿01. Vue.js 입문: 핵심 구조와 렌더링
Java 심화 Part 3: 함수형 프로그래밍과 LambdaJava 심화 Part 2: AnnotationJava 심화 Part 1: Reflection
Java 기초 Part 5: Stream APIJava 기초 Part 4: 제네릭Java 기초 Part 3: 제어문Java 기초 Part 2: 주석과 JavadocJava 기초 Part 1: 백엔드 배경과 Java 실행 구조
Java 디버깅 Part 1: 자주 헷갈리는 핵심 개념Java 디버깅 Part 2: VS Code 자동 컴파일과 프로젝트 구조
Java 실행과 JVM Part 3: ClassLoader와 JVM 메모리Java 실행과 JVM Part 2: 메모리와 데이터 흐름Java 실행과 JVM Part 1: Java와 Python 컴파일 비교
Java 객체지향 Part 5: static 메서드와 중첩 클래스Java 객체지향 Part 4: 상속과 인터페이스Java 객체지향 Part 3: 좋은 설계와 OOP 4대 특성Java 객체지향 Part 2: OOP 핵심 문법Java 객체지향 Part 1: 클래스, 객체, 필드와 생성자
Spring 기초 Part 11: Actuator와 애플리케이션 모니터링Spring 기초 Part 10: 비동기 처리와 @AsyncSpring 기초 Part 9: JPA 트랜잭션과 동시성 제어Spring 기초 Part 8: AOP와 공통 관심사 분리Spring 기초 Part 7: Proxy 패턴과 Spring ProxySpring 기초 Part 6: JPA 연관관계 매핑Spring 기초 Part 5: EntityManager와 영속성 컨텍스트Spring 기초 Part 4: JPA, Entity와 RepositorySpring 기초 Part 3: REST API 요청값과 입력값 검증Spring 기초 Part 2: Spring MVC 요청 처리 흐름Spring 기초 Part 1: IoC, Bean, DI와 주요 Annotation
DNS = Domain Name System
Spring Boot, WebSocket, Vue, Docker 로 Raspberry Pi 실시간 모니터링 프로젝트 만들기 - 1편1. Spring Boot 구현
1. GitHub Project 만들기
Python 코드 품질: 디버깅부터 테스트와 자동화까지Python 01. 실행 구조와 실무 기초
sLLM 핵심 기술과 전체 구조제한된 자원에서 sLLM 구축하기
시대 단상에 대한 주저리주저리
WORKSPACE

SEARCH

제목, 카테고리와 태그로 검색하세요.

VERSION CONTROL

SOURCE CONTROL

masterGitHub Pages
저장소 열기
BUILD STATUS

RUN AND DEBUG

게시물은 GitHub Actions에서 검증하고 정적 페이지로 빌드합니다.

Actions 열기
WORKSPACE

MANAGE

홈 열기전체 게시물태그 보기블로그 소개
OCI: 컨테이너 이미지와 런타임의 공통 표준●
workspace>posts>devops>docker>oci-container-standard.md
DevOps / Docker2026.08.241 min read6 tags

OCI: 컨테이너 이미지와 런타임의 공통 표준

OCI가 등장한 배경과 Image, Runtime, Distribution Specification의 역할, Docker와 Kubernetes에서 OCI가 사용되는 흐름을 정리한다.

OCI(Open Container Initiative)란?

OCI는 "컨테이너 이미지와 컨테이너 실행 방식에 대한 국제 공통 규격"

Docker가 만든 이미지를 Docker에서만 실행하는 게 아니라, containerd, CRI-O, Kubernetes, Podman 같은 다른 생태계에서도 동일하게 사용할 수 있게 해주는 표준

1. OCI는 왜 등장했는가?

초창기 컨테이너 시장 -> Docker가 거의 표준처럼 쓰임

Docker Image
    ↓
Docker Engine
    ↓
Container

문제는 이러면 Docker라는 특정 회사와 구현체에 생태계가 강하게 종속될 수 있다는 것

Docker Image
    ↓
Docker에서만 실행 가능

A회사 Image
    ↓
A회사 Runtime에서만 실행 가능

B회사 Image
    ↓
B회사 Runtime에서만 실행 가능

따라서 Docker, Google, Red Hat, IBM, Microsoft 등 여러 기업이 참여해서 만든 표준화 프로젝트가 OCI(Open Container Initiative)

이와 같이 모인 목적은

컨테이너를 어떤 형식으로 만들고, 어떻게 실행하면 좋을까하는 공통 규격을 만들자.

라는 일념하에 힘을 합치게 된다.

2. OCI는 프로그램이 아니다.

OCI는 설계도 / 규격이고 runc 같은 프로그램이 그 규격을 구현

OCI 자체는 Docker나 containerd처럼 실행되는 프로그램이 아니다.

Docker      → 프로그램
containerd  → 프로그램
runc        → 프로그램

OCI         → 표준 Specification

비유를 해보자면

HTTP   = 웹 통신 규칙
Chrome = HTTP를 사용하는 프로그램

OCI    = 컨테이너 규칙
runc   = OCI 규칙을 구현한 프로그램

3. OCI의 핵심 3가지 표준

OCI에서는 크게 세 가지를 정의

OCI
├── Image Specification
├── Runtime Specification
└── Distribution Specification

각각이 약간씩 다르므로 아래서 좀 설명을 해보려 한다.

4. OCI Image Specification

컨테이너 이미지를 어떤 구조로 저장할 것인가를 정의

Docker 이미지를 생각하면 된다.

예를 들어

nginx image
├── Layer 4  nginx 설정
├── Layer 3  nginx 설치
├── Layer 2  라이브러리
└── Layer 1  Ubuntu filesystem

OCI Image Spec은 다음과 같은 것을 정의

Image
├── Manifest
├── Config
└── Layers

예를 들면

Manifest
    ↓
어떤 Config와 Layer를 사용하는지 기록

Config
    ├── 환경변수
    ├── 실행 명령어
    ├── Working Directory
    └── Architecture

Layers
    ↓
실제 파일 시스템 데이터

이런 식으로 규격을 표준화했기 때문에, 덕분에 Docker에서 만든 이미지도 다른 OCI 호환 프로그램에서 사용할 수 있다. (오우? 굉장히 좋다고 할 수 있다.)

Docker build
    ↓
OCI Image
    ├── Docker
    ├── Podman
    └── containerd

5. OCI Runtime Specification

Runtime Spec은:

"컨테이너를 실제 Linux 프로세스로 어떻게 실행할 것인가?"

를 정의

예를 들어 컨테이너 실행하려면 이런 정보가 필요하다

어떤 프로그램을 실행할 것인가?

nginx

어떤 환경변수를 사용할 것인가?

PORT=80

어떤 namespace를 만들 것인가?

PID Namespace
Network Namespace
Mount Namespace

어떤 resource 제한을 적용할 것인가?

CPU
Memory

이런 실행 정보를 OCI Runtime Spec에서 규정

대표적인 설정 파일이

config.json

개념적으로

{
  "process": {
    "args": ["nginx"]
  },
  "linux": {
    "namespaces": [
      "..."
    ]
  }
}

이런 정보를 Runtime이 읽는다.

대표적인 OCI Runtime 구현체가

runc

runc가 중요한 이유

Docker에서

docker run nginx

를 실행한다고, Docker가 직접 Linux Namespace와 cgroup을 전부 만드는 구조는 아니다.

사용자
    │
    │ docker run nginx
    ▼
Docker CLI
    │
    ▼
dockerd
    │
    ▼
containerd
    │
    ▼
runc
    │
    ▼
Linux Kernel
    ├── Namespace
    ├── cgroup
    ├── capabilities
    └── filesystem
    │
    ▼
nginx process

여기서

runc

가 OCI Runtime Specification을 구현한 프로그램이다.

Docker가 최종적으로 컨테이너라는 특별한 VM을 만드는 것이 아니라, runc를 통해 Linux Kernel 기능을 이용해서 격리된 프로세스를 만들어낸다.

결국은

"컨테이너의 실체는 결국 Linux에서 실행되는 프로세스다"

라는 개념을 구현하는 것은 OCI Runtime

6. Kubernetes에서도 OCI가 사용된다

OCI가 중요한 이유는 Docker만의 이야기가 아니기 때문.

Kubernetes에서 사용되기 때문이다.

에를 들어 Kubernetes에서 Pod를 생성

kubectl apply -f nginx.yaml

라고 하면

kubectl
    │
    ▼
Kubernetes API Server
    │
    ▼
kubelet
    │
    ▼
CRI
    │
    ▼
containerd
    │
    ▼
OCI Runtime
    │
    ▼
runc
    │
    ▼
Linux Kernel
    │
    ▼
nginx process

라고 하면서,

OCI Runtime을 사용하게 된다.

7. CRI와 OCI는 다른 것

CRI OCI

CRI

  • Container Runtime Interface
Kubernetes
    ↕
containerd / CRI-O

Kubernetes와 Container Runtime 사이의 API 규격

OCI

  • Open Container Initiative

컨테이너 이미지와 실제 실행 규격

Kubernetes
    │
    ▼
kubelet
    │ CRI
    ▼
containerd
    │ OCI
    ▼
runc
    │
    ▼
Linux Kernel

8. OCI가 실제로 어디에 응용?

OCI 표준 덕분에 다양한 컨테이너 기술이 서로 호환

Docker Podman containerd CRI-0 Kubernetes AWS ECS / EKS Google GKE Azure AKS Github Actions CI/CD 시스템

등이 컨테이너 이미지를 다룰 수 있음

예를 들어

docker build -t myapp .

해서 이미지를 만들고 Registry에 올리면

Developer Laptop
    │ docker build
    ▼
OCI Image
    │
    ▼
Container Registry
    ├── Docker
    ├── Kubernetes
    ├── AWS ECS
    ├── GKE
    └── Azure AKS

어디에서 실행하든 OCI 규격을 이해하기 때문에 동일한 이미지를 사용할 수 있다.

9. Docker Registry에서도 OCI가 응용

OCI에는 Distribution Specification도 있다.

이건

"컨테이너 이미지를 Registry와 어떻게 주고받을 것인가"

를 정의

docker pull nginx
Docker
    │ Registry API
    ▼
Docker Hub
    ├── Manifest
    ├── Config
    └── Layers

그래서 다음과 같은 Registry들이 서로 비슷한 방식으로 OCI 이미지를 저장

Docker Hub

GitHub Container Registry

Amazon ECR

Google Artifact Registry

Azure Container Registry

Harbor

10. OCI 때문에 Docker가 없어도 된다.

OCI 표준이 있기 때문에

Docker Build
    ↓
OCI Image
    ├── Podman
    ├── containerd
    └── Kubernetes

처럼 사용할 수 있다.

이는 Vendor Lock-in을 줄이는 역할을 한다.

결론

Docker CLI
    │
    ▼
dockerd
    │
    ▼
containerd
    │ OCI Runtime Specification
    ▼
runc
    │
    ▼
Linux Kernel
    ├── Namespace
    ├── cgroup
    └── capability
    │
    ▼
Container
(= isolated process)

이미지는

Dockerfile
    │
    ▼
docker build
    │
    ▼
OCI Image
    ├── Manifest
    ├── Config
    └── Layers
    │
    ▼
Container Registry
    │
    ▼
containerd
    │
    ▼
runc
    │
    ▼
Linux Process

면접에서 나온다면 ...

OCI는 Open Container Initiative로, 컨테이너 이미지 형식과 컨테이너 실행 방식 등을 표준화한 규격입니다. 대표적으로 OCI Image Spec, Runtime Spec, Distribution Spec이 있습니다. Docker나 Kubernetes 생태계에서 서로 다른 Runtime과 Registry가 동일한 컨테이너 이미지를 호환해서 사용할 수 있도록 해줍니다. 대표적인 OCI Runtime 구현체가 runc입니다.

Docker       = 컨테이너를 사용하는 플랫폼
containerd   = 컨테이너 생명주기 관리자
OCI          = 컨테이너 표준 규격
runc         = OCI Runtime 규격 구현체
Linux Kernel = 실제 격리를 수행하는 주체
Container    = 결국 격리된 Linux Process

여기까지 연결하면

Kubernetes
    ↓
CRI
    ↓
containerd
    ↓
OCI
    ↓
runc
    ↓
Linux Kernel
    ↓
Process
TAGS#OCI#Docker#Container#containerd#runc#Kubernetes
PREVIOUSNginx 로드 밸런싱과 HTTPSNEXTNginx
DISCUSSION

COMMENTS

GitHub 계정으로 로그인하여 댓글을 남길 수 있습니다. 댓글은 GitHub Discussions에 공개 저장되며, 작성 내용과 GitHub 프로필 정보가 다른 방문자에게 보일 수 있습니다.

GitHub 로그인 후 댓글 쓰기Discussion 열기
DOCUMENT STRUCTURE

이 문서에는 목차가 없습니다.

DOCUMENT INFO
TYPE
Markdown
DATE
2026.08.24
READ
1 min read
WORDS
0
CATEGORY
DevOps / Docker
RELATED DOCUMENTS
Docker 기초 8편: 컨테이너 런타임과 격리Docker 기초 5편: 컨테이너 기본 명령어와 VolumeDocker 기초 4편: 가상화와 컨테이너 이미지 생명주기Docker 기초 1편: Dockerfile, Image와 ContainerDocker 기초 13편: Compose Healthcheck와 실전 구성Docker 기초 12편: Compose 네트워크와 Volume
main DevOps / Docker
1 min readUTF-8Markdown
본문 글씨 크기
RECENTLY OPENED1
OCI: 컨테이너 이미지와 런타임의 공통 표준recently opened