본문 바로가기
공부/개발자를 위한 쉬운 Docker

[Docker] 도커 이미지

by 도리언 옐로우 2024. 11. 17.

1. 이미지와 컨테이너

(1) 이미지의 개념

소프트웨어를 실행하려면 해당 소프트웨어 외에도 하드웨어의 자원을 사용할 수 있도록 필수기능을 제공해주는 OS, 의존성 패키지 및 라이브러리 등 다양한 요소가 필요하다. 이러한 요소들을 하나의 파일 형태로 묶어 배포할 수 있도록 제공하는 것이 도커 이미지(Docker Image)이다.

 

도커 이미지는 애플리케이션과 이를 실행하는 데 필요한 모든 환경을 포함한 읽기전용 파일시스템의 스냅샷이다. 쉽게 말해 이미지는 소프트웨어와 그 실행 환경을 미리 준비해 압축한 파일로 이해할 수 있다. 이렇게 구성된 도커 이미지는 호스트 운영체제의 커널을 공유하여 경량화된 환경에서 실행된다.

(2) 이미지와 컨테이너의 관계

https://cto.ai/blog/docker-image-vs-container-vs-dockerfile/

도커에서 이미지는 프로그램이 실행되기 위한 환경이 모두 포함되어 있는 파일시스템이고, 이 이미지를 실행한 것이 컨테이너이다.

 

이미지와 컨테이너의 관계는 프로그램과 프로세스의 관계와 비슷하게 이해할 수 있다. 프로그램은 디스크에 저장되어 실행 가능한 상태의 파일이고, 이 프로그램을 실행하면 실행중인 상태인 프로세스가 생성된다. 한 개의 프로그램으로 여러 개의 프로세스를 실행할 수 있으며, 이때 각각의 프로세스는 OS에서 CPU와 메모리를 할당받아서 사용한다.

 

마찬가지로 도커 이미지는 여러개의 컨테이너를 생성할 수 있는 기반이 된다. 이때 각 컨테이너는 이미지에서 정의된 환경을 바탕으로 실행되며 필요한 리소스를 OS에서 할당받게 된다. 다만 컨테이너는 가상화 기술이기 때문에, 이미지를 컨테이너로 실행할 때는 격리된 공간이 만들어진다는 차이가 있다. 이 격리된 공간에서 이미지에 사전에 지정해 놓은 프로그램이 프로세스로 실행되는 것이다.

 

실습 명령어 정리

  • docker image ls (이미지명): 이미지 리스트를 조회, 이미지명을 붙이면 해당 이미지 조회
  • docker run -d --name [컨테이너명] [이미지명] : -d는 백그라운드 실행, 컨테이너 이름 지정하여 이미지 실행
  • docker ps (-a) : 실행중인 컨테이너 리스트 조회, -a 옵션은 all의 약자로 중지된 컨테이너를 포함하여 조회
  • docker rm -f [컨테이너명] : 컨테이너 삭제로, -f 옵션을 붙여야 실행중인 컨테이너 삭제가능

(3) 컨테이너의 라이프사이클

쉬운 도커 강의자료

컨테이너의 라이프사이클은 컨테이너가 생성되어 실행되고 종료되는 과정을 설명한다. 컨테이너 라이프사이클의 여러 단계에 대해 살펴보자.

 

docker create [이미지명] 명령으로 새로운 컨테이너를 생성할 수 있다. 이미지 생성단계는 컨테이너를 실행하기 위한 격리된 공간이 만들어지는 단계로, 리소스가 격리된 공간인 컨테이너로 분리된 상태이다. 생성 단계에서는 프로세스를 실제로 실행하지 않기 때문에 호스트OS의 리소스를 사용하지는 않는다.

 

생성단계에서 docker start [컨테이너명] 명령을 입력하면 컨테이너 메타데이터의 cmd값을 사용해서 컨테이너를 실행상태로 만들 수 있다. 여기서 실행상태를 위해 docker create, docker start 명령을 입력해야 했는데, 이 두 과정을 하나로 합친 것이 docker run [이미지명] 명령으로 이해할 수 있다. 실행상태는 컨테이너 내에서 프로세스가 실제로 실행중임을 의미한다. 이 실행상태에서 docker restart [컨테이너명] 명령을 통해 프로세스를 재시작할 수 있는데, 명령으로부터 10초 뒤에 프로세스가 재시작하게 된다.

 

