“ 당신은 소프트웨어 품질을 추구할 수도 있고, 포인터 연산을 할 수도 있다. 그러나 두 개를 동시에 할 수는 없다. ”
❗ 이번 포스팅에서는 "DockerFile"에 대해 한번 정리해보고자 합니다.
빌드하는 관정 및 다양한 옵션과 주요 지시자에 관한 내용이므로 참고하시기 바랍니다.
DockerFile 이란?
Docker Image를 생성하기 위한 설정 파일입니다. 파일 내 작성된 구문으로 Docker Image가 만들어집니다.
DockerFile 문법
- 주요 지시자 종류
구문 | 설명 |
# | 코멘트 |
FROM | 베이스 이미지(Base Image) 지정 |
MAINTAINER | 이미지를 생성한 사람의 이름 및 정보 |
LABEL | Key-value 형식으로 작성된 메타 데이터 |
RUN | 컨테이너 빌드를 위한 실행 Commands |
COPY | 컨테이너 빌드시 호스트 파일을 복사 |
ADD | 컨테이너 빌드시 호스트의 (tar,url)을 복사 |
WORKDIR | 컨테이너 빌드시 명령이 실행될 작업 디렉토리 |
ENV | 환경 변수 |
USER | 명령 및 컨테이너 실행시 적용할 유저설정 ( 기본: root ) |
VOLUME | 컨테이너 내의 특정 디렉토리를 컨테이너 외부 경로에 마운트 |
EXPOSE | 컨테이너 동작 시 외부에서 사용할 포트 지정 |
CMD | 컨테이너 동작 시 자동으로 실행할 서비스 및 스크립트 지정 |
ENTRYPOINT | CMD와 함께 사용하면서 Command 지정 시 사용 |
- DockerFile 작성
// DockerFile
FROM node:16
RUN apk update
// COPY or ADD
COPY hello.js /
ADD hello.js /
// 실행
CMD ["node", "/hello.js"]
명령들에 대한 설명은 다음과 같습니다.
FROM node:16
FROM 명령어로 베이스 이미지를 지정합니다. 이미지가 로컬에 존재하지 않으면 도커 허브에서 다운로드합니다.
RUN apk update
RUN 명령어는 컨테이너에서 실행할 명령어를 지정합니다. 이 구문에 대한 뜻은 패키지 매니저를 업데이트합니다.
COPY hello.js / or ADD hello.js /
COPY와 ADD 명령어에 대한 차이는 이력 추정이 가능한지 아닌지에 따라 차이점이 있습니다.
COPY는 파일을 그대로 복사만 할 뿐 어떠한 행동도 하지 않습니다. ADD는 압축파일이면 압축을 해제한 상태로 파일을 복사합니다. 그래서 관리자가 파일이 어디서 생겼는지 추 할 수 없습니다. 즉 이러한 이유로 일반적으로 COPY를 선호해서 사용하는 경우가 많습니다.
위에 명령어에 대한 설명은 hello.js파일을 배치할 곳을 "/" 디렉터리로 지정합니다.
CMD ["node", "hello.js"]
컨테이너가 동작된 직후에 실행되는 커맨드를 지정합니다.
- 이미지 빌드
docker build -t imagename:latest .
❗주의 점(.) 앞에 반드시 빈칸을 넣어야 한다.
- 이미지 실행
위에 이미지 빌드로 만들어진 이미지를 통해 컨테이너를 실행해 보도록 합니다.
docker run imagename:latest
정리
위에 내용을 정리해서
컨테이너 빌드하는 실행 순서는 다음과 같습니다.
- 디렉터리를 준비하여 이미지를 생성할 파일들을 정리 및 추가
- DockerFile 파일을 작성한다.
- 컨테이너에서 실행할 애플리케이션 코드를 작성
- 이미지를 빌드
- 이미지 실행하여 동작을 확인
DockerFile 파일 내용
- 베이스 이미지 repo
- 설치할 패키지
- 애플리케이션 코드 및 ENV 설정 파일
- 컨테이너 가동 직후 실행될 명령어
이번 포스팅에서 "DockerFile"에 대한 문법과 간단한 예시를 통해 설명을 했습니다. 간략하게 설명드린 거라
이해가 안 갈수도 있지만 도커에 대한 내용을 심도 있게 단계적으로 포스팅을 이어가려고 합니다. 추후에 좀 더 복잡하고 기능성 있는 내용으로 다시 설명드리겠습니다. 감사합니다.!