[Docker] Docker Image

이상혁·2024년 6월 25일

도커

목록 보기
3/4

Overview

이번 포스트에서는 도커에서 이미지는 빼 놓을 수 없는 개념이다.
도커의 이미지의 개념에 대해서 알아보겠다.

도커의 이미지

도커는 컨테이너를 실행하기 위해서 이미지라는 것을 사용을 한다.
이미지는 컨테이너를 실행하기 위한 읽기 전용 파일이다. 애플리케이션을 실행하기 위한 실행 환경, 소스코드, 라이브러리 등을 묶은 파일 시스템이다.
예를 들면 nginx 이미지는 nginx를 실행하기 위한 모든 라이브러리와 실행환경을 가지고 있는 것이다.

이 도커의 이미지는 불변성이라는 특징을 가지고 있다.
한 번 생성이 된 이미지는 변경을 할 수가 없다.
이 불변성은 변경이 되지 않기 때문에 동일한 환경을 제공을 한다. 즉, 어떤 환경에서도 동일한 환경을 제공하고 동일한 결과을 얻을 수 있다.

이미지 계층구조(레이어)

이미지는 레이어드 파일 시스템(Layered File System)으로 구성이 되어 있다.
이미지가 이 레이어드 파일 시스템으로 구성이 된 이유는 이 이미지를 저장하는 저장소가 있는데 이 저장소를 효율적으로 사용하기 위해서 이 파일 시스템을 선택을 하였다.

레이어는 하나의 층을 의미한다. 이 층들이 여러 개가 모여서 이미지를 구성을 한다.

위 사진 처럼 이미지를 다운을 받았을 때, 여러 단계에 걸쳐서 무엇인가가 pull을 받아지는 것을 볼 수 있다.
이 각각의 한 줄이 하나의 레이어를 의미한다.

이미지 레이어는 재사용에 효율적이다.
만약 레이어 A, B, C, D로 어떤 이미지가 구성이 되어 있다고 하자.
여기서 레이어 D가 레이어 E로 변경이 된다고 할 때, 레이어 A, B, C를 새로 만드는 것이 아니라 기존에 레이어를 재사용 하는 것이다.

그리고 만약 새로운 레이러를 추가할 때, 기존의 레이어에 변경이 되는 부분이 있다면 기존의 레이어를 변경하는 것이 아니라 새로 추가 된 레이어에 기존 레이어의 변경이 된 부분이 저장이 된다.

그림을 예시로 보면 os파일 시스템 레이어에 nginx 설치 레이어를 추가할 때 nginx를 실행하기 위해서 os 파일 시스템에 필요한 파일들을 os 파일 시스템에 추가가 되는 것이 아니라 nginx 설치 레이어에 추가가 되는 것을 볼 수 있다.

그리고 이렇게 구성된 이미지를 컨테이너로 실행을 하게 되면 이미지의 마지막 레이어 뒤에 읽기/쓰기 레이어가 생긴다. 그리고 이 레이어를 컨테이너 레이어라고 한다.
컨테이너를 실행 중에 로그나 변경된 사항이 있다면 이 레이어에 저장이 된다.
이미지의 레이어는 읽기 전용 레이어이기 때문에 변경이 불가능하기 때문이다.
그리고 같은 이미지로 새로운 컨테이너를 실행한다면 이미지를 복사해서 사용하는 것이 아니라 같은 이미지를 공유하고 읽기/쓰기 레이어, 컨테이너 레이어가 새로 추가가 되는 것이다.

정리하면 컨테이너는 각자 만에 읽기/쓰기 레어이를 가지고 있고 같은 이미지를 전체를 혹은 일부를 공유할 수도 있다.

이미지 저장하는 방법

이미지를 저장하는 방법에는 대표적으로 commit 명령어를 통한 저장과 dockerfile을 작성하고 build 명령어를 사용해서 저장하는 방법이 있다.

commit을 통한 저장

commit 명령어를 통한 저장은 실행 중인 컨테이너에서 commit 명령어를 통해서 하나의 이미지로 저장을 할 수 있다.

위 사진처럼 먼저 기본이 되는 이미지를 컨테이너로 실행을 시킨다.
그리고 그 컨테이너 안에서 파일을 수정하거나 새로운 소프트웨어를 설치를 한다.

docker commit [OPTIONS] 실행중인컨테이너이름 레포지토리명/이미지이름 

위 명령어를 실행을 해주면 지금 상태의 파일이 이미지로 저장이 된다.

dockerfile을 통한 build 명령어

IaC 방법은 코드를 통해서 인프라를 관리하는 방식이다. vdockerfile도 IaC 중 하나이다.
dockerfile에 이미지를 코드로 구성을 하고 build 명령어를 통해서 이미지로 저장을 하는 것이다.

이전에 알아본 commit방법에 경우 commit을 하기 전에 항상 컨테이너를 실행해야 하고 commit 하나 당 레이어가 하나이기 때문에 여러 번의 commit 작업을 해야하는 단점이 존재한다.
그래서 이미지를 생성을 할 때는 dockerfile을 이용한 build 방식을 많이 사용한다.

build 명령어를 사용하면 도커가 컨테이너를 생성하고 commit 하는 작업을 대신 해주는 역할을 한다.
그리고 이 도커에게 어떤한 작업을 수행할 지 코드로 작성을 하는 것이 dockerfile이다.

정리하면 우리가 dockerfile로 도커에게 수행할 작업을 알려주면 도커는 임시로 컨테이너를 생성하고 변경사항을 적용 후에 커밋을 한다. 이렇게 레이어 하나를 추가하고 이 레이어를 추가한 이미지를 임시 컨테이너로 만들어서 작업을 수행하고 다시 커밋을 해준다. 이를 도커가 알아서 반복을 해주는 것이다.

FROM nginx:1.23 

COPY index.html /usr/share/nginx/html/index.html

CMD ["nginx", "-g", "daemon off;"]

위 코드는 dockerfile로 간단하게 만든 코드이다.
간단하게 설명을 하면 FROM으로 베이스가 되는 이미지를 지정해주고 COPY로 레이어에 복사하고자 하는 파일경로, 그 파일을 복사할 경로를 적어준다.
마지막으로 CMD를 통해서 컨테이너로 실행을 했을 때 실행할 명령어를 지정해준다.

docker build -t 이미지명 Dockerfile경로

위 명령어를 통해서 dockerfile을 토대로 이미지를 빌드할 수 있다.
dockerfile이 위치한 경로를 지정해주고 위 명령어를 실행을 하면 이미지가 저장이 된다.

이미지 레지스트리

이미지 레지스티리는 이미지 저장소이다.

github는 자신의 소스 코드를 쉽게 보관을 하고 다른 개발자들과 공유할 수 있다.
이미지 레지스트리도 이 github와 아주 비슷하다.
대표적으로 dockerhub가 있다.

이 dockerhub는 이미지를 저장하는 저장소이다.
즉, 소스코드와 소스코드로 만들어진 애플리케이션에 실행환경이 모두 포함이 된 이미지들을 저장하고 공유할 수 있는 공간이다.

이 docker hub는 내가 만든 이미지를 올려서 저장을 할 수 있다.
또 다른 개발자가 만든 이미지도 pull을 받아서 내 로컬에서 컨테이너로 실행을 할 수 있다.
이렇게 도커 허브를 이용하면 서로 공유하면서 같은 환경을 맞춰서 협업이 가능하다.

참고자료

개발자를 위한 쉬운 도커
[Docker] docker commit 명령을 이용하여 이미지 빌드하기

profile
꾸준히!

0개의 댓글