Programming

도커 이미지와 컨테이너(docker images, containers)란?

Jan92 2023. 11. 21. 23:43
반응형

도커 이미지와 컨테이너(docker images, containers)

docker is a container technology

최근 컨테이너 기술인 'docker'를 사용하면서 관련된 공부를 하게 되었는데요.

공부하는 과정에서 '도커 이미지와 컨테이너(docker image, docker container)'에 대한 개념을 잘 알아두어야겠다고 생각되어 정리한 내용입니다.

 

(짧게) Docker란?

도커 이미지, 컨테이너, 컴포즈 등과 같은 용어들로 인해 처음에는 뭔가 엄청나 보이고 어려워 보였지만, 결국 도커는 '컨테이너를 생성하고 관리하기 위한 도구'인데요.

아래 이미지와 컨테이너에 대한 내용을 통해 도커가 생성하는 컨테이너는 무엇이고 어떤 기능을 하는지 살펴보겠습니다.

 


Docker Image

도커 이미지와 컨테이너 개념

도커 이미지는 '컨테이너를 만드는 데 사용되는 읽기 전용(Read-only) 템플릿'입니다.

 

조금 더 자세하게 설명하면 도커 이미지는 운영 체제로 구성된 파일 시스템(예를 들면 ubuntu)부터 애플리케이션의 소스 코드 및 라이브러리, 기타 애플리케이션 실행에 필요한 도구, 설정값을 모두 포함하는 불변(Immutable) 파일인데요.

때문에 생성된 도커 이미지의 용량은 보통 수백 MB에서 수 GB까지 될 수 있습니다.

 

 

FROM node  #운영체제 이미지(베이스 이미지)

RUN npm install  #실행할 명령어(새로운 레이어에서 명령어를 실행하고 새로운 이미지를 생성)

COPY . /app  #파일 복사(build 명령 중간에 호스트의 파일 또는 폴더 이미지를 가져오는 것)

WORKDIR /app  #작업 디렉토리(작업 디렉토리로 해당 디렉토리가 없으면 새로 생성)

EXPOSE 80  #포트 노출(Dockerfile의 빌드로 생성도니 이미지에서 열어줄 포트를 의미)

CMD ["node", "server.js"]  #컨테이너 명령 실행(컨테이너를 생성 및 실행할 때 사용되는 명령어)

(Dockerfile)

 

도커 이미지는 위 예시와 같은 'Dockerfile'로부터 빌드되며, Dockerfile은 Docker 인프라 구성을 기술한 파일로 볼 수 있는데요.

Docker의 빌드 명령어는 Dockerfile의 명령문을 차례대로 수행하며 이미지를 생성해 줍니다.

(Dockerfile 없이도 도커 이미지를 빌드할 수는 있습니다.)

 

여기서 중요한 것은 도커 이미지가 '레이어(Layer)' 기반으로 되어 있다는 것인대요.

Dockerfile의 모든 명령은 각각의 레이어로 볼 수 있으며, Dockerfile이 동작하여 레이어 기반의 이미지가 만들어지는 과정을 살펴보면 아래와 같습니다.

 

docker image layer

read only인 이미지에 read, write 과정을 통해 새로운 파일이 추가되고, 새로운 파일이 추가된 이미지는 다시 read only가 되는 방식으로 이미지가 만들어집니다.

 

즉, 최종 명령 이전의 모든 명령은 이미 이미지의 일부이지만 별도의 레이어로 구성되어 있는데요.

도커는 이미지를 빌드할 때 모든 명령 결과(레이어)를 캐싱하고 이미지를 다시 빌드할 때 해당 명령에 대한 변경 사항이 없다고 판단되면 캐싱된 결과를 사용합니다.

 

때문에 최초 이미지 빌드 후 변경사항 없이 해당 이미지를 다시 빌드하게 되면 두 번째 빌드 시에는 최초 빌드 시 보다 더 빠른 속도로 빌드가 완료되는 것을 확인할 수 있습니다.

 

변경사항 없이 동일한 이미지를 빌드했을 때

 


Docker Container

도커 컨테이너는 도커 이미지를 기반으로 생성되며, 파일 시스템과 애플리케이션이 구체화되어 실행되는 상태인데요.

이때 파일 시스템과 애플리케이션을 패키징(또는 캡슐화)하여 격리된 공간에서 프로세스를 동작시키는 가상화된 런타임 환경으로 볼 수 있습니다.

(이미지가 상태를 가지지 않는 반면, 컨테이너는 '실행 중', '정지', '파기' 세 가지 상태를 가집니다.)

 

도커의 주요 기능은 컨테이너 내부에서 실행되는 컴퓨팅 환경의 표준화라고 볼 수 있는데요.

동일한 개발 환경을 갖는다는 것(= 응용 프로그램이 동일한 환경에서 작동하도록 하는 것)은 상당히 중요한 부분이 될 수 있습니다.

 

 

출처 https://phoenixnap.com/kb/docker-image-vs-container

하드웨어 수준에서 가상화가 이루어지는 VM(virtual machine)과 다르게 도커 컨테이너는 애플리케이션 계층에서 가상화가 되는데요.

하나의 머신을 활용하고 커널을 공유하며, 분리된 프로세스를 실행하기 위한 운영체제를 가상화할 수 있기 때문에 컨테이너가 가벼워져 리소스를 많이 사용하지 않을 수 있습니다.

 

 

정리하자면 '도커 컨테이너는 이미지로부터 생성되어 배포된 인스턴스(Deployed Instances)'라고 볼 수 있는데요.

(이미지는 자체로 존재할 수 있지만 컨테이너는 이미지 없이 존재할 수 없습니다.)

 

하나의 이미지를 기반으로 여러 개의 컨테이너를 만들 수 있으며, 이미지를 변경하더라도 이미 실행 중인 컨테이너에는 영향을 주지 않는다는 특징이 있습니다.

 

 

+++

추가로 현업에서는 하나가 아닌 여러 개의 컨테이너를 사용하여 시스템을 구축하는 경우가 많은데요.

이런 경우 컨테이너 간의 의존 관계가 생기기 때문에 설정 파일이나 환경 변수 등을 전달하는 것이 중요해지며 이때 사용되는 것이 'docker-compose'입니다.

docker-compose는 yaml 포맷으로 기술된 설정 파일로 여러 컨테이너의 실행을 한 번에 관리할 수 있도록 해주는 파일입니다.

 

 

 

< 참고 자료 >
https://hoon93.tistory.com/48
https://devowen.com/249
https://phoenixnap.com/kb/docker-image-vs-container

반응형