0Pricing
Go Academy · 강의

Go용 다단계 Docker 빌드

builder 단계와 scratch/alpine 최종 이미지

Go용 다단계 Docker 빌드은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

다단계 빌드를 사용하는 이유

Go 코드를 컴파일하는 단일 단계 빌드는 전체 Go 도구 모음이 포함된 큰 이미지를 생성합니다. 다단계 빌드는 한 단계에서 컴파일한 후 최소한의 최종 이미지에 바이너리만 복사합니다.

기본 다단계 Dockerfile

빌드 단계에서는 바이너리를 컴파일하고, 최종 단계에서는 이를 최소한의 기반 이미지에 복사합니다:

FROM golang:1.22-alpine AS build
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o myapp ./cmd/server

FROM scratch
COPY --from=build /app/myapp /myapp
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENTRYPOINT ["/myapp"]

FROM scratch

FROM scratch 이미지는 아무것도 포함하지 않습니다. 셸도, 운영 체제 라이브러리도 없습니다. Go 바이너리는 정적으로 링크되어야 하며(CGO_ENABLED=0), 필요한 모든 파일을 명시적으로 포함해야 합니다.

FROM distroless

Google의 distroless 이미지는 셸 없이 최소한의 운영 체제 라이브러리(CA 인증서, 시간대 데이터)를 제공합니다. libc 또는 TLS 인증서가 필요한 바이너리에는 scratch보다 안전합니다.

FROM gcr.io/distroless/static-debian12
COPY --from=build /app/myapp /
ENTRYPOINT ["/myapp"]

셸을 위한 FROM alpine

디버깅을 위해 셸이 필요하거나 바이너리가 CGO를 사용하는 경우 최종 기반으로 Alpine을 사용합니다. Alpine은 약 5MB를 추가하지만 셸과 패키지 관리자를 포함합니다.

go.mod 레이어 캐싱

먼저 go.mod와 go.sum을 복사하고 소스 코드를 복사하기 전에 go mod download를 실행합니다. 이 레이어는 의존성이 변경될 때까지 캐시되므로 다시 빌드하는 시간이 줄어듭니다.

COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build ...

-ldflags="-s -w"

-s는 심볼 테이블을 제거하고, -w는 DWARF 디버그 정보를 제거합니다. 두 옵션을 함께 사용하면 런타임에 영향을 주지 않고 바이너리 크기를 30~50% 줄일 수 있습니다.

빌드 인수

ARG를 사용하여 빌드 시점에 버전 정보를 주입합니다:

ARG VERSION=dev
RUN go build -ldflags="-X main.version=${VERSION}" -o myapp .

비루트 사용자

보안을 위해 바이너리를 루트가 아닌 사용자로 실행합니다. 기반 이미지에 사용자를 추가하거나 distroless의 nonroot 태그를 사용합니다:

FROM gcr.io/distroless/static-debian12:nonroot

최종 이미지 크기

scratch에서 만든 일반적인 Go 바이너리의 크기는 5~20MB입니다. Alpine은 약 5MB를 추가하고, 전체 golang 이미지는 약 800MB입니다. 다단계 빌드는 공격 표면과 이미지 다운로드 시간을 크게 줄입니다.

.dockerignore

.dockerignore를 추가하여 빌드 컨텍스트에서 파일을 제외합니다: vendor/, .git/, *.test, *.prof. 이렇게 하면 Docker 빌드가 빨라지고 민감한 파일이 포함되는 것을 방지할 수 있습니다.

.git
vendor
*.test
*.prof
.env

빠른 확인

FROM scratch Docker 이미지용 Go 바이너리를 빌드할 때 CGO_ENABLED=0을 설정해야 하는 이유는 무엇인가요?

복습: 다단계 Docker 빌드

핵심 사항:

  • 빌드 단계: golang 이미지, 최종 단계: scratch/distroless/alpine
  • 정적 바이너리를 위해 CGO_ENABLED=0을 사용합니다(scratch에 필요)
  • 레이어 캐싱을 위해 먼저 go.mod를 복사하고, 더 작은 바이너리를 위해 -ldflags="-s -w"를 사용합니다
  • .dockerignore로 .git, vendor, 테스트 파일을 제외합니다

자주 묻는 질문

“Go용 다단계 Docker 빌드” 강의는 무료인가요?

네 — “Go용 다단계 Docker 빌드” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Go용 다단계 Docker 빌드”에서 뭘 배우나요?

builder 단계와 scratch/alpine 최종 이미지 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Go Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“Go용 다단계 Docker 빌드” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Go용 다단계 Docker 빌드
  2. 환경 구성과 비밀 정보
  3. 로컬 개발을 위한 Docker Compose
  4. 상태 점검과 운영 환경 튜닝
← Go Academy(으)로 돌아가기