나만의 도커 파일 그리고 이미지 만들기

서재환·2022년 3월 11일
0

Docker

목록 보기
3/12

도커 파일은 뭘까요?

도커파일도 파일입니다.

그렇다면 해당 파일은 무슨 내용을 담고 있을까요?

도커 파일은 도커 이미지를 만들기 위한 일종의 설계도입니다. 이미지는 그럼 무엇일까요?

도커 이미지는 뭘까요?

이미지는 개발자가 프로그램을 개발할 때 필요한 환경을 구축해야 하는데 이를 구성하기 위해 필요한 라이브러리 
및 패키지를 모아 하나의 파일로 만든 것입니다.

도커 이미지의 출처와 컨테이너화를 통한 환경설정 작업

도커 이미지는 대개 도커 공식 허브에서 가지고 오게 됩니다. 대개 개발을 시작하게 되면 개발자는 자신이
필요로 하는 이미지를 택해서 해당 이미지를 가지고 개발하고자 하는 환경을 구성하기 위해 이미지를 컨테
이너화 시킨 후 컨테이너 안에 필요한 패키지들을 설치하는 작업을 겪게 됩니다.

그렇다면 매번 컨테이너를 띄우기 위해 우리는 받은 이미지를 컨테이너화 해서 컨테이너 속에서 환경설정을
해주어야 할까요? 그렇다면 개발자는 같은 환경을 구축하기 위해 매우 번거럽고 복잡한 과정을 계속해서 거
쳐야 됩니다.

이런 번거로운 환경설정을 편하게 해주기 위해 나온 것이 도커파일입니다. 도커파일은 도커 이미지를 만들
기 위한 설계도라고 했지요?

도커 파일 안을 한번 살펴 보러 가시지요.

도커파일 내부

도커 공식 사이트에서 가지고 온 예제입니다. 위 예제는 잠시 냅두고 아래 예제를 통해 도커파일을 
살펴볼까요?

도커 이미지는 레이어가 겹겹이 쌓인 페스츄리와 같습니다. 각 레이어는 하나의 명령어를 나타냅니다. 
레이어에 대한 개념을 파일시스템의 변경이 있을 때 즉 전 이미지와 달라진 부분으로 보기도 합니다.

여기서 주의해서 이해해야 할 점은 이전 레이어에 대한 변경 부분에 순서를 반영한다는 것입니다.


예를 들어 도커파일1과 도커파일2가 있다고 했을 때 결과적으로 도커파일1과 도커파일2를 실행시켰을 때
같은 결과 값을 도출 하지만 한줄 한줄 명령어를 실행시킬 때마다 새로운 이미지를 생성시키기 때문에 순
서에 영향을 받는다고 간주할 수 있습니다.

레이어 개념 심층 학습

도커파일 살펴보기

다시 도커파일 예제를 살펴보겠습니다. 이번 글에서는 여기서 몇개의 레이어가 생성되었는지에 초점을 맞추어
진행하겠습니다. 

> 여기선 총 4개의 레이어가 추가되었습니다. 
> 제외된 항목은 2번째 줄과 마지막번 째 줄입니다.

추가된 레이어
첫번째 줄: ubuntu 18.04버전의 이미지를 가지고 옴 -> 첫번째 레이어 생성
세번째 줄: app 디렉토리 복사 -> 두번째 레이어 생성
네번째 줄: 앱을 실행한 결과 내용 레이어에 기록 -> 세번째 레이어 생성
다섯째 줄: 캐시 디렉토리 삭제 -> 네번째 레이어 생성

비 레이어 부문
두번째 줄: 이미지의 메타 데이터 부분 수정 -> 레이어 생성 NO
마지막 줄: 컨테이너 띄웠을 시 실행 할 명령어를 적어놓은 부분 -> 이미지의 메타 데이터 부분만 수정(위와 동일) 

즉 ubuntu 이미지 위에 4개의 레이어가 쌓인 후 이것에 컨테이너화 되면 컨테이너를 띄우는데 사용된 이미지는
Read Only로 freeze 되고 컨테이너 안에서 벌어지는 모든 것들은 Container layer에 모두 기록된다.

CMD python app/app.py 와 같은 부분이 되겠다. (CMD 명령어는 이미지가 컨테이너화 된 이후에 실행되는 명
령어이기 때문에 그렇습니다)

RUN CMD ENTRYPOINT 간의 비교

Dockerfile을 들여다 보면 RUN CMD ENTRYPOINT 라는 명령어 부문이 있다.

RUN 명령어는 이미지 파일을 실행시키는 명령어이다.
CMD 명령어는 다운받은 이미지를 컨테이너화 시킨 이후에 실행되는 명령어이다.
ENTRYPOINT 명령어는 컨테이너화 시 무조건 실행되는 명령어이다.
WORDIR 이미지 내에서 실행 할 명령어를 실행 할 경로 설정

* RUN 명령어에 인자를 주면 CMD 명령어가 수행되지 않는다.
* 여러개의 CMD 명령어를 적는다 하더라도 마지막 CMD 명령어만 실행된다.
* ENTRYPOINT 명령어는 CMD 와는 다르게 RUN 명령어에 argument가 있어도 도커 컨테이너 실행 시 무시되
  지 않는다.

CoW(Copy-on-write) strategy

위 전략의 핵심은 읽기 또는 무엇을 변경하는 작업을 구분함으로써 쌓이는 레이어의 크기를 줄이는 데에 있다.

예를 들어 이미지 안 레이어 안에 접근해야 할 파일 또는 디렉토리가 있을 때 읽는 것이 목적 일 때에는 다
른 레이어로 기존에 있는 파일과 디렉토리를 사용할 수 있게 하면 된다. 

그런데 만약 다른 레이어의 내용이 기존의 이미지에 변경사항을 가져다주는 레이어일 경우 변경사항에 해당하는
부분이 해당 레이어로 복사되어져 작업이 이루어진다.

참고링크

Images and layers --도커공식문서--

0개의 댓글