[Docker] Dockerfile 탐구하기

Bulgogi-Pizza·2025년 1월 6일

웹 서버 구축

목록 보기
13/16

Docker를 설치하고 Docker-compose까지 사용해 여러 컨테이너를 관리할 준비가 끝났다. docker-compose 파일도 잘 작성했다.
다만, docker-compose.yml 파일 작성 전에 dockerfile이 구버전으로 작성되어 있어 달라진 디렉토리로 수정하고 이미지도 수정하여야 한다. Dockerfile을 작성할 김에 탐구하면서 천천히 진행해보려 한다.

Dockerfile?

Dockerfile은 Docker 이미지를 생성하기 위한 설명서 역할을 한다. 개발자가 애플리케이션을 컨테이너로 배포할 수 있도록 필요한 명령어와 설정을 선언적으로 작성하는 파일이다.

Dockerfile을 사용하면 애플리케이션 실행 환경을 정확히 정의할 수 있어, 어디서나 동일하게 실행 가능한 컨테이너를 만들 수 있다.

Dockerfile의 구조

Dockerfile은 명령어와 인수로 이루어진다.

아래는 자주 쓰는 명령어들에 대한 설명이다.

FROM

  • FROM <base_image>
  • 이미지를 생성할 때 사용할 기본 이미지(base image)를 지정한다.

WORKDIR

  • WORKDIR <directory>
  • 컨테이너 내에서 작업 디렉토리를 설정, 이후 명령은 이 디렉토리에서 실행된다.

COPY

  • COPY <src> <dest>
  • 호스트 시스템(로컬)에서 컨테이너로 파일/디렉토리를 복사한다.

RUN

  • RUN <command>
  • 컨테이너에서 명령어를 실행한다. 주로 소프트웨어 설치나 파일 설정에 사용한다.
  • RUN apt-get update && apt-get install -y curl
  • RUN npm install

CMD

  • CMD ["executable", "param1", "param2"]
  • 컨테이너가 실행될 때 실행할 기본 명령어를 지정한다.
  • CMD ["node", "app.js"]

ENTRYPOINT

  • ENTRYPPOINT ["executable", "param1", "param2"]
  • CMD와 유사하지만, 고정된 명령어를 설정할 때 사용한다. CMD보다 우선순위가 높다.
    • ENTRYPOINT ["java", "-jar", "/app.app.jar"]

EXPOSE

  • EXPOSE <port>
  • 컨테이너에서 외부로 노출할 네트워크 포트를 지정한다.

ENV

  • ENV <key>=<value>
  • 컨테이너 내 환경 변수를 설정한다.

VOLUME

  • VOLUME ["<path>"]
  • 컨테이너와 호스트 간에 데이터를 공유할 볼륨을 지정한다.

LABEL

  • LABEL <key>=<value>
  • 이미지에 메타데이터를 추가한다. (버전, 설명 등)

ARG

  • ARG <name>[=<default>]
  • 빌드 시 전달할 변수를 설정한다. docker build 명령에서 사용한다.

USER

  • USER <username>
  • 명령어 실행에 사용할 사용자 계정을 지정한다. 보안 목적에서 사용한다.

Dockerfile 예제

다음은 Dockerfile 예제를 ChatGPT에게 부탁하여 몇개 생성해보았다.

Node.js 애플리케이션

FROM node:18-alpine
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

Java(Spring Boot) 애플리케이션

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/app.jar /app/app.jar
EXPOSE 8080
CMD ["java", "-jar", "/app/app.jar"]

React 애플리케이션

FROM node:18-alpine as builder
WORKDIR /usr/src/app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /usr/src/app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Dockerfile 사용 방법

1. Docker 이미지 빌드

docker build -t <image_name>:<tag> .

2. Docker 컨테이너 실행

docker run <image_name>:<tag>

3. 이미지 확인

docker images
profile
궁금증은 못참는 편, 궁금한 개발자

0개의 댓글