우와한 개발자

[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 로그인

docker login

 

5) dockerhub에 이미지 업로드

  • 업로드한 이미지는 Docker Hub에서 확인
docker push oowaa/mynginx

 

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기