본문 바로가기
Docker

Dockerfile 기본 명령어 정리

by 대박플머 2024. 12. 18.

Dockerfile은 Docker 이미지를 생성하기 위해 작성하는 스크립트 파일입니다. Dockerfile의 명령어를 적절히 사용하면 효율적인 Docker 이미지를 생성할 수 있습니다. 이번 글에서는 Dockerfile의 주요 명령어와 각 명령어의 역할, 사용 예제를 설명하겠습니다.


1. FROM

FROM 명령어는 Dockerfile에서 가장 먼저 등장해야 하며, 베이스 이미지를 지정합니다. 모든 Docker 이미지는 다른 이미지를 기반으로 생성되기 때문에, FROM 명령어는 필수입니다.

문법:

FROM <이미지>:<태그>

예제:

FROM node:16-alpine

위 명령어는 Node.js 16 버전의 Alpine Linux 기반 이미지를 사용합니다.

꿀팁:

  • 경량 이미지를 사용하면 빌드 속도와 이미지 크기를 줄일 수 있습니다. 예: alpine, slim.
  • 최신 태그(latest)를 사용하는 대신 특정 버전을 지정하여 예기치 않은 동작을 방지하세요.

2. RUN

RUN 명령어는 컨테이너 안에서 명령어를 실행합니다. 주로 패키지를 설치하거나 환경을 설정할 때 사용됩니다.

문법:

RUN <명령어>

예제:

RUN apt-get update && apt-get install -y curl

위 명령어는 apt 패키지 관리자를 이용해 curl을 설치합니다.

꿀팁:

  • 여러 RUN 명령어를 하나로 합쳐서 레이어를 줄이면 이미지 크기를 최적화할 수 있습니다.
  • 예를 들어, 패키지 설치 후 캐시를 정리하세요: RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*.

3. CMD

CMD 명령어는 컨테이너가 시작될 때 실행할 기본 명령어를 정의합니다. 한 Dockerfile에는 하나의 CMD만 존재할 수 있습니다.

문법:

CMD ["실행파일", "매개변수"]

예제:

CMD ["node", "app.js"]

위 명령어는 Node.js로 app.js를 실행합니다.

주의:
CMD는 컨테이너가 실행될 때 동작하므로, RUN과 혼동하면 안 됩니다.

꿀팁:

  • docker run 명령으로 CMD를 쉽게 덮어쓸 수 있다는 점을 활용하세요. 기본값으로만 사용하려는 경우 ENTRYPOINT와 함께 사용을 고려하세요.

4. ENTRYPOINT

ENTRYPOINT 명령어는 CMD와 유사하게 컨테이너 실행 시 실행할 명령어를 정의합니다. CMD와의 차이는 ENTRYPOINT는 컨테이너의 주 실행 파일을 지정하는 데 사용된다는 점입니다.

문법:

ENTRYPOINT ["실행파일", "매개변수"]

예제:

ENTRYPOINT ["/bin/bash"]

CMD와 ENTRYPOINT의 차이점:

  • CMD는 쉽게 덮어쓸 수 있지만, ENTRYPOINT는 기본 실행 명령어로 고정됩니다.
  • CMD는 주로 매개변수 전달에 사용됩니다.

꿀팁:

  • ENTRYPOINTCMD를 함께 사용하여 기본 실행 파일과 매개변수를 분리할 수 있습니다.

5. WORKDIR

WORKDIR 명령어는 작업 디렉토리를 설정합니다. 이후 명령어들은 설정된 작업 디렉토리를 기준으로 실행됩니다.

문법:

WORKDIR <경로>

예제:

WORKDIR /usr/src/app

위 명령어는 /usr/src/app 디렉토리를 작업 디렉토리로 설정합니다.

꿀팁:

  • 디렉토리를 미리 생성할 필요 없이 WORKDIR가 자동으로 디렉토리를 만듭니다.
  • 작업 디렉토리를 분리하여 애플리케이션 구조를 명확히 하세요.

6. COPY

COPY 명령어는 호스트 시스템에서 컨테이너로 파일이나 디렉토리를 복사합니다.

문법:

COPY <소스> <목적지>

예제:

COPY package.json /usr/src/app/

위 명령어는 로컬의 package.json 파일을 컨테이너의 /usr/src/app/ 디렉토리로 복사합니다.

꿀팁:

  • 변경 가능성이 높은 파일(package.json)을 먼저 복사하여 Docker 빌드 캐시를 효율적으로 활용하세요.
  • 복사하려는 파일이 많으면 .dockerignore를 사용하여 불필요한 파일을 제외하세요.

7. ADD

ADD 명령어는 COPY와 유사하지만, URL에서 파일을 다운로드하거나 압축 파일을 자동으로 풀 수 있는 추가 기능이 있습니다.

문법:

ADD <소스> <목적지>

예제:

ADD https://example.com/app.tar.gz /app/

위 명령어는 app.tar.gz를 다운로드한 후 /app/ 디렉토리에 압축을 풉니다.

꿀팁:

  • 가능하면 ADD 대신 COPY를 사용하세요. ADD는 의도치 않은 동작을 유발할 수 있습니다.
  • URL 다운로드 대신 curl이나 wget을 사용하는 것이 더 명확할 수 있습니다.

8. ENV

ENV 명령어는 환경 변수를 설정합니다. 컨테이너 실행 시 설정된 환경 변수를 사용할 수 있습니다.

문법:

ENV <키> <값>

예제:

ENV NODE_ENV production

위 명령어는 NODE_ENV 환경 변수를 production으로 설정합니다.

꿀팁:

  • 다중 변수를 설정할 때는 \를 사용하여 가독성을 높이세요.
    ENV NODE_ENV=production \
      APP_PORT=3000

9. EXPOSE

EXPOSE 명령어는 컨테이너가 사용할 포트를 지정합니다. 이 명령어는 네트워크와 관련된 설정을 나타냅니다.

문법:

EXPOSE <포트>

예제:

EXPOSE 3000

위 명령어는 컨테이너의 3000번 포트를 외부에 노출합니다.

꿀팁:

  • EXPOSE는 문서화 목적으로 사용됩니다. 실제 네트워크 노출은 docker run 명령의 -p 옵션으로 제어하세요.

10. VOLUME

VOLUME 명령어는 컨테이너와 호스트 간의 데이터 공유를 설정합니다.

문법:

VOLUME ["<경로>"]

예제:

VOLUME ["/data"]

위 명령어는 컨테이너의 /data 디렉토리를 호스트와 공유합니다.

꿀팁:

  • 데이터가 유지되어야 하는 경우 VOLUME을 사용하세요. 예: 데이터베이스 파일.
  • 호스트 경로와 연결하려면 docker run-v 옵션을 사용하세요.

11. LABEL

LABEL 명령어는 메타데이터를 추가합니다. 주로 이미지에 대한 설명이나 버전 정보를 기록할 때 사용됩니다.

문법:

LABEL <키>=<값>

예제:

LABEL maintainer="example@example.com"

위 명령어는 이미지에 메타데이터로 관리자의 이메일을 추가합니다.

꿀팁:

  • 여러 LABEL을 추가할 때는 가독성을 위해 여러 줄로 작성하세요.
    LABEL version="1.0" \
        description="This is a sample image"

12. USER

USER 명령어는 명령어 실행에 사용할 사용자 계정을 설정합니다.

문법:

USER <사용자>

예제:

USER node

위 명령어는 이후 명령어를 node 사용자로 실행합니다.

꿀팁:

  • 루트 사용자 대신 일반 사용자를 설정하여 보안을 강화하세요.
  • 사용자 계정이 필요하다면 RUN adduser를 통해 추가할 수 있습니다.

예제 Dockerfile

다음은 위 명령어들을 활용한 예제 Dockerfile입니다:

# 베이스 이미지 설정
FROM node:16-alpine

# 작업 디렉토리 설정
WORKDIR /usr/src/app

# 종속성 설치
COPY package*.json ./
RUN npm install

# 애플리케이션 코드 복사
COPY . .

# 환경 변수 설정
ENV NODE_ENV=production

# 포트 노출
EXPOSE 3000

# 기본 실행 명령어
CMD ["node", "server.js"]

결론

Dockerfile의 명령어를 잘 이해하면 효율적이고 최적화된 Docker 이미지를 생성할 수 있습니다. 위에서 소개한 명령어들을 숙지하고 필요에 맞게 조합하여 Dockerfile을 작성해보세요.

'Docker' 카테고리의 다른 글

Docker의 원리와 동작 방식  (2) 2024.11.04
Docker 데몬(Docker Daemon)에 대해  (0) 2024.10.21
Docker 컨테이너 명령어 정리  (0) 2024.10.07