Infra & Devops/Docker

[Docker] Dockerfile 작성, build, 이미지 레이어

겸둥이xz 2021. 9. 22. 23:35
반응형

Dockerfile 이란?

  • Docker에서는 인프라 구성을 기술한 파일을 Dockerfile이라고 한다.
  • Docker 이미지를 작성하기 위해서는 다음과 같은 내용들이 필요하다.
    • 베이스가 될 Docker 이미지
    • Docker 컨테이너 안에서 수행한 조작(명령)
    • 환경변수 등의 설정
    • Docker 컨테이너 안에서 작동시켜둘 데몬 실행
  • docker build 명령으로 Dockerfile에 기술된 구성 정보를 바탕으로 Docker 이미지를 작성한다.

Dockerfile 기본 구문

Dockerfile은 텍스트 형식의 파일로, 에디터 등을 사용하여 작성한다. 확장자는 필요 없고, 'Dockerfile' 이라는 이름의 파일에 인프라 구성 정보를 작성한다. Dockerfile 이외의 파일로 이미지를 작성할 시 이미지를 빌드할 때 파일명을 명시적으로 지정해야 함.

주요 명령

명령 설명
FROM 베이스 이미지 지정
RUN 명령 실행 (이미지 생성할 때 실행)
CMD 컨테이너 실행 명령 (생성된 컨테이너 안에서 명령을 실행)
LABEL 라벨 설정
EXPOSE 포트 익스포트
ENV 환경변수
ADD 파일/디렉토리 추가
COPY 파일 복사
ENTRYPOINT 컨테이너 실행 명령
VOLUME 볼륨 마운트
USER 사용자 지정
WORKDIR 작업 디렉토리
ARG Dockerfile 안의 변수
ONBUILD 빌드 완료 후 실행되는 명령
STOPSIGNAL 시스템 콜 시그널 설정
HEALTHCHECK 컨테이너의 헬스체크
SHELL 기본 쉘 설정

Dockerfile로부터 Docker 이미지 생성 (docker build)

docker build -t [생성할 이미지명]:[태그명] [Dockerfile의 위치]

예시

- Dockerfile 작성

vi Dockerfile

# 베이스 이미지 설정
FROM centos:latest

 

- 작성한 Dockerfile로부터 myimage이라는 이미지 작성하기

cd [Dockerfile 위치]
docker build -t myimage .

 

- build 실행 결과, 이미지 확인

  • centos와 myimage의 IMAGE ID가 똑같음
  • 각각 다른 이름이지만 실체는 모두 동일한 이미지

Dockerfile 이미지의 레이어 구조

  • Dockerfile을 빌드하여 Docker 이미지를 작성하면 Dockerfile 명령 별로 이미지를 작성한다.
  • 작성된 여러 개의 이미지는 레이어 구조로 되어 있다.

- Dockerfile 작성 & index.html 생성

$ vi Dockerfile


# STEP: 1 Ubuntu (베이스 이미지)
FROM ubuntu:latest

# STEP: 2 Nginx 설치
RUN apt-get update && apt-get intstall -y -q nginx

# STEP: 3 파일복사
COPY index.html /usr/share/nginx/html/

# STEP: 4 Nginx 시작
CMD ["nginx", "-g", "daemon off;"]

----------------------------------------------------

$ cat > index.html
Hello World Dockerfile!

 

 

- 빌드하기

docker build -t webap .

만든 이미지와 베이스 이미지 비교

- ubuntu:latest

 

- webap

Dockerfile 내용 수정 후 다시 빌드하기

 

$ vi Dockerfile


# STEP: 1 Ubuntu (베이스 이미지)
FROM ubuntu:latest

# STEP: 2 Nginx 설치
RUN apt-get update && apt-get intstall -y -q nginx

# STEP: 3 파일복사
COPY index.html /usr/share/nginx/html/

# STEP: 3.1 파일 복사 2 	✅ 추가한 내용
COPY index2.html /usr/share/nginx/html/

# STEP: 4 Nginx 시작
CMD ["nginx", "-g", "daemon off;"]

----------------------------------------------------

$ cat > index.html
Hello World Dockerfile!

$ docker build -t webap2 .  ✅ 빌드하기

 

  • Using cache : 이미지를 재이용하고 있음

 

- webap2

  • webap에서 레이어 1개가 더 늘어났음

 

docker build 시 로그를 보면 Dockerfile 명령어 한 줄마다 이미지(Layer)가 작성되는 것을 알 수 있다. (Step 1/5 ~ 5/5)

또한 중간에 컨테이너가 생성되었다가 삭제되는 것을 확인할 수 있는데, 이는 Docker에서 이미지 레이어를 생성할 때 컨테이너를 임시로 생성하고, 명령어를 실행한 뒤 해당 컨테이너를 통하여 이미지를 작성 후 컨테이너를 삭제하는 것을 알 수 있다.

 

또한, 작성한 이미지는 다른 이미지와도 공유된다. 예를 들어 공통의 베이스 이미지를 바탕으로 여러 개의 이미지를 작성한 경우, 베이스 이미지의 레이어가 공유된다. 이와 같이 이미지를 겹침으로써 Docker에서는 디스크의 용량을 효율적으로 이용한다.

 


<참고자료>

'완벽한 IT 인프라 구축을 위한 Docker 2판'

https://kimjingo.tistory.com/62

 

 

반응형