[Docker] 도커 다단계 빌드로 Go 애플리케이션 최적화하기 실습

728x90
반응형

0. 컨테이너 및 이미지 삭제

  • 모든 컨테이너 중지: docker stop $(docker ps -a -q)
  • 모든 컨테이너 삭제: docker rm $(docker ps -a -q)
  • 모든 이미지 삭제: docker rmi $(docker images -q)

1. 빌드 의존성 제거와 다단계 빌드

1) 개요

다단계 빌드는 FROM 명령을 사용하여 여러 빌드 단계를 생성하고, AS를 통해 각 단계에 이름을 부여하여 사용할 수 있는 방식이다.
이를 통해 각 단계에서 생성된 결과물 중 애플리케이션 실행에 필요한 데이터만 가져와 이미지를 경량화할 수 있다. 다단계 빌드를 사용하면 모든 빌드 의존성을 하나의 환경에 포함시키므로, 최종 이미지에서 불필요한 빌드 의존성을 제거할 수 있다.

2) Go 애플리케이션 다단계 빌드 예제

  1. 디렉토리 생성 및 이동
mkdir goapp && cd $_
  1. Go 파일 생성

nano goapp.go 명령을 통해 다음과 같이 10초마다 "Hello World"를 출력하는 Go 애플리케이션을 작성한다.

package main

import(
    "fmt"
    "time"
)

func main() {
    for {
        fmt.Println("Hello World")
        time.Sleep(10 * time.Second)
    }
}

  1. Golang 설치
  • 다운로드: wget https://golang.org/dl/go1.19.1.linux-amd64.tar.gz
  • 압축 해제: sudo tar -xzf go1.19.1.linux-amd64.tar.gz -C /usr/local
  • PATH에 Golang 경로 등록: /etc/profile 파일을 열어 아래 내용을 추가한 후, source /etc/profile 명령으로 변경 내용을 적용한다.
export PATH=$PATH:/usr/local/go/bin

  1. Go 파일 빌드 및 실행
  • 빌드: `go build 파일명`
  • 실행: `./파일명에서 확장자를 제거한 부분`
go build goapp.go
./goapp
  1. Dockerfile 생성

다음은 다단계 빌드를 사용한 Dockerfile 예시이다.

FROM golang:1.15-alpine3.12 AS gobuilder-stage

WORKDIR /usr/src/goapp
COPY goapp.go .

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /usr/local/bin/gostart

FROM scratch AS runtime-stage
COPY --from=gobuilder-stage /usr/local/bin/gostart /usr/local/bin/gostart

CMD ["/usr/local/bin/gostart"]

💡 다단계 빌드 요약

  • Go 애플리케이션을 빌드하고, 실행에 필요한 파일만 최종 이미지에 포함하여 경량화할 수 있다.
  • 빌드 파일만 포함하고 소스코드는 배포에 포함하지 않는다.
  • Spring이나 Node 애플리케이션도 동일하게 다단계 빌드로 최적화할 수 있다. 운영 환경에 맞춘 빌드 결과물을 배포하는 것이 중요하며, 소스코드가 아닌 빌드된 결과물을 클라우드나 서버에 배포해야 한다.
  1. Docker 이미지 빌드

다음 명령을 통해 Docker 이미지를 생성한다.

형식: `docker build -t 이미지이름:태그 [-f Dockerfile 경로] .`

docker build -t goapp:1.0 .
  1. 이미지 확인
docker images
  1. 컨테이너 실행
docker run --name goapp-deploy goapp:1.0

컨테이너 실행 후 10초마다 "Hello World"가 출력되는 것을 확인할 수 있다.

728x90
반응형