[Docker] Dockerfile이란? 주요 명령어와 이미지 생성
by 우와한개발자
1. Dockerfile이란?
- Docker 이미지를 구성하고 정의하는 텍스트 파일
- Docker 엔진이 이미지를 만들기 위해 실행할 CLI 명령 목록이 순서대로 적혀 있음
- 이미지 생성 프로세스를 자동화해주는 파일
- 애플리케이션 개발과 운영의 여러 측면에서 효율성과 일관성을 제공하는 핵심 도구
1)Dockerfile이 필요한 이유
| 필요성 | 설명 |
| 일관성과 격리성 | 애플리케이션과 필요한 모든 구성 요소를 하나의 이미지로 묶어, 항상 동일한 동작을 보장 |
| 효율적인 배포 및 관리 | 이미지를 다른 환경으로 이동하거나 공유하는 것이 간단하고, 배포 과정의 문제를 최소화 |
| 환경의 일관성 | 개발/테스트/운영 환경에서 동일한 이미지를 사용하여 일관된 프로세스 구축 가능 |
| 성능 및 확장성 | 필요한 라이브러리와 의존성만 포함해 이미지 크기를 최소화하고, 복제와 확장이 용이 |
2. Dockerfile 기본 구조
# 주석
명령문 [옵션]
⚠️ 명령문과 옵션 사이의 공백( ) 꼭 쓰기!
# 예시 : app.jar 파일을 실행하는 Java 애플리케이션 Dockerfile
# 1. 베이스 이미지
FROM openjdk:17-jdk-slim
# 2. 작업 디렉토리 생성
WORKDIR /app
# 3. 파일 복사
COPY . /app
# 4. 실행 명령어
CMD ["java", "-jar", "app.jar"]
| 항목 | 설명 |
| # | 주석을 나타내며, 이미지를 빌드하는 동안 무시됨 |
| 명령문 | 도커파일에서 실행할 명령어 (FROM, RUN, COPY, CMD 등) |
| 옵션 | 명령에 대한 인수 |
3. Dockerfile 주요 명령문
- 구조(문법)에서 명령어는 컨테이너 내부 OS"에서 실행되는 명령어
| 명령문 | 구조 (문법) | 설명 | 예시 |
| FROM | FROM 이미지명[:태그] | 기반(base)이 될 이미지 지정. Dockerfile의 첫 번째 명령어 | FROM ubuntu:20.04 |
| RUN | RUN 명령어 | 컨테이너 내부에서 명령어 실행. 이미지 생성 과정에서 패키지 설치 등에 사용 | RUN apt-get update && apt-get install -y python3 |
| CMD | CMD ["실행파일","매개변수"] CMD 명령어 매개변수 | 컨테이너가 실행될 때 기본으로 실행되는 명령 지정 | CMD ["python3","app.py"] |
| ENTRYPOINT | ENTRYPOINT ["실행파일","매개변수"] | 컨테이너 실행 시 고정적으로 실행할 명령어 지정 | ENTRYPOINT ["python3"] |
| COPY | COPY <호스트경로> <컨테이너경로> | 호스트의 파일이나 디렉터리를 컨테이너 내부로 복사 | COPY ./src /app/src |
| ADD | ADD <파일경로 또는 URL> <컨테이너경로> | COPY와 유사하지만 URL 다운로드, 압축 해제 등 추가 기능 지원 | ADD <https://example.com/test.tar.gz> /app/ |
| WORKDIR | WORKDIR <디렉터리경로> | 이후 모든 명령어가 실행될 작업 디렉터리 설정 | WORKDIR /app |
| ENV | ENV <변수명>=<값> | 환경 변수 설정 | ENV APP_ENV=production |
| EXPOSE | EXPOSE <포트번호> | 컨테이너가 사용할 포트 지정 | EXPOSE 8080 |
| VOLUME | VOLUME ["컨테이너경로"] | 호스트와 컨테이너 간 데이터 보존을 위한 볼륨 선언 | VOLUME ["/var/lib/mysql"] |
| LABEL | LABEL <key>=<value> | 이미지에 메타데이터 추가 | LABEL maintainer="name@email.com" |
| USER | USER <사용자명> | 컨테이너 안에서 명령을 실행할 사용자 지정 | USER appuser |
| ARG | ARG <변수명>[=<기본값>] | 빌드 시점에만 유효한 변수 정의 | ARG APP_VERSION |
| HEALTHCHECK | HEALTHCHECK [옵션] CMD <명령어> | 컨테이너 상태 확인 명령 정의 | HEALTHCHECK --interval=30s CMD curl -f <http://localhost/> |
💡 COPY vs ADD
- COPY : 로컬 파일을 단순히 복사. 압축 해제 없음
- ADD : URL에서 파일 다운로드 및 압축 자동 해제 가능
→되도록 COPY 사용 권장
4. Dockerfile로 이미지 빌드 및 DockerHub 업로드
< 전체 흐름 정리 >
index.html 작성
↓
Dockerfile 작성 (FROM, COPY, EXPOSE, CMD)
↓
docker build → 이미지 생성
↓
docker login → 도커 허브 로그인
↓
docker push → 도커 허브에 업로드
1) 추가할 파일 작성
echo "Hello World" > index.html
2) vi editor를 통해 Dockerfile 작성
- vi editor : 리눅스/유닉스에서 사용하는 텍스트 편집기
vi Dockerfile
FROM nginx
COPY index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
- vi 에디터 기본 사용법
- 입력 모드 전환 : i
- 명령 모드 전환 : ESC
- 저장 후 종료 : :wq
- 저장 없이 종료 : :q!
3) 이미지 빌드
# 마지막 `.`은 Dockerfile의 위치(현재 폴더)를 의미
docker build -t [계정이름]/[이미지이름] .
# 예시
docker build -t oowaa/mynginx .
4) dockerhub 로그인
- https://login.docker.com/activate 에 접속해 코드 입력
docker login
5) dockerhub에 이미지 업로드
- 업로드한 이미지는 Docker Hub에서 확인
docker push oowaa/mynginx
'인프라' 카테고리의 다른 글
| [Docker] Docker Registry GC(가비지컬렉션)와 인증 설정하기 (0) | 2026.03.16 |
|---|---|
| [Docker] Docker Registry란? private registry 구축하기 (0) | 2026.03.16 |
| [Docker] Docker Image 다운로드 및 Container 실행, 환경변수 적용 (0) | 2026.03.14 |
| [Docker] Docker 명령어 정리 - image, container 명령어와 run 옵션 (0) | 2026.03.13 |
| [Docker] Docker란? 개념과 특징, 아키텍처와 주요 용어 정리 (0) | 2026.03.13 |
블로그의 정보
우와한개발자 님의 블로그
우와한개발자