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 애플리케이션 다단계 빌드 예제
- 디렉토리 생성 및 이동
mkdir goapp && cd $_
- 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)
}
}
- 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
- Go 파일 빌드 및 실행
- 빌드: `go build 파일명`
- 실행: `./파일명에서 확장자를 제거한 부분`
go build goapp.go
./goapp
- 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 애플리케이션도 동일하게 다단계 빌드로 최적화할 수 있다. 운영 환경에 맞춘 빌드 결과물을 배포하는 것이 중요하며, 소스코드가 아닌 빌드된 결과물을 클라우드나 서버에 배포해야 한다.
- Docker 이미지 빌드
다음 명령을 통해 Docker 이미지를 생성한다.
형식: `docker build -t 이미지이름:태그 [-f Dockerfile 경로] .`
docker build -t goapp:1.0 .
- 이미지 확인
docker images
- 컨테이너 실행
docker run --name goapp-deploy goapp:1.0
컨테이너 실행 후 10초마다 "Hello World"가 출력되는 것을 확인할 수 있다.
728x90
반응형