이 글에서는 입문자를 위한 도커 시리즈로 도커 입문 시리즈 - Dockerfile 개념 및 사용법에 대해서 소개합니다.
안녕하세요! ITibiza 입니다.
이전 글에서 도커 이미지, 컨테이너의 개념과 도커 명령어에 대해서 알아봤습니다.
2024.08.16 - [개발/Docker] - [도커 입문 시리즈] docker 컨테이너 개념
이 글에서 드디어 이제 도커라이징에서 가장 중요한 기초 Dockerfile에 대해서 알아보겠습니다.
아직 갈길이 멀지만 Dockerfile은 도커에서 가장 중요한 설정 파일입니다.
Dockerfile의 개념 및 사용법
Dockerfile은 도커 이미지를 빌드하기 위한 설정 파일로, 도커 컨테이너를 생성하는 데 필요한 모든 지시 사항을 작성합니다.
Dockerfile은 특정 애플리케이션을 실행하기 위해 필요한 환경 설정, 의존성 설치, 파일 복사, 명령어 실행 등을 자동화된 방식으로 정의합니다.
Dockerfile을 작성하고 해석할 수 있다면 도커 이미지가 어떻게 구성되고 작동하는지 알 수 있다는 의미입니다.
도커 파일은 레이어 개념으로 실행되기 때문에 순서대로 작성해 주는 것이 좋습니다.
Dockerfile의 주요 개념
- 이미지의 설계도: Dockerfile은 일종의 "설계도"로 어떤 이미지를 어떻게 구성할지 정의합니다. Dockerfile을 통해 일관된 환경을 제공하며, 어디서든 동일한 컨테이너를 실행할 수 있습니다.
- 레이어 기반 구조: Dockerfile의 각 명령어는 이미지의 새로운 레이어(Layer)를 생성합니다. 레이어는 파일 시스템의 스냅숏으로 Dockerfile의 명령어에 따라 추가됩니다. 이미 빌드된 레이어는 캐싱되어 효율적인 빌드를 가능하게 합니다.
- 불변성: 도커 이미지는 불변(immutable)입니다. 이미 생성된 이미지는 변경할 수 없으며 새로운 변경 사항을 반영하려면 새로운 이미지를 빌드해야 합니다.
Dockerfile 작성 방법
Dockerfile은 특정 명령어를 사용해 단계적으로 이미지를 구성합니다.
각 명령어는 이미지에 새로운 레이어를 추가하며 아래는 Dockerfile의 기본 구조와 주요 명령어를 소개합니다.
Dockerfile 기본 예제
간단한 Node.js 애플리케이션을 위한 Dockerfile을 예제로 사용해 보겠습니다.
node.js & Dockerfile 소스를 다운로드하여주세요.
https://github.com/yoogukhyeon/docker_seris/tree/main
소스코드가 도움이 많이 되셨다면 github follow 하고 서로의 지식을 공유해요!
https://github.com/yoogukhyeon
# 1. 베이스 이미지 설정
FROM node:14
# 2. 작업 디렉토리 설정
WORKDIR /app
# 3. 의존성 파일 복사 및 설치
COPY package*.json ./
RUN npm install
# 4. 애플리케이션 코드 복사
COPY . /app
# 5. 컨테이너가 사용하는 포트 노출
EXPOSE 3000
# 6. 컨테이너 시작 시 실행할 명령어
CMD ["npm", "start"]
이 Dockerfile을 단계별로 살펴보겠습니다.
Dockerfile 명령어 설명
FROM node:14
- FROM:
- FROM은 필수 명령어로, 사용할 베이스 이미지를 지정합니다. 베이스 이미지는 새로운 이미지의 출발점이 됩니다. 여기서는 Node.js 14 버전을 포함한 공식 이미지를 사용합니다.
- 로컬에 해당 이미지가 없을 경우 Docker Hub에서 이미지를 가져옵니다.
WORKDIR /app
- WORKDIR:
- WORKDIR은 작업 디렉터리를 설정하는 명령어입니다. 이 디렉토리는 이후 모든 명령어가 실행될 기본 디렉토리가 됩니다. 이 명령어를 사용하면, 다른 명령어에서 경로를 상대적으로 지정할 수 있어 편리합니다.
COPY package*.json ./
- COPY:
- COPY는 파일 또는 디렉토리를 호스트 시스템에서 컨테이너 이미지의 파일 시스템으로 복사합니다. 여기서는 package.json과 package-lock.json 파일을 컨테이너의 작업 디렉터리로 복사합니다.
RUN npm install
- RUN:
- RUN은 컨테이너에서 명령어를 실행합니다. 이 명령어는 새로운 레이어를 생성하고, 실행 결과를 다음 레이어로 전달합니다. 여기서는 애플리케이션의 의존성을 설치합니다.
COPY . /app
- COPY (다시):
- 두 번째 COPY 명령어는 전체 애플리케이션 코드를 컨테이너로 복사합니다. 이는 이전에 설치된 의존성 위에 애플리케이션 코드를 추가합니다.
EXPOSE 3000
- EXPOSE:
- EXPOSE는 컨테이너가 사용하는 네트워크 포트를 지정합니다. 이 포트는 주로 문서화 용도로 사용되며, 컨테이너를 실행할 때 p 옵션으로 실제 호스트 포트와 매핑할 수 있습니다.
CMD ["npm", "start"]
- CMD:
- CMD는 컨테이너가 시작될 때 실행할 기본 명령어를 지정합니다. CMD는 한 번만 사용할 수 있으며, 컨테이너 실행 시 명령어를 오버라이드할 수 있습니다. 여기서는 npm start 명령어로 Node.js 애플리케이션을 시작합니다.
Dockerfile 사용 예제
docker build -t my-node-app .
- Dockerfile 빌드:
- 이 명령어는 현재 디렉터리의 Dockerfile을 읽고, my-node-app이라는 이름으로 이미지를 빌드합니다.. 은 Dockerfile이 위치한 디렉터리를 지정합니다.
docker run -d -p 3000:3000 my-node-app
- 컨테이너 실행:
- 빌드된 이미지를 기반으로 컨테이너를 실행합니다. 이 명령어는 호스트의 포트 3000을 컨테이너의 포트 3000에 매핑하고, 컨테이너를 백그라운드에서 실행합니다.
Dockerfile 작성 시 유의사항
- 최소한의 베이스 이미지 사용: 불필요한 파일이나 패키지가 포함되지 않은 최소한의 베이스 이미지를 사용하는 것이 좋습니다. 이렇게 하면 이미지 크기를 줄이고 보안을 강화할 수 있습니다.
- 캐시 활용: RUN, COPY 명령어 등을 적절하게 사용하여 캐시를 최대한 활용하면 빌드 시간을 단축할 수 있습니다. 자주 변경되는 파일은 Dockerfile의 하단에 위치시켜, 상단 레이어의 캐시가 무효화되지 않도록 합니다.
- 다중 단계 빌드: 복잡한 애플리케이션에서는 여러 단계를 가진 Dockerfile을 작성하여 빌드 단계에서만 필요한 파일을 포함하거나, 최종 이미지에는 필요한 파일만 포함시킬 수 있습니다.
Dockerfile 개념 및 사용법을 마지막으로
Dockerfile은 도커 이미지의 구성 요소를 자동화된 방식으로 정의하는 강력한 도구입니다.
잘 작성된 Dockerfile은 애플리케이션의 배포를 간소화하고, 일관된 실행 환경을 제공하며, 개발과 운영 간의 협업을 용이하게 합니다.
Dockerfile을 통해 반복 가능한 빌드 프로세스를 설정하고, 언제 어디서나 동일한 환경에서 애플리케이션을 실행할 수 있습니다.
이제 우리는 Dockerfile 작성함으로 한 단계 더 성장했습니다.
다음 글에는 dockerignore에 개념에 대해서 알아보겠습니다.
필자의 잘못된 부분이나 피드백은 언제든지 댓글로 남겨주세요!
감사합니다^^
2024.08.19 - [AWS] - [AWS] ECR(Elastic Container Registry) 개념
2024.08.14 - [경제용어] - 신용카드 페이백(Payback) 개념
'개발 > Docker' 카테고리의 다른 글
[도커 입문 시리즈] docker 컨테이너 개념 (0) | 2024.08.16 |
---|---|
[도커 입문 시리즈] docker 이미지와 컨테이너 사용법 알아보기 (0) | 2024.08.08 |
[도커 입문 시리즈] docker 이미지와 레이어 개념 (0) | 2024.08.02 |
[도커 입문 시리즈] MacOS에서 Docker 설치하는 방법 (0) | 2024.07.31 |