docker pause [컨테이너명] 명령으로 실행중인 컨테이너를 일시중지 상태로 전환할 수 있다. 이 명령은 컨테이너 내의 모든 프로세스를 중지시키는데, 일시중지된 컨테이너는 CPU를 사용하지 않지만 메모리는 여전히 할당된 상태로 남아있게 된다. 여기서 docker unpause [컨테이너명] 명령으로 프로세스를 일시중지시점에서 재시작할 수 있다.

 

docker stop [컨테이너명] 명령으로 컨테이너에서 실행중인 프로세스를 완전히 중단시킨 종료상태로 전환할 수 있다. 이 상태에서는 메모리와 CPU 사용이 모두 중단되고, 종료된 컨테이너에서 docker start [컨테이너명] 명령을 통해 다시시작하면 컨테이너의 프로세스가 처음부터 다시 실행된다.

 

실습 명령어 정리

  • docker logs (-f) [컨테이너명] : 실행중인 컨테이너의 로그를 조회. -f옵션은 로그 출력을 실시간으로 스트리밍함
  • docker start (-i) [컨테이너명] : 컨테이너를 실행상태로 전환. -i옵션은 컨테이너 시작시 표준 입력을 활성화시켜 터미널에서 입력을 받을 수 있게 함.

2. 도커 이미지 구조

(1) 기본 구성

도커 이미지는 실제로 압축된 파일과 이 파일의 정보가 저장된 메타데이터로 구성된다. 여기서 메타데이터는 이미지의 동작 방식을 정의하고 컨테이너 실행시 설정값을 제어할 수 있게 한다. 도커 이미지의 메타데이터는 여러 필드로 구성되는데, 이하에서 중요한 두 필드 Env와 Cmd를 살펴보자.

nginx 이미지의 메타데이터 일부

Env 필드는 애플리케이션 실행 시 참조할 설정값을 정의한다. 컨테이너 실행 시 -e 또는 --env 옵션을 통해 환경 변수 값을 덮어쓸 수 있는데, 이를 통해 환경변수값을 실행 시 동적으로 변경할 수 있어 동일한 이미지를 다양한 환경에서 재사용 가능하게 한다. Cmd 필드는 컨테이너 실행 시 기본적으로 실행될 명령어를 정의하는 필드이다. 위 사진에서 알 수 있듯이 배열로 저장되어 있는데, 띄어쓰기 인식이 되지 않아 Cmd 필드는 띄어쓰기를 기준으로 배열로 저장되어 있는 것이다. 마찬가지로 docker run [이미지명] 이후에 실행명령을 넣어주면 해당 명령으로 덮어쓸 수 있다. 이처럼 메타데이터는 컨테이너 실행시 새로운 값으로 덮어 쓸 수 있는데, 이는 일반적인 방법은 아니고 주로 이미지를 디버깅할 때 사용하게 된다고 한다.

 

실습 명령어 정리

  • docker image inspect [이미지명] : 이미지의 세부 정보 조회
  • docker container inspect [컨테이너명] : 컨테이너의 세부 정보 조회
  • docker run [이미지명] [실행명령] : 컨테이너 실행시 메타데이터의 cmd 덮어쓰기
  • docker run --env [KEY]=[VALUE] [이미지명] :  컨테이너 실행시 메타데이터의 env 필드 덮어쓰기

(2) 레이어 구조

도커 이미지는 레이어드 파일 시스템으로 구성되어 있는데, 이는 저장소를 효율적으로 사용하기 위한 것으로 도커의 핵심적인 특징 중 하나이다. 

하나의 이미지를 다운받으면 pull이 여러 과정에 걸쳐 이루어 짐을 확인할 수 있다

도커는 레이어 구조를 통해 다음과 같은 이점을 제공한다.

  • 공간 효율성 : 동일한 레이어를 여러 이미지나 컨테이너에서 공유할 수 있음
  • 네트워크 효율성 : 이미 존재하는 레이어는 다시 다운로드할 필요가 없음
  • 빠른 실행 : 이미 빌드된 레이어를 재사용하여 컨테이너 실행속도를 크게 향상
  • 이미지의 일관성 유지 : 각 레이어는 immutable하므로 이미지의 안정성과 일관성을 보장함

