컨테이너 가상화 기술인 도커(Docker)를 활용하여 자신만의 개발 환경을 구축하거나 완성된 애플리케이션을 배포할 때, 이미 만들어진 기존 이미지를 그대로 사용하는 것만으로는 한계에 부딪히게 됩니다. 사용자가 원하는 특정 소프트웨어 버전, 필수 라이브러리, 전용 설정 파일 및 자동 실행 스크립트 등을 포함하는 나만의 맞춤형 도커 이미지를 직접 제작해야 하는 순간이 반드시 찾아옵니다.
이처럼 도커 이미지를 자동으로 생성하기 위한 일종의 '설계도' 또는 '레시피' 역할을 하는 텍스트 파일이 바로 Dockerfile(도커파일)입니다. Dockerfile을 올바르게 작성할 수 있다면 복잡한 서버 환경 구축 과정을 단 하나의 텍스트 파일로 코드화(Infrastructure as Code)하여 어디서나 동일하게 재현할 수 있습니다.
본 글에서는 Dockerfile의 기본 개념과 필요성부터 핵심 명령어 문법, 실전 작성 단계, 그리고 최적화 팁과 주의사항까지 초보자의 눈높이에 맞춰 상세히 알아 보겠습니다.
1. Dockerfile의 개념과 필요성 및 작동 원리
Dockerfile은 도커 이미지를 빌드하기 위해 필요한 모든 명령어를 순서대로 기록해 둔 확장자가 없는 텍스트 문서 파일입니다.
[이미지: 텍스트 형태의 Dockerfile이 docker build 명령어를 거쳐 완성된 도커 이미지로 변환되는 과정 구조도]
Dockerfile을 활용하여 이미지를 직접 제작할 때 얻을 수 있는 대표적인 장점과 작동 원리는 다음과 같습니다.
- 환경 구축의 자동화 및 코드화: 수동으로 가상머신이나 컨테이너에 접속하여 패키지를 설치하던 복잡한 과정을 단 하나의 파일로 명시하여 자동화합니다.
- 뛰어난 이식성과 공유 용량 절감: 용량이 수 백 메가바이트(MB)에 달하는 이미지 파일 전체를 전달할 필요 없이, 몇 킬로바이트(KB) 수준의 작은 Dockerfile 텍스트 파일 하나만 팀원들과 공유하면 누구나 똑같은 이미지를 빌드해 낼 수 있습니다.
- 레이어(Layer) 기반 빌드 구조: Dockerfile의 한 줄 한 줄은 각각 하나의 레이어(Layer)로 쌓이게 됩니다. 이미 빌드된 레이어는 캐시(Cache)되어 재사용되므로 수정된 부분만 빠르게 다시 빌드할 수 있는 효율적인 구조를 가집니다.
2. Dockerfile 작성을 위한 핵심 필수 명령어 문법
Dockerfile 내부에서 사용되는 핵심 키워드 명령어들은 대문자로 작성하는 것이 표준 규칙입니다. 가장 대중적으로 사용되는 필수 명령어 구문은 다음과 같습니다.
기본 문법 및 키워드 상세 설명
- FROM: 생성할 이미지의 바탕이 되는 베이스 이미지(Base Image)를 지정합니다. Dockerfile의 최상단에 반드시 위치해야 합니다. (예: FROM ubuntu:22.04, FROM node:18)
- WORKDIR: 명령어가 실행될 컨테이너 내부의 작업 디렉터리 경로를 지정합니다. 이후 실행되는 모든 명령어는 이 디렉터리를 기준으로 작동합니다. (예: WORKDIR /app)
- COPY / ADD: 호스트 컴퓨터의 파일이나 디렉터리를 컨테이너 내부로 복사합니다. 단순 파일 복사는 COPY 사용을 강력히 권장합니다. (예: COPY . .)
- RUN: 새로운 레이어를 만들며 패키지 설치나 명령어를 실행합니다. 이미지 빌드 시점에 실행됩니다. (예: RUN apt update && apt install -y python3)
- ENV: 컨테이너 내부에서 사용할 환경 변수를 설정합니다. (예: ENV PORT=8080)
- EXPOSE: 컨테이너가 외부로 개방할 포트 번호를 명시합니다. (문서화 용도이며 실제 포트 개방은 실행 시 -p 옵션으로 처리합니다.)
- CMD: 컨테이너가 생성되고 최종적으로 실행될 때 구동되는 메인 명령어를 지정합니다. Dockerfile 내에서 단 한 번만 효과를 가집니다. (예: CMD ["python3", "main.py"])
3. 실전 웹 서버 Dockerfile 작성 및 이미지 빌드 단계
실제 간단한 파이썬(Python) 기반 웹 애플리케이션을 도커 이미지로 직접 빌드하는 전체 실습 단계입니다.
[이미지: 터미널 창에서 docker build 명령어를 입력하여 Dockerfile이 단계별로 빌드되는 화면]
자주 묻는 질문 (FAQ)
Q1. RUN 명령어와 CMD 명령어의 차이점은 무엇인가요?
A1. RUN 명령어는 도커 이미지를 만드는 빌드(Build) 과정에서 패키지 설치나 환경 구성을 위해 실행되며, 여러 번 사용할 수 있습니다. 반면 CMD 명령어는 완성된 이미지를 바탕으로 컨테이너가 출발하여 시작(Start)되는 시점에 실행할 최종 명령어를 지정하며, Dockerfile 내에서 가장 마지막에 기술된 단 하나만 적용됩니다.
Q2. COPY 명령어와 ADD 명령어 중 어떤 것을 써야 하나요?
A2. 두 명령어 모두 호스트 파일 시스템의 파일을 컨테이너 내부로 복사하는 역할을 수행하지만, 일반적인 파일 복사 작업 시에는 COPY 명령어 사용을 공식 권장합니다. ADD 명령어는 원격 URL 주소의 파일을 다운로드하거나 .tar.gz 압축 파일을 복사 시 자동으로 풀어서 넣어주는 추가 특수 기능이 포함되어 있어 예기치 못한 빌드 오류를 야기할 수 있습니다.
Q3. 완성된 도커 이미지의 용량이 너무 큰데 줄이는 방법이 있나요?
A3. 이미지 용량을 줄이기 위해 베이스 이미지를 기본 이미지 대신 경량화된 버전(예: alpine 또는 slim 태그)으로 지정하는 것이 좋습니다. 또한 여러 개의 RUN 명령어를 && 연산자로 묶어 하나의 레이어로 합성하고, 설치 후 남는 임시 캐시 파일(apt-get clean, --no-cache-dir 등)을 바로 삭제해 주는 최적화 기법을 적용해야 합니다.
결론
Dockerfile은 복잡한 서버 개발 환경과 애플리케이션 구동 요소를 텍스트 코드 형태로 완전하게 규격화해 주는 강력한 도구입니다.
FROM, WORKDIR, COPY, RUN, CMD 등 기본이 되는 명확한 필수 키워드 문법을 숙지하고 자신만의 빌드 순서를 설계해 나가면, 어떠한 복잡한 프로젝트라도 클릭 몇 번과 명령어 한 줄로 완벽하게 복제해 낼 수 있는 가상화 환경을 구성할 수 있습니다.
본 안내서의 기본 문법과 작성 절차를 바탕으로 나만의 애플리케이션을 담은 맞춤형 도커 이미지를 직접 빌드해 보시기 바랍니다.
'가상화 및 서브 PC 활용' 카테고리의 다른 글
| 도커 컨테이너 포트 포워딩(Port Forwarding) 설정 및 외부 접속 가이드 (0) | 2026.10.28 |
|---|---|
| 도커 컨테이너 바인드 마운트(Bind Mount)와 볼륨(Volume) 차이 및 설정법 (0) | 2026.10.28 |
| Windows 11에서 Hyper-V 활성화 및 가상머신 생성하는 방법 (0) | 2026.10.28 |
| 구형 서브 PC 저전력 서버 만들기: 가상화를 이용한 24시간 가동 환경 세팅 (0) | 2026.10.27 |
| 도커 컴포즈(Docker Compose) 기초: yml 파일로 여러 컨테이너 한 번에 실행하기 (0) | 2026.10.27 |