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
는 주로 매개변수 전달에 사용됩니다.
꿀팁:
ENTRYPOINT
와CMD
를 함께 사용하여 기본 실행 파일과 매개변수를 분리할 수 있습니다.
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 |