이미지의 레이어는 순차적으로 쌓이고, 각각의 레이어는 이전 레이어에서 변경된 부분을 저장하고 있다. 도커 이미지의 레이어는 수정이 불가능한 읽기 전용 레이어로, 컨테이너 실행을 위한 세이브포인트 역할을 한다. 여기서 컨테이너를 실행하면 가장 마지막 레이어 위에서 새로운 읽기 및 쓰기 전용 레이어가 추가되는데, 이를 컨테이너 레이어라고 한다. 모든 컨테이너는 자기만의 컨테이너 레이어를 갖는데, 컨테이너 레이어는 애플리케이션 실행 중 발생하는 로그, 변경사항들을 저장하는 역할을 한다.

 

도커 레이어의 주요한 특성은 다음과 같다.

  • CoW 전략 : 다음 레이어에서 이전 레이어의 특정 파일 수정시 해당 파일의 복사본을 만들어 변경사항 적용
  • Immutable Layers : 이미지의 각 레이어는 한번 생성되면 변경할 수 없음
  • Caching : 도커는 이미 빌드된 레이어를 캐싱하여 이미지 빌드 속도를 최적화 함

실습 명령어 정리

  • docker image history [이미지명] : 이미지의 레이어 이력 조회

3. 이미지 레지스트리

(1) 이미지 레지스트리 개념

이미지 레지스트리(Image Registry)는 이미지를 저장하고 관리하는 저장소이다. 도커 이미지는 실행 호스트에 로컬 저장되거나, 레지스트리에 업로드 되어 네트워크를 통해 공유 및 배포된다. 이하에서 로컬 스토리지와 이미지 레지스트리에 대해 살펴보자.

 

로컬 스토리지는 도커를 실행하는 호스트 OS의 특정 폴더를 의미하는데, 해당 폴더에 도커 이미지를 저장하게 된다. 도커는 이미지가 로컬 스토리지에 있는 경우 바로 실행하고, 로컬 스토리지에 이미지가 없다면 외부의 온라인 레지스트리에서 이미지를 로컬 스토리지로 다운로드 받는다.

 

이미지 레지스트리는 모든 네트워크에서 접근 가능한 퍼블릭 레지스트리와 특정한 네트워크에서만 접근 가능한 프라이빗 레지스트리로 구별된다. 대표적인 퍼블릭 이미지 레지스트리가 바로 Docker Hub이다. 참고로 로컬 스토리지를 프라이빗 레지스트리로 동작하도록 설정하여 프라이빗 레지스트리 활용할 수 있다고 한다.

 

(2) 이미지의 네이밍규칙

도커 이미지 이름은 다음과 같은 형식으로 구성된다.

 

레지스트리주소 / 프로젝트명 / 이미지명:이미지태그

 

  • 레지스트리주소 :이미지를 저장한 레지스트리의 주소로, 비어있으면 기본값을 사용하게 된다. 도커의 경우 기본값은 Docker Hub의 주소인 docker.io로 설정된다.
  • 프로젝트명 : 이미지를 보관하는 폴더같은 개념으로, Docker Hub의 경우 가입한 사용자의 계정명과 동일하다. Docker Hub의 오피셜 이미지로 제공되는데 이는 library라는 기본 프로젝트에서 관리하게 된다. 프로젝트 명이 비어있면 기본값 library로 설정되어 오피셜 이미지를 사용하게 된다.
  • 이미지명 : 이미지의 이름을 나타낸다.
  • 이미지태그 : 다운받을 버전으로 비어있으면 최신버전 의미하는 latest가 기본값으로 적용된다.

실습 명령어 정리

  • docker pull [이미지명] : 로컬 스토리지로 이미지 다운로드.
  • docker tag [기존이미지명] [추가할이미지명] : 로컬 스토리지의 기존 이미지에 새 이름을 추가함.
  • docker push [이미지명] : 이미지 레지스트리에 이미지 업로드. 푸시할때는 업로드할 계정의 인증정보가 필요함.
  • docker login : 이미지 레지스트리 인증정보 생성하여 ./docker/config.json에 저장.
  • docker logout : 이미지 레지스트리(Docker Hub) 인증정보 삭제. 
  • docker image rm [이미지명] : 로컬 스토리지의 이미지 삭제

'공부 > 개발자를 위한 쉬운 Docker' 카테고리의 다른 글

[Docker] 도커 컴포즈  (0) 2024.11.22
[Docker] 도커 볼륨  (0) 2024.11.20
[Docker] 도커 네트워크  (0) 2024.11.19
[Docker] 이미지 빌드  (0) 2024.11.17
[Docker] 가상화 기술과 도커  (0) 2024.11.11