안녕하세요 펭귄 교수입니다.
이번 글에서는 도커에서 이미지를 만들기 위해 사용하는 Dockerfile 작성법에 대해 알아보겠습니다.
Dockerfile은 도커 이미지를 자동으로 생성할 수 있는 설정 파일로, 애플리케이션의 환경 설정과 실행 방식을 정의합니다.
쉽게 말해, Dockerfile은 도커 이미지의 레시피라고 할 수 있습니다.
이 글에서는 Dockerfile의 기본 구조와 사용법을 쉽게 설명하겠습니다.
1. Dockerfile이란?
Dockerfile은 도커 이미지의 빌드 과정을 설명하는 텍스트 파일입니다.
이 파일을 기반으로 도커는 이미지를 만들고, 만들어진 이미지를 사용해 애플리케이션을 실행하는 컨테이너를 만듭니다.
Dockerfile은 여러 명령어들로 구성되며, 각 명령어는 이미지에 필요한 파일을 추가하거나 설정을 지정합니다.
이미지를 빌드할 때는 Dockerfile의 내용을 차례대로 실행하여 최종적으로 컨테이너 실행에 필요한 이미지를 생성합니다.
2. Dockerfile의 기본 구조
Dockerfile은 다음과 같은 기본적인 명령어들로 구성됩니다:
- FROM: 베이스 이미지 설정
- WORKDIR: 작업 디렉토리 설정
- COPY 또는 ADD: 파일 복사
- RUN: 명령어 실행
- CMD 또는 ENTRYPOINT: 컨테이너가 실행될 때 실행할 명령어 설정
2-1. FROM: 베이스 이미지 설정
FROM 명령어는 도커 이미지의 베이스 이미지를 설정합니다. 베이스 이미지는 애플리케이션이 실행될 운영체제를 지정하는 역할을 합니다. 가장 많이 사용되는 베이스 이미지는 Ubuntu, Alpine 등입니다.
# Ubuntu를 베이스 이미지로 사용
FROM ubuntu:latest
또는 더 가벼운 Alpine 이미지를 사용할 수도 있습니다.
# 작은 Alpine 이미지를 베이스 이미지로 사용
FROM alpine:latest
2-2. WORKDIR: 작업 디렉토리 설정
WORKDIR 명령어는 컨테이너 내부에서 명령어를 실행할 작업 디렉토리를 설정합니다. 이 명령어를 사용하면 컨테이너 안에서 파일을 복사하거나 명령어를 실행할 때 경로를 지정하지 않아도 됩니다.
# 작업 디렉토리를 /app으로 설정
WORKDIR /app
2-3. COPY 또는 ADD: 파일 복사
COPY와 ADD 명령어는 호스트 시스템(로컬 컴퓨터)의 파일을 컨테이너 내부로 복사하는 역할을 합니다. 둘 다 비슷한 기능을 하지만, ADD는 파일 압축 해제 기능도 제공합니다.
# 호스트의 현재 디렉토리에서 모든 파일을 컨테이너의 /app 디렉토리로 복사
COPY . /app
2-4. RUN: 명령어 실행
RUN 명령어는 컨테이너 빌드 과정에서 필요한 명령어를 실행합니다.
보통 패키지를 설치하거나 파일을 생성하는 데 사용됩니다.
RUN 명령어는 새 레이어를 생성하며, 각 레이어는 변경사항을 저장해 나중에 재사용됩니다.
# 패키지 업데이트 및 nginx 설치
RUN apt-get update && apt-get install -y nginx
2-5. CMD와 ENTRYPOINT: 컨테이너 실행 명령어
CMD와 ENTRYPOINT는 컨테이너 실행 시 어떤 명령어를 실행할지를 지정합니다.
두 명령어 모두 비슷한 기능을 하지만,
차이점은 CMD는 실행 시 명령어를 덮어쓸 수 있고, ENTRYPOINT는 고정된 실행 명령어를 지정하는 데 사용됩니다.
# 컨테이너가 시작될 때 Nginx 서버 실행
CMD ["nginx", "-g", "daemon off;"]
3. Dockerfile 예제
이제 위의 명령어들을 조합해서 간단한 Dockerfile을 작성해 보겠습니다. 이 예제는 Nginx 웹 서버를 설치하고, 특정 HTML 파일을 서빙하는 이미지를 만듭니다.
예제: Nginx 웹 서버 Dockerfile
# 1. 베이스 이미지로 Ubuntu 최신 버전 사용
FROM ubuntu:latest
# 2. 작업 디렉토리 설정
WORKDIR /var/www/html
# 3. 필요한 패키지 설치 (Nginx)
RUN apt-get update && apt-get install -y nginx
# 4. 로컬 파일을 컨테이너로 복사
COPY ./index.html .
# 5. Nginx 서버 실행
CMD ["nginx", "-g", "daemon off;"]
설명:
- 베이스 이미지: Ubuntu 최신 버전을 사용하여 기본 환경을 설정합니다.
- 작업 디렉토리: /var/www/html로 설정하여 웹 파일을 저장할 디렉토리를 지정합니다.
- 패키지 설치: RUN 명령어로 apt-get을 통해 Nginx 웹 서버를 설치합니다.
- 파일 복사: 호스트의 index.html 파일을 컨테이너의 /var/www/html 디렉토리로 복사합니다
- 컨테이너 실행 시 Nginx 실행: CMD 명령어로 Nginx를 실행하며, Nginx가 백그라운드에서 실행되지 않고, 컨테이너가 종료될 때까지 실행됩니다.
4. Dockerfile 빌드하기
Dockerfile을 작성했다면, 이 파일을 기반으로 도커 이미지를 **빌드(build)**할 수 있습니다. 빌드를 위해서는 docker build 명령어를 사용합니다.
Dockerfile 빌드 명령어
docker build -t my-nginx-app .
- -t my-nginx-app: 빌드할 이미지의 이름을 지정합니다.
- .: 현재 디렉토리에 있는 Dockerfile을 사용한다는 뜻입니다.
빌드가 완료되면 my-nginx-app이라는 이름의 도커 이미지가 생성됩니다. 이 이미지를 바탕으로 컨테이너를 실행할 수 있습니다.
5. 컨테이너 실행하기
이제 만들어진 이미지를 기반으로 컨테이너를 실행할 수 있습니다. 컨테이너는 docker run 명령어로 실행합니다.
컨테이너 실행 명령어
docker run -d -p 8080:80 my-nginx-app
- -d: 컨테이너를 백그라운드에서 실행합니다.
- -p 8080:80: 호스트의 8080번 포트를 컨테이너의 80번 포트에 연결합니다.
- my-nginx-app: 실행할 이미지의 이름입니다.
이제 브라우저에서 http://localhost:8080으로 접속하면 Nginx 웹 서버가 실행된 것을 확인할 수 있습니다.
6. Dockerfile 베스트 프랙티스
Dockerfile을 작성할 때는 다음의 베스트 프랙티스를 따르면 이미지 크기를 줄이고 빌드 시간을 단축할 수 있습니다.
6-1. 작은 베이스 이미지 사용
이미지 크기를 줄이려면 작은 베이스 이미지를 사용하는 것이 좋습니다.
예를 들어, Alpine 이미지는 매우 가벼운 리눅스 배포판으로, 필요 없는 패키지가 적고 용량이 작습니다.
FROM alpine:latest
6-2. 캐시 활용하기
RUN 명령어를 사용할 때, 명령어 순서를 잘 정리하면 도커의 캐시를 효과적으로 활용할 수 있습니다.
패키지 설치나 파일 복사 명령어는 변경이 적은 것부터 먼저 실행하는 것이 좋습니다.
# 자주 변경되지 않는 파일을 먼저 복사
COPY package.json /app RUN npm install
# 그 후 나머지 파일을 복사
COPY . /app
과제
- 자신의 애플리케이션을 Dockerfile로 빌드해보세요. 베이스 이미지를 선택하고, 애플리케이션의 실행 환경을 구축해봅니다.
- Alpine 베이스 이미지를 사용하여 최소화된 이미지를 만들어보세요.
- CMD와 ENTRYPOINT의 차이를 더 깊이 공부하고, 적절한 상황에서 각각을 사용해보세요.
7. 공식 문서 참조
마무리
Dockerfile은 도커 이미지를 만들 때 매우 중요한 역할을 합니다. 베이스 이미지를 선택하고, 필요한 패키지나 파일을 추가하고, 애플리케이션 실행 방식을 설정하는 모든 과정이 Dockerfile에 정의됩니다.
이번 글을 통해 Dockerfile 작성법을 이해하고, 직접 이미지를 만들어 보세요. 앞으로 도커 이미지를 만들고 관리하는 데 있어서 큰 도움이 될 것입니다.
'Docker > Docker 강의' 카테고리의 다른 글
[Docker 강의 8편] Docker Compose 란? (0) | 2024.09.25 |
---|---|
[Docker 강의 7편] 도커 이미지 빌드 (0) | 2024.09.23 |
[Docker 강의 5편] 도커 이미지 최적화 및 관리 (0) | 2024.09.17 |
[Docker 강의 4편] 도커 네트워크와 볼륨 관리 (0) | 2024.09.16 |
[Docker 강의 3편] 도커 기본 명령어 사용법 (0) | 2024.09.15 |