안녕하세요 펭귄 교수입니다.
이번에는 도커 이미지 빌드에 대해 알아보겠습니다.
도커 이미지 빌드는 Dockerfile을 기반으로 애플리케이션 실행 환경을 하나의 이미지로 패키징하는 과정입니다.
이를 통해 어디서든 동일한 환경에서 애플리케이션을 실행할 수 있습니다.
도커 이미지 빌드 과정을 단계별로 설명하고, 유용한 명령어와 팁도 함께 소개하겠습니다.
1. 도커 이미지란?
도커 이미지는 애플리케이션이 실행되는 환경을 포함한 모든 것을 담고 있는 일종의 템플릿입니다. 운영체제, 실행 파일, 라이브러리, 애플리케이션 코드까지 포함되어 있으며, 이미지를 통해 컨테이너를 실행합니다.
도커 이미지는 여러 레이어로 구성되어 있습니다. 각 레이어는 Dockerfile의 명령어들이 실행되면서 생성됩니다. 이를 통해 변경된 부분만 새롭게 빌드하고, 기존 레이어는 캐시로 사용하여 빌드 시간을 줄일 수 있습니다.
2. 도커 이미지 빌드 과정
도커 이미지를 빌드하기 위해서는 먼저 Dockerfile을 작성해야 합니다. 앞서 설명한 Dockerfile의 내용을 바탕으로 docker build 명령어를 사용해 이미지를 빌드할 수 있습니다.
Dockerfile 예시
# 베이스 이미지로 Python 사용
FROM python:3.9-slim
# 작업 디렉토리 설정
WORKDIR /app
# 필요 패키지 복사 및 설치
COPY requirements.txt .
RUN pip install -r requirements.txt
# 애플리케이션 코드 복사
COPY . .
# 애플리케이션 실행
CMD ["python", "app.py"]
이 Dockerfile은 Python 3.9 이미지를 기반으로, 애플리케이션의 종속성을 설치하고,
app.py 파일을 실행하는 간단한 웹 애플리케이션 이미지를 빌드합니다.
이미지 빌드 명령어
Dockerfile을 작성한 후, 도커 이미지를 빌드하는 과정은 간단합니다.
docker build -t my-python-app .
- -t my-python-app : 빌드된 이미지에 **태그(tag)**를 지정합니다. 이 태그는 나중에 이미지를 실행할 때 사용됩니다.
- . : 현재 디렉토리에서 Dockerfile을 찾고 이미지를 빌드합니다.
위 명령어를 실행하면 Dockerfile에 정의된 내용을 기반으로 이미지를 빌드하고,
my-python-app이라는 이름의 이미지가 생성됩니다.
3. 유용한 도커 빌드 명령어 옵션
도커 이미지 빌드 시 유용하게 사용할 수 있는 몇 가지 추가 명령어 옵션들이 있습니다. 이를 통해 빌드를 더욱 효율적으로 관리할 수 있습니다.
3-1. --no-cache
이미지를 빌드할 때 도커는 이전에 빌드한 결과를 캐시로 저장해, 동일한 명령어가 실행될 경우 캐시를 사용하여 빌드 시간을 줄입니다. 그러나 새로운 종속성이나 업데이트된 패키지를 반영해야 할 때는 캐시를 무시하고 새로 빌드해야 합니다. 이때 --no-cache 옵션을 사용합니다.
docker build --no-cache -t my-python-app .
이 명령어는 캐시 없이 이미지를 빌드하여, 모든 명령어를 새롭게 실행합니다.
3-2. -f (Dockerfile 경로 지정)
기본적으로 도커는 현재 디렉토리에서 Dockerfile을 찾지만, 다른 경로에 있는 파일을 사용할 수도 있습니다. -f 옵션을 사용하여 Dockerfile의 경로를 지정할 수 있습니다.
docker build -f ./Dockerfiles/Dockerfile.dev -t my-python-app .
위 명령어는 ./Dockerfiles/ 폴더에 있는 Dockerfile.dev 파일을 사용하여 이미지를 빌드합니다.
4. 이미지 최적화 방법
도커 이미지를 빌드할 때, 이미지 크기와 빌드 시간을 줄이기 위해 최적화하는 방법을 고려하는 것이 좋습니다. 다음은 도커 이미지를 최적화하는 몇 가지 방법입니다.
4-1. 작은 베이스 이미지 사용
이미지 크기를 줄이기 위해, 가능한 한 작은 베이스 이미지를 사용하는 것이 좋습니다.
예를 들어, 일반적인 Ubuntu 이미지 대신 Alpine 이미지를 사용하는 것이 일반적입니다.
Alpine 이미지는 매우 가벼운 리눅스 배포판으로, 이미지 크기를 크게 줄일 수 있습니다.
FROM alpine:latest
4-2. 멀티스테이지 빌드
멀티스테이지 빌드는 빌드와 실행 환경을 분리하여 이미지의 크기를 줄이는 기법입니다.
애플리케이션 빌드에 필요한 도구들은 포함하지 않고, 최종 실행에 필요한 파일만 남깁니다. 다음은 멀티스테이지 빌드의 예입니다.
# 1단계: 빌드용 스테이지
FROM golang:alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 2단계: 실행용 스테이지
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
이 Dockerfile은 Go 애플리케이션을 빌드하고, 최종적으로 애플리케이션 실행에 필요한 파일만 남깁니다.
이를 통해 불필요한 빌드 도구들이 포함되지 않은 가벼운 이미지를 만들 수 있습니다.
5. 이미지 관리
이미지를 빌드한 후, 도커에서 이미지를 관리하는 방법도 중요합니다. 빌드된 이미지를 확인하고, 필요 없는 이미지를 삭제하여 디스크 공간을 절약할 수 있습니다.
5-1. 이미지 목록 확인
현재 로컬에 저장된 도커 이미지를 확인하려면 다음 명령어를 사용합니다.
docker images
5-2. 이미지 삭제
더 이상 사용하지 않는 이미지는 다음 명령어로 삭제할 수 있습니다.
docker rmi 이미지_ID
특정 이미지를 삭제하려면 이미지 ID 또는 이름을 지정하여 삭제합니다.
모든 이미지를 삭제하고 싶다면 다음 명령어를 사용할 수 있습니다.
docker rmi $(docker images -q)
위 명령어는 모든 이미지의 ID를 가져와 한꺼번에 삭제하는 방식입니다.
6. 리눅스 명령어와 도커의 연계
도커 빌드 과정에서 리눅스 명령어와 함께 사용할 때, 자동화를 통한 효율적인 작업이 가능합니다. 예를 들어, 빌드 후 컨테이너가 정상적으로 실행되는지 확인하는 스크립트를 작성할 수 있습니다.
#!/bin/bash docker build -t myapp . docker run -d -p 8080:80 myapp
이 스크립트를 사용하면 이미지를 빌드하고 바로 컨테이너를 실행할 수 있습니다.
이를 통해 매번 수동으로 명령어를 입력하는 대신, 빌드와 실행을 자동화할 수 있습니다.
7. 공식 문서 참조
마무리
도커 이미지 빌드는 애플리케이션 실행 환경을 패키징하는 중요한 과정입니다.
이번 글에서는 Dockerfile을 작성하고, 도커 이미지를 빌드하는 과정을 단계별로 알아보았습니다.
또한, 유용한 명령어와 이미지 최적화 방법을 통해 더 나은 이미지를 만드는 방법도 배웠습니다.
앞으로 다양한 애플리케이션을 도커 이미지로 만들어 배포해 보세요!
과제
- 자신이 자주 사용하는 애플리케이션을 Dockerfile로 정의하고 이미지를 빌드해 보세요.
- --no-cache 옵션을 사용하여 캐시 없이 이미지를 빌드한 후, 빌드 시간 차이를 비교해 보세요.
- 멀티스테이지 빌드를 사용하여 빌드 환경과 실행 환경을 분리한 가벼운 이미지를 만들어보세요.
'프로그래밍 > Docker' 카테고리의 다른 글
[Docker 강의 9편] 다중 컨테이너 환경 구축 (1) | 2024.09.25 |
---|---|
[Docker 강의 8편] Docker Compose 란? (0) | 2024.09.25 |
[Docker 강의 6편] 도커 파일 작성하기 (Dockerfile) (1) | 2024.09.19 |
[Docker 강의 5편] 도커 이미지 최적화 및 관리 (0) | 2024.09.17 |
[Docker 강의 4편] 도커 네트워크와 볼륨 관리 (0) | 2024.09.16 |