전체 글 73

Gocker(Phase 1) 8일차 회고

2026.09.07한 일gocker images 3차 구현 (옵션 추가)gocker images 3차 구현 meta := img.Metadata() totalSize, sizeErr := meta.Size(ctx, cs, platforms.All) if sizeErr == nil && totalSize > 0 { sizeStr = formatBytes(totalSize) } else { sizeStr = "N/A" }이 코드에 문제가 있어서 수정했습니다.totalSize, sizeErr := meta.Size(ctx, cs, platforms.All) 에서 생각한 동작은 모든 플랫폼에 대해서 사이즈를 계산해본 다음에totalSize, sizeErr 값을..

Gocker(Phase 1) 7일차 회고

2026.09.06한 일예상치 못한 동작ctr images ls 내부 매커니즘 공부gocker images 2차 구현예상치 못한 동작gocker pull 명령어에서 --platform 옵션을 통해 호스트 플랫폼과 다른 플랫폼을 다운로드 할 수 있게 했는데그렇게 다른 플랫폼으로 다운로드 하고 gocker images를 하는 경우 에러가 발생함.위 사진은 호스트는 linux/amd386 인데 이미지는 linux/386으로 다운로드 받은 후 이미지 목록을 확인하는 사진입니다.ctr images ls 내부 매커니즘ctr images ls │ ├─ ① Image Store 조회 │ ↓ │ images.List() │ │ Name │ Target Descri..

Gocker(Phase 1) 6일차 회고

2026.09.04한 일gocker images 1차 구현gocker images 1차 구현현재 로컬에 있는 이미지를 출력하는 gocker images CLI를 구현했습니다.containerd의 client 패키지를 보면 ListImages 메서드를 제공해주고 있습니다.해당 메서드를 이용해서 현재 로컬에 있는 이미지의 메타데이터를 가져와 그걸 출력하도록 의도하고 코드를 구현했습니다.실제 함수 시그니처를 보고 함수 내부 동작을 간략히 봤습니다.func (c *Client) ListImages(ctx context.Context, filters ...string) ([]Image, error) { imgs, err := c.ImageService().List(ctx, filters...) if e..

Go - 함수형 옵션 패턴

함수형 옵션 패턴함수형 옵션 패턴은 생성자 함수에서 선택적 매개변수를 유연하게 다루기 위해 고안된 디자인 패턴입니다.처음 보게 된 곳은 cotainerd 내부 코드에서 Docker Resolver를 생성자에서 봤습니다.왜 필요한가?Go에서는 메서드/생성자 오버로딩과 기본값 매개변수를 지원하지 않아, 많은 옵션을 가지는 객체를 생성할 때 다음 문제가 발생할 수 있습니다.인자 수 폭발 : 생성자 인자가 많아 순서가 헷갈릴 수 있습니다.Config 구조체 전달의 한계하위 호환성 문제 : 새로운 옵션이 추가되면 생성자 시그니처를 수정해야 해서 기존 호출 코드가 깨집니다.기본 구현 방식1. 대상 구조체 정의package mainimport ( "fmt" "time")type Server struct {..

Go 2026.09.01

Gocker(Phase 1) 5일차 회고

2026.08.29한 일Pull CLI 플래그 추가 : --platform --snapshotter -helpPull CLI 플래그 추가Pull CLI에 플래그를 추가해서 사용자가 옵션을 커스텀할 수 있게 했습니다.플래그는 공식 라이브러리인 flag를 이용했습니다.그리고 기존에는 Pull 로직을 handlerPull이 다 처리했는데 플래그가 추가되면서 플래그를 먼저 처리하기 위해 handlerPullCommand 함수를 추가했습니다.CLI -> handlerPullCommand -> handlerPullPull CLI에 추가할 옵션은 platform과 shapshotter 지정만 생각했습니다.platform 플래그는 이미지를 다운로드할 대상 플랫폼을 지정할 수 있습니다.기본 로직(기본 처리 값)은 호스트..

Gocker(Phase 1) 4일차 회고

2026.08.25한 일containerd pull 내부 메커니즘 공부Pull 1차 구현Pull 메커니즘논리적 흐름ctr / CRI │ │ context 생성 ▼containerd Client │ │ Pull() ▼Resolver 생성 │ ├─ registry host 결정 ├─ TLS / hosts.toml ├─ credentials └─ authorizer │ ▼resolver.Resolve() │ │ nginx:latest │ ↓ │ sha256:manifest-or-index ▼OCI Descriptor │ ├─ Index / Manifest List │ ↓ platform 선택 │ └─ Manifest ├─ Config Descriptor └─ Layer ..

Gocker(Phase 1) 3일차 회고

2026.08.23한 일컨테이너의 전체 구조에 대한 공부도커도커를 크게 보면 사용자 편의 도구(CLI)와 고수준 런타임(containerd), 저수준 런타임(runc)를 결합한 통합 플랫폼입니다.Docker CLI 는 도커 명령어를 말합니다.docker ps -adocker version그리고 Docker Engine는 위 명령어를 받아서 실제로 명령을 수행하는 엔진입니ㅏㄷ.이 도커 엔진 내부에는 contaienrd가 있고, 그 containerd 내부에 runc가 존재합니다.Docker ├─ Docker CLI ← docker run 같은 명령어 ├─ Docker Engine ← 컨테이너 관리 │ │ │ └─ containerd │ │ │ ..

Gocker(Phase 1) 2일차 회고

2026.08.22한 일containerd 클라이언트 연결 방식 수정containerd 클라이언트 연결 방식 수정version CLI를 만들 때는 handlerVersion 함수에서 containerd 클라이언트 연결을 수립했습니다.func handleVersion() { ctx := context.Background() c, err := client.New(defaultSocket) // 나머지 생략이렇게 되면 앞으로 만들어질 핸들러 함수마다 c, err := client.New(defaultSocket)으로 containerd 클라이언트 연결을 다 생성해야 하는 문제가 생깁니다.그래서 main 함수에서 클라이언트 연결을 한 번만 생성하고, 그 클라이언트를 들고 있는 구조체를 핸들러한테..

Gocker(Phase 1) 1일차 회고

2026.08.19한 일개발 환경 준비containerd client를 이용한 gocker version CLI 구현개발 환경 준비OS, IDE, containerd, 깃허브 repo 등 개발에 필요한 기본 환경을 준비했습니다.WSLGolandcontainerdcontainerd 패키지프로젝트 터미널에서go get github.com/containerd/containerd/v2/client를 하면 containerd client 패키지 의존성이 go.mod에 추가됩니다.gocker version 를 통해 containerd의 버전을 출력하려면 containerd 소켓을 이용해서 containerd 클라이언트에 연결을 해야 합니다.Gocker CLI (handleVersion) │ │ 1. cli..

Gocker - Phase1 계획

Phase 1 - Go + containerd 기반 Container CLI목표Go와 containerd Go Client를 사용하여 Docker와 유사한 Container CLI를 구현합니다.이 단계에서는 Container Runtime 자체를 구현하지 않고, 기존 Container Runtime인 containerd를 Backend로 사용합니다.사용자는 Gocker CLI를 통해 Container를 생성하고 실행하고 종료할 수 있습니다.User │ ▼Gocker CLI │ │ containerd Go Client ▼containerd │ ▼runc │ ▼Linux KernelPhase 1의 핵심은 Go로 Container Lifecycle을 제어하는 프로그램을 작성하면서 containerd의 기본 구..