개발/Docker

[도커 입문 시리즈] Dockerfile 개념 및 사용법

ITIbiza 2024. 8. 22. 15:03

도커

 

이 글에서는 입문자를 위한 도커 시리즈로 도커 입문 시리즈 - Dockerfile 개념 및 사용법에 대해서 소개합니다.

 

안녕하세요! ITibiza 입니다.

 

이전 글에서 도커 이미지, 컨테이너의 개념과 도커 명령어에 대해서 알아봤습니다.

 

2024.08.16 - [개발/Docker] - [도커 입문 시리즈] docker 컨테이너 개념

 

[도커 입문 시리즈] docker 컨테이너 개념

이 글에서는 입문자를 위한 도커 시리즈로 도커 입문 시리즈 - Docker 컨테이너 개념에 대해서 소개합니다. 안녕하세요! ITibiza입니다. 쉽게 설명해서 도커란?도커는 다양한 운영체제에서 리눅스

itibiza.tistory.com

 

이 글에서 드디어 이제 도커라이징에서 가장 중요한 기초 Dockerfile에 대해서 알아보겠습니다.

 

아직 갈길이 멀지만 Dockerfile은 도커에서 가장 중요한 설정 파일입니다.

 

dockerfile

Dockerfile의 개념 및 사용법

Dockerfile은 도커 이미지를 빌드하기 위한 설정 파일로, 도커 컨테이너를 생성하는 데 필요한 모든 지시 사항을 작성합니다.

 

Dockerfile은 특정 애플리케이션을 실행하기 위해 필요한 환경 설정, 의존성 설치, 파일 복사, 명령어 실행 등을 자동화된 방식으로 정의합니다.

Dockerfile을 작성하고 해석할 수 있다면 도커 이미지가 어떻게 구성되고 작동하는지 알 수 있다는 의미입니다.

 

도커 파일은 레이어 개념으로 실행되기 때문에 순서대로 작성해 주는 것이 좋습니다.

 

Dockerfile의 주요 개념

  1. 이미지의 설계도: Dockerfile은 일종의 "설계도"로 어떤 이미지를 어떻게 구성할지 정의합니다. Dockerfile을 통해 일관된 환경을 제공하며, 어디서든 동일한 컨테이너를 실행할 수 있습니다.
  2. 레이어 기반 구조: Dockerfile의 각 명령어는 이미지의 새로운 레이어(Layer)를 생성합니다. 레이어는 파일 시스템의 스냅숏으로 Dockerfile의 명령어에 따라 추가됩니다. 이미 빌드된 레이어는 캐싱되어 효율적인 빌드를 가능하게 합니다.
  3. 불변성: 도커 이미지는 불변(immutable)입니다. 이미 생성된 이미지는 변경할 수 없으며 새로운 변경 사항을 반영하려면 새로운 이미지를 빌드해야 합니다.

 

Dockerfile 작성 방법

Dockerfile은 특정 명령어를 사용해 단계적으로 이미지를 구성합니다.

각 명령어는 이미지에 새로운 레이어를 추가하며 아래는 Dockerfile의 기본 구조와 주요 명령어를 소개합니다.

 

Dockerfile 기본 예제

간단한 Node.js 애플리케이션을 위한 Dockerfile을 예제로 사용해 보겠습니다.

 

node.js & Dockerfile 소스를 다운로드하여주세요.

https://github.com/yoogukhyeon/docker_seris/tree/main

 

GitHub - yoogukhyeon/docker_seris

Contribute to yoogukhyeon/docker_seris development by creating an account on GitHub.

github.com

 

소스코드가 도움이 많이 되셨다면 github follow 하고 서로의 지식을 공유해요!

https://github.com/yoogukhyeon

 

yoogukhyeon - Overview

Hello Frontend and Backend Software Engineer 💻 - yoogukhyeon

github.com

 

# 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 작성 시 유의사항

  1. 최소한의 베이스 이미지 사용: 불필요한 파일이나 패키지가 포함되지 않은 최소한의 베이스 이미지를 사용하는 것이 좋습니다. 이렇게 하면 이미지 크기를 줄이고 보안을 강화할 수 있습니다.
  2. 캐시 활용: RUN, COPY 명령어 등을 적절하게 사용하여 캐시를 최대한 활용하면 빌드 시간을 단축할 수 있습니다. 자주 변경되는 파일은 Dockerfile의 하단에 위치시켜, 상단 레이어의 캐시가 무효화되지 않도록 합니다.
  3. 다중 단계 빌드: 복잡한 애플리케이션에서는 여러 단계를 가진 Dockerfile을 작성하여 빌드 단계에서만 필요한 파일을 포함하거나, 최종 이미지에는 필요한 파일만 포함시킬 수 있습니다.

 

Dockerfile 개념 및 사용법을 마지막으로

Dockerfile은 도커 이미지의 구성 요소를 자동화된 방식으로 정의하는 강력한 도구입니다.

 

잘 작성된 Dockerfile은 애플리케이션의 배포를 간소화하고, 일관된 실행 환경을 제공하며, 개발과 운영 간의 협업을 용이하게 합니다.

Dockerfile을 통해 반복 가능한 빌드 프로세스를 설정하고, 언제 어디서나 동일한 환경에서 애플리케이션을 실행할 수 있습니다.

 

이제 우리는 Dockerfile 작성함으로 한 단계 더 성장했습니다.

 

다음 글에는 dockerignore에 개념에 대해서 알아보겠습니다.

 

 


 

 

필자의 잘못된 부분이나 피드백은 언제든지 댓글로 남겨주세요!

감사합니다^^

 

 

2024.08.19 - [AWS] - [AWS] ECR(Elastic Container Registry) 개념

 

[AWS] ECR(Elastic Container Registry) 개념

안녕하세요! ITibiza입니다. AWS 아마존에서 제공하는 클라우드 컴퓨팅 서비스입니다. 클라우드 컴퓨팅을 쉽게 이해하면 기업과 개인이 물리적인 서버를 구매하거나 유지할 필요 없이 필요한 서

itibiza.tistory.com

 

2024.08.14 - [경제용어] - 신용카드 페이백(Payback) 개념

 

신용카드 페이백(Payback) 개념

안녕하세요! ITibiza 입니다. 필자는 현재 우리은행, 나이스정보통신과 해외 여행객들은 위한 충전식 체크카드를 출시 준비 중입니다.여기서 카드 정책에 대해서 토론을 하면서 페이백에 대한 기

itibiza.tistory.com