Dockerfile?

  • 도커 이미지를 빌드하기 위한 명령어가 들어 있는 텍스트 파일
  • Docker는 Dockerfile에서 명령어를 읽어 이미지를 빌드
  • default 파일 이름 : (파일 확장자 없이) Dockerfile
  • 도커파일 빌드 명령어 :  $ docker build 

 

Dockerfile 지시어 

instruction description
FROM <image> 베이스 이미지 정의

* 도커파일은 FROM으로 시작
RUN <command> 명령어를 실행하여 현재 이미지 위의 새로운 레이어 생성
WORKDIR <directory> 다음의 모든 RUN, CMD, ENTRYPOINT, COPY, ADD 명령어에 대한 작업 디렉터리를 설정
COPY <src> <dest> <src>경로에 있는 새로운 파일이나 디렉토리를 컨테이너 파일 시스템의 <dest>경로에 복사하고 추가

* 빌드 컨텍스트 또는 멀티스테이지 빌드 안에서 한스테이지에서 컨테이너로 파일을 복사할 때 사용
(build context: docker build 명령어를 실행할 때의 현재 디렉토리)
ADD <src> <dest> <src>경로에 있는  새로운 파일이나 디렉토리를 컨테이너 파일 시스템경로에 복사하고 추가

* COPY와 유사
* 원격 HTTPS와 Git URL에서 파일을 가져오거나, 빌드 컨텍스트에서 파일을 추가할 때 tar파일을 자동으로 추출하는 기능 지원
CMD <command> 컨테이너가 실행될 때 실행할 명령어 설정,
ENTRYPOINT와 함께 쓰일 때는 ENTRYPOINT의 인자를 지정

* 도커파일에서 하나만 존재 (여러개면 가장 마지막 CMD만 실행됨)
* 명령어를 &&로 묶어 여러 명령어 실행 가능
ENTRYPOINT ["excutable", "param1", "param2"] 컨테이너가 실행될 때 기본적으로 실행되는 프로그램을 지정
CMD와 함께 쓰일 때, ENTRYPOINT는 컨테이너의 주 실행 파일을 고정하고 CMD는 기본 인자를 설정
LABEL <key>=<value> 이미지에 다양한 key-value 쌍으로 메타데이터 추가
ENV <key>=<value> 환경변수 key값에 value값 설정

* 컨테이너 실행 시(docker run) -e <varname>=<value> 옵션으로 변경 가능
ARG <name>[=<default value>] 빌드 시 빌더에게 전달해 사용할 변수 정의

*
 Docker 빌드 과정에서만 사용되며, 컨테이너 실행 후에는 사용할 수 없음 (ENV와 함께 사용하면 실행 시점에도 값 유지 가능)
* 컨테이너 빌드 시(docker build) --build-arg <varname>=<value> 옵션으로 값 전달, 변경 가능
EXPOSE <port> 컨테이너 내부에서 사용할 네트워크 포트 지정

* TCP, UDP 선택가능 (default: TCP)
* 실제 포트를 개방하려면 컨테이너 실행시(docker run) -p(수동포트매핑) / -P(자동포트매핑) 옵션으로 포트 개방 해야함 

 

 

Dockerfile 예시

  • Node.js 기반 웹 애플리케이션 Dockerfile (from gpt) 작성 
# 1. 베이스 이미지 설정
FROM node:18-alpine

# 2. 빌드 시 사용할 변수 정의
ARG NODE_ENV=production

# 3. 환경 변수 설정
ENV NODE_ENV=${NODE_ENV}

# 4. 컨테이너 내부 작업 디렉토리 설정
WORKDIR /app

# 5. 프로젝트 파일 복사
COPY package.json package-lock.json ./

# 6. 의존성 설치
RUN npm install --only=production

# 7. 앱 소스 코드 복사
COPY . .

# 8. 포트 설정 (기본적으로 Node.js 앱은 3000번 포트 사용)
EXPOSE 3000

# 9. 실행 명령어 설정
CMD ["node", "server.js"]
            1. node:18-alpine 이미지는 Node.js 18 버전이 설치된 Alpine Linux 기반 경량 이미지
            2. NODE_ENV=production은 기본값으로 설정
            3. ARG NODE_ENV 값을 ENV NODE_ENV로 설정하여 컨테이너 실행 시에도 환경 변수를 유지
            4. 이후 모든 RUN, COPY, CMD 등의 명령어는 /app 디렉토리에서 실행
            5. package.jsonpackage-lock.json을 컨테이너의 /app 디렉토리에 복사
            6. 컨테이너 내부에서 npm install 명령어를 실행
            7. 현재 디렉토리(.)의 모든 파일을 컨테이너의 /app 디렉토리에 복사
            8. 컨테이너가 사용할 포트를 3000번으로 지정
            9. 컨테이너가 실행될 때 node server.js 명령어를 실행하여 웹 서버를 시작

 

 

Dockerfile 실행 방법

1. 작성한 도커파일로 Docker 이미지 빌드 

$ docker build -t myapp .
  • -t : 빌드할 이미지에 태그/이름을 지정
  • . : 현재 디렉토리를 빌드 컨텍스트로 사용

 

 

2. 빌드 완료 후 생성된 이미지 확인

$ docker images

 

 

3. 해당 이미지로 컨테이너 실행 

$ docker run -d -p 8080:3000 myapp
  • -d : 컨테이너를 백그라운드에서 실행됨
  • -p : 컨테이너의 3000 포트를 호스트의 8080 포트로 연결 (http://localhost:8080 으로 접근 가능)

 

4. 컨테이너 상태 확인 

$ docker ps

 

 

 


* dockerfile overview
https://docs.docker.com/build/concepts/dockerfile/#dockerfile-syntax

* dockerfile reference
https://docs.docker.com/reference/dockerfile/

'! > docker' 카테고리의 다른 글

docker compose  (0) 2025.05.29
docker network  (0) 2025.04.15
docker volume, bind mounts  (0) 2025.04.12
Docker CLI 명령어  (0) 2024.11.14
Docker 설치 (MacOS)  (0) 2022.09.05

+ Recent posts