>백엔드 개발 >Golang >다단계 빌드로 Go API Docker화

다단계 빌드로 Go API Docker화

Barbara Streisand
Barbara Streisand원래의
2024-10-08 06:30:021092검색

Dockerizing Your Go API with Multi-Stage Builds

자, 팀! 우리는 Docker화를 통해 Go API를 다음 단계로 끌어올리고 있으며, 더 중요한 것은 다단계 빌드를 통해 가벼우면서 효율적으로 만드는 것입니다. 이 게시물이 끝나면 이식 가능하고 더 빠른 배포에 최적화된 API를 갖게 될 것입니다. ?

왜 다단계 빌드인가? ?

다단계 빌드를 사용하면 빌드 환경과 런타임 환경을 분리하여 최종 Docker 이미지를 간결하게 유지할 수 있습니다. Go 애플리케이션의 경우 이는 한 단계에서(필요한 모든 도구 및 종속성을 포함하여) 애플리케이션을 구축한 다음 결과 바이너리만 더 작은 최종 이미지로 복사할 수 있기 때문에 특히 유용합니다.

다단계 빌드의 이점:

  • 작은 이미지 크기: 불필요한 빌드 종속성을 제거함으로써 크기가 아주 작은 이미지를 얻게 됩니다.
  • 빠른 배포: 이미지가 작을수록 다운로드 및 배포 속도가 빨라집니다.
  • 공격 표면 감소: 런타임 환경의 구성 요소가 적다는 것은 잠재적인 취약점이 적다는 것을 의미합니다.

1단계: 다단계 빌드로 Dockerfile 작성

다단계 빌드를 활용하는 Dockerfile을 만들어 보겠습니다. 이는 최종 이미지 크기를 줄여 프로덕션용 Go API를 최적화하는 데 도움이 됩니다.

다음 콘텐츠로 프로젝트 루트에 Dockerfile을 만듭니다.


# Build stage
FROM golang:1.21.0-alpine3.17 AS builder
WORKDIR /app
COPY . .

# Install dependencies and build the application
RUN go mod download
RUN go build -o main .

# Run stage (lightweight)
FROM alpine:3.18.3
WORKDIR /app

# Copy the binary from the builder stage
COPY --from=builder /app/main .

# Expose the API port
EXPOSE 8000

# Run the binary
CMD ["/app/main"]


Dockerfile 분석:

  1. 빌더 스테이지:

    • 표준 Go 이미지보다 작은 공식 Go Alpine 이미지부터 시작합니다.
    • 모든 종속성이 다운로드되고 go build를 사용하여 애플리케이션을 바이너리(기본)로 컴파일합니다.
  2. 런타임 단계:

    • Go 컴파일러나 기타 빌드 종속성이 포함되지 않은 더욱 가벼운 Alpine 이미지로 전환합니다.
    • 컴파일된 바이너리는 빌더 단계에서 복사되며 API에 액세스할 수 있도록 포트 8000을 노출합니다.

이 접근 방식을 사용하면 최종 이미지에 API를 실행하는 데 필요한 것만 포함되므로 상당히 작은 이미지가 됩니다.


2단계: Docker 컨테이너 구축 및 실행

이제 최적화된 Dockerfile이 있으므로 Docker 이미지를 빌드하고 실행해 보겠습니다.

  1. Docker 이미지 빌드:

   docker build -t my-go-api .


  1. Docker 컨테이너 실행:

   docker run -p 8000:8000 my-go-api


로컬 시스템에서와 마찬가지로 API가 http://localhost:8000에서 실행되는 것을 볼 수 있습니다!


3단계: 스크래치 이미지로 추가 최적화(선택 사항)

추가 최적화를 위해 Alpine 런타임 단계를 스크래치 이미지로 대체할 수 있습니다. 스크래치 이미지는 OS나 유틸리티 없이 완전히 비어 있으므로 이미지 크기가 더욱 작아집니다. 그러나 이는 컨테이너 내부의 디버깅 도구에 액세스할 수 없다는 의미이기도 합니다.

스크래치 이미지를 적용한 Dockerfile의 모습은 다음과 같습니다.


# Build stage
FROM golang:1.21.0-alpine3.17 AS builder
WORKDIR /app
COPY . .

RUN go mod download
RUN go build -o main .

# Run stage
FROM scratch
WORKDIR /app

COPY --from=builder /app/main .

EXPOSE 8000

CMD ["/app/main"]


이 방법을 사용하면 최종 이미지 크기를 10-15MB로 줄일 수 있습니다! 그러나 스크래치를 사용하는 것은 매우 기본적이고 독립적인 애플리케이션에 가장 적합하다는 점을 명심하세요.


4단계: 최적화된 컨테이너 테스트?

컨테이너가 예상대로 작동하는지 테스트해 보겠습니다.


curl http://localhost:8000/books


API가 올바르게 응답한다면 축하합니다! Docker를 사용하여 Go API를 성공적으로 최적화하고 컨테이너화했습니다. ?

프로덕션에서 다단계 빌드의 이점

  • 효율적인 배포: 이미지가 작을수록 가져오는 시간이 빨라지며 이는 프로덕션 환경에서 매우 중요할 수 있습니다.
  • 리소스 절약: 저장 공간과 메모리 공간이 줄어들어 인프라 비용이 낮게 유지됩니다.
  • 보안: 최종 이미지의 구성 요소가 적어 잠재적인 취약점이 줄어듭니다.

다음은 무엇입니까?

이제 API가 Docker에서 지원되고 프로덕션에 최적화되었으므로 원활한 배포 및 확장이 가능하도록 설정되었습니다! 다음번에는 Go용 단위 테스트에 대해 알아보고 API가 배포 가능할 뿐만 아니라 견고함인지 확인하겠습니다. ??

또한 ThrottleX GitHub 저장소에서 업데이트를 확인하세요. 곧 사용자 정의 속도 제한기 통합에 대한 튜토리얼을 게시할 예정입니다!

위 내용은 다단계 빌드로 Go API Docker화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.