반응형
본 내용은 인프런의 데브위키님의 강의 "개발자를 위한 쉬운 도커" 내용을 바탕으로 정리한 내용입니다.
도커의 레이어 관리
- Dockerfile에 작성된 지시어 하나 당 레이어가 한 개 추가되는데 불필요한 레이어가 많아지면 이미지의 크기가 늘어나고 빌드 속도가 느려질 수 있다.
그림 1) 레이어 관리 1
- RUN 지시어는 &&을 활용해 최대한 하나로 처리해야 하고 불필요한 명령어를 추가해서 레이어의 개수를 늘리지 않아야 한다.
그림 2) 레이어 관리 2
- 애플리케이션의 크기는 가능한 작게 관리한다.
그림 3) 레이어 관리 3
- 베이스 이미지는 가능한 작은 이미지를 사용해야 하므로 alpine OS를 사용하는 것이 좋다.
- 도커의 nginx나 ubuntu 같은 다른 이미지 사용시에도 태그에 alpine이 붙어있는 버전을 사용하는 것이 좋다.
그림 4) 레이어 관리 4
- .dockerignore 파일을 사용해서 불필요한 파일을 제거한다.
그림 5) 레이어 관리 5
예시 1) 스크래치 이미지를 사용한 빌드 실습
easydocker/go-scratch/Dockerfile
# git build 폴더 다운로드
git clone https://github.com/daintree-henry/build.git
# 0. 소스 코드 변경사항 초기화
git reset --hard HEAD && git clean -fd
# 1. 실습 폴더 easydocker/build 이동 및 브랜치 변경
git switch 02-practice
# 2. 실습 폴더 easydocker/build/05.go-scratch 이동 및 브랜치 변경
cd 05.go-scratch
# 3. helloworld 이미지 빌드
docker build -t helloworld .
# 4. 컨테이너 실행
docker run -d -p 8080:8080 --name go-helloworld helloworld
# 이미지가 7MB로 작게 생성되어 있다.
# 정적 바이너리 파일로 빌드할 수 있는 go언어는 이미지를 작게 생성하는데 유리한 언어이다.
docker image ls helloworld
go 언어로 개발한 웹 애플리케이션 소스 (easydocker/go-scratch/main.go)
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Go, Scratch World!")
})
fmt.Println("Server is running on port 8080")
http.ListenAndServe(":8080", nil)
}
easydocker/go-scratch/Dockerfile
FROM golang:alpine AS builder
WORKDIR /app
COPY main.go . ----------------소스코드 복사
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o helloworld main.go --------------애플리케이션 빌드
FROM scratch
COPY --from=builder /app/helloworld . --------------빌드스테이지에서 애플리케이션 복사
EXPOSE 8080
ENTRYPOINT ["./helloworld"] -------------------------애플리케이션 실행
반응형
'Docker' 카테고리의 다른 글
[Docker] 도커 실무(3 Tier 아키텍처 구성) (0) | 2024.07.19 |
---|---|
[Docker] 도커 실무(캐싱을 활용한 빌드) (0) | 2024.07.19 |
[Docker] 도커 볼륨 (0) | 2024.07.19 |
[Docker] 상태없음(Stateless) (0) | 2024.07.19 |
[Docker] 도커 네트워크 (0) | 2024.07.19 |