2.1 Dockerfile의 기본 개념
Dockerfile은 텍스트 파일로, Docker가 이미지를 생성하기 위해 사용하는 명령어들의 순서를 담고 있어. 이건 이미지가 기본 레이어부터 최종 상태까지 어떻게 조립될지 설명하는 "레시피" 같은 거야. Docker를 효과적으로 사용하려면 Dockerfile의 구조와 생성 프로세스를 이해하는 게 중요해.
Dockerfile의 기본 개념:
- 멱등성: Dockerfile의 명령들은 멱등적이어야 해 — 여러 번 실행해도 항상 동일한 결과를 내야 해.
- 순서: 명령들은 위에서 아래로 순서대로 실행돼. 순서가 중요해, 왜냐면 각 명령이 이미지의 새로운 레이어를 생성하거든.
- 레이어 구조: 사실상 거의 모든 명령어가 이미지에 새로운 레이어를 추가해. 이 레이어들이 캐시되기 때문에 빌드 과정을 최적화할 수 있어.
Dockerfile 구조:
Dockerfile은 각각의 특정 작업을 수행하는 명령어들로 구성돼. 주요 명령어는 다음과 같아:
- FROM: 새로운 이미지를 만들기 위해 사용할 기본 이미지를 지정해.
- MAINTAINER: Dockerfile 작성자를 정의해 (이건 오래된 방법이지만 정보로써 유용해).
- RUN: 컨테이너에서 명령을 실행하고 새로운 레이어를 생성해.
- COPY: 빌드 컨텍스트에서 파일과 디렉토리를 컨테이너 파일 시스템으로 복사해.
- ADD: 파일과 디렉토리를 복사하고, 압축 파일 추출 및 URL을 통한 파일 다운로드를 지원해.
- WORKDIR: 이후 명령어들을 위한 작업 디렉토리를 설정해.
- ENV: 환경 변수를 설정해.
- CMD: 컨테이너 실행 시 기본적으로 실행되는 명령을 정의해.
- ENTRYPOINT: 컨테이너 실행 시 실행될 명령과 전달할 수 있는 인자를 설정해.
- EXPOSE: 컨테이너가 사용하는 포트를 지정해.
- VOLUME: 외부 볼륨을 위한 마운트 포인트를 생성해.
2.2 Dockerfile 생성
Dockerfile 생성 예제
Node.js 웹 애플리케이션을 위한 간단한 Dockerfile 생성 예제를 살펴볼게.
1단계: 기본 Dockerfile 생성
프로젝트의 루트 디렉토리에 Dockerfile이라는 이름의 파일을 만들고 다음 내용을 추가해봐:
# Node.js 기본 이미지 사용
FROM node:14
# 작업 디렉토리 설정
WORKDIR /app
# package.json 및 package-lock.json 복사
COPY package*.json ./
# 의존성 설치
RUN npm install
# 프로젝트 파일 전부 복사
COPY . .
# 애플리케이션이 사용할 포트 지정
EXPOSE 3000
# 애플리케이션 실행 명령 정의
CMD ["node", "app.js"]
이 Dockerfile은 다음 작업을 수행해:
- FROM node:14: 버전 14의 공식
Node.js이미지를 기본으로 사용해. - WORKDIR /app: 이후 명령어들에 대한 작업 디렉토리를 설정해.
- COPY package*.json ./:
package.json과package-lock.json파일을 작업 디렉토리로 복사해. - RUN npm install:
package.json에 있는 의존성들을 설치해. - COPY . .: 프로젝트의 모든 파일을 컨테이너의 작업 디렉토리로 복사해.
- EXPOSE 3000: 애플리케이션이 사용할 포트를 3000으로 지정해.
- CMD ["node", "app.js"]: 애플리케이션 실행 명령을 정의해.
2단계: 이미지 빌드
Dockerfile 생성 후 docker build 명령어를 사용해서 이미지를 빌드해:
docker build -t my-node-app .
이 명령어는 현재 디렉토리의 Dockerfile을 사용해서 my-node-app이라는 이름의 이미지를 생성해.
3단계: 컨테이너 실행
생성된 이미지를 기반으로 docker run 명령어를 사용해서 컨테이너를 실행해봐:
docker run -d -p 3000:3000 my-node-app
이 예제는 컨테이너를 백그라운드에서 실행시키고, 컨테이너의 3000번 포트를 호스트 머신의 3000번 포트에 매핑해. 이제 http://localhost:3000에서 애플리케이션에 접근할 수 있어!
2.3 Dockerfile 추가 지침
1. 환경 변수 설정
ENV 지침을 사용해서 컨테이너에서 접근 가능한 환경 변수를 설정할 수 있어.
ENV NODE_ENV=production
2. 여러 RUN 명령 사용
때로는 RUN 지침에서 여러 명령을 하나로 합치는 게 나을 수 있어. 이렇게 하면 레이어 수를 줄이고, 이미지 크기를 줄이며 빌드 속도를 높일 수 있지.
RUN apt-get update && apt-get install -y \
curl \
git \
&& rm -rf /var/lib/apt/lists/*
유용해! 명령이 한 줄에 들어가지 않으면, \ 기호를 사용해서 다음 줄로 이어갈 수 있어. 이렇게 하면 전체가 하나의 명령으로 해석되지.
유용해! 여러 명령을 한 줄로 작성하려면 &&을 사용할 수 있어: command1 && command2 && command3. 이렇게 하면 몇 가지 명령을 순차적으로 실행할 수 있어.
명령 순서 최적화
Docker 캐시를 효과적으로 활용하려면 자주 변경되지 않는 파일(예: package.json)을 먼저 복사하고, 프로젝트의 나머지 파일을 추가하기 전에 종속성을 설치해야 해.
고급 Dockerfile 예제
더 복잡한 프로젝트에서는 추가 설정이 포함된 고급 Dockerfile이 필요할 수 있어.
# 최소화된 Node.js 베이스 이미지 사용
FROM node:14-alpine
# 작업 디렉터리 설정
WORKDIR /usr/src/app
# package.json 파일 복사 및 종속성 설치
COPY package*.json ./
RUN npm install --only=production
# 소스 코드 복사
COPY . .
# 작동에 필요한 포트 명시
EXPOSE 8080
# 환경 변수 설정
ENV NODE_ENV=production
# 애플리케이션 실행
CMD ["node", "server.js"]
GO TO FULL VERSION