- Dockerfile 이란?
도커는 기본적으로 이미지가 있어야 컨테이너를 생성하고 동작시킬 수 있습니다. dockerfile은 필요한 최소한의 패키지를 설치하고 동작하기 위한 자신만의 설정을 담은 파일이고, 이 파일로 이미지를 생성(빌드)하게 됩니다.
패키지 설치, 환경 변수 변경, 설정 파일 변경 등 다양한 작업을 하나하나 컨테이너를 만들고 설정을 적용할 필요 없이 dockerfile을 사용하여 적용할 수 있고, 유저의 실수로 인한 설정 누락 예방 등 다양한 장점이 있습니다.
위에서 빌드할 때 이미지의 이름을 web_img 로 정했으므로 web_img 라는 이미지가 생성 되었습니다. 물론 단순히 패키지 설치뿐만 아니라 컨테이너 안에서의 환경 변수나 여러가지 설정들을 할 수 있지만 이 글에서는 간단한 개념만 작성 하겠습니다.
-
Dockerfile 명령어 종류
명령은 대소문자 상관 없습니다. DB에서 가독성을 높이기 위해 관례적으로 명령들을 대문자 사용하는것과 같습니다.
추후 아래 명령어들에 대해 정리한 글을 업로드할 예정 입니다.
명령 | 설명 |
FROM | 베이스 이미지 지정 |
RUN | 명령 실행 |
CMD | 컨테이너 실행 명령 |
LABEL | 라벨 설정 |
EXPOSE | 포트 익스포트 |
ENV | 환경변수 |
ADD | 파일/디렉토리 추가 |
COPY | 파일 복사 |
ENTRYPOINT | 컨테이너 실행 명령 |
VOLUME | 볼륨 마운트 |
USER | 사용자 지정 |
WORKDIR | 작업 디렉토리 |
ARG | Dockerfile 에서의 변수 |
ONBUILD | 빌드 완료 후 생성된 이미지가 다른 dockerfile에서 FROM 으로 불러질 때 실행되는 명령 |
STOPSIGNAL | 시스템 콜 시그널 설정 |
HEALTHCHECK | 컨테이너의 헬스 체크 |
SHELL | 기본 쉘 설정 |
-
Docker build 와 Image layer
여러 패키지 설치나 설정 등을 저장한 dockerfile을 빌드할 때(이미지 파일로 변환 시킬 때)는 layer 구조를 보이는데, 이미지가 계층적으로 하나씩 쌓이면서 빌드 됩니다.
# Step1
FROM centos:7
# Step2
RUN touch /etc/yum.repos.d/nginx.repo && echo -e '[nginx]\nname=nage repo\nbaseurl=http://nginx.org/packages/centos/7/$basearch/\ngpgcheck=0\nenabled=1' > /etc/yum.repos.d/nginx.repo
# Step3
RUN yum -y install nginx
# Step4
EXPOSE 80
# Step5
CMD ["nginx", "-g", "daemon off;"]
맨 위에 Dockerfile 개념을 설명할 때에 사진에 등장했던 dockerfile 코드 이고 각각의 커맨드들이 step 으로 구분됩니다.
centos7을 사용중이신분들을 기준으로 우선 build 하기 전에 mkdir /build_test 입력하여 디렉토리를 생성해주고 vi /build_test/Dockerfile를 사용하여 위의 코드를 입력 후 저장 해주세요. 이후 cd /build_test/ 로 Dockerfile 이 있는 경로에 접근한 후 아래 사진에 있는 명령어를 입력 합니다. (위의 코드는 간단한 centos+nginx를 설치하기 위한 코드 입니다)
build 했을때 보이는 영어를 자세히 봐보면 이미지 id가 보이는데, 스탭별로 이미지가 생성되는걸 볼 수 있습니다.
- docker build -t [생성할 이미지명] .
- dockerfile 지정 시 -f옵션 및 예시 : docker build -t [생성할 이미지명] -f [dockerfile 파일명] .
dockerfile을 build 했을 때 아래와 같이 각 스탭별로 이미지가 생성되며 layer 구조를 이루게 됩니다.
여기서 이제 docker container run 명령어를 사용하면 아래 사진과 같이 가장 마지막에 container layer를 생성 합니다. (이 컨테이너 레이어는 컨테이너 삭제하면 같이 삭제 됩니다)
그럼 실제로 컨테이너를 사용할 때는 하나의 파일 시스템으로 보이는데, 이렇게 계층적으로 나눠진 이미지들이 어떻게 하나의 파일 시스템으로 보일까요?
하나로 보이는 이유는 이렇게 모든 레이어들이 준비 되었다면 유니온 파일 시스템(Union File System)을 사용하여 여러개로 나누어져 있는 파일 시스템을 하나의 파일 시스템으로 마운트하여 실제 사용할때는 하나로 보이게 되고, 여러개로 나눠져 있는것을 느낄 수 없습니다.