[Docker] 도커(docker)란? - image와 container에 대해
근래 실무에서 접하고, 개인 프로젝트를 진행하면서 도커라는 기술의 편리함과 효율성을 체감하게 되었다. 특히, 로컬 환경에서 개발환경을 구축할 때, 도커를 사용하면 시간만 잡아먹을 중간 과정을 모두 생략하고 진행할 수 있다는 점에서 큰 매리트를 느꼈다.
이번 카테고리 포스트에서 지금까지 도커에 대해 공부했던 내용과 실제 사용 방법을 차근차근 정리해 올리려고 한다.
1. 도커(docker)란?
공식문서를 보면, 도커(docker)란 소프트웨어 패키지를 컨테이너(container)라는 유닛(unit)으로 생성하고 관리하는 기술이라고 소개한다. 이에 대한 내용을 풀어보면 다음과 같이 정리할 수 있다.
- 소프트웨어(= 애플리케이션)를 컨테이너(container)라는 단위로 패키지화시킨다는 것.
- 컨테이너가 생성될 때, 소프트웨어가 동작하는 코드, 의존성 패키지, 실행 변수, 시스템 변수 등이 함께 저장된다는 것.
- 생성된 컨테이너는 어느 곳에서 실행하더라도 동일하게 동작된다는 것.
도커를 사용한다는 건 특정 PS, OS, 런타임 환경에 구애받지 않고, 동일한 소프트웨어 실행 환경을 구축할 수 있다는 것과 같다. 아래 이미지는 로컬 환경에서 도커가 실행된 구조 예시다. 총 3개의 컨테이너를 내 로컬 PC에서 실행할 때, 다음과 같은 구조가 될 것이다.
2. 이미지(image)와 컨테이너(container)
도커의 핵심은 이미지(image)와 컨테이너(container)가 전부라해도 과장이 아니라고 생각한다. 앞서, 컨테이너에 대해서만 언급했지만 이미지(image)에 대한 이해는 도커를 사용하는데 꼭 필요하다.
이미지(image)는 도커 컨테이너의 '템플릿' 혹은 '틀'과 같은 개념이다. 도커를 사용한다는 건, 사용하고자 하는 소프트웨어 실행 환경을 이미지라는 형태로 저장(build)하고, 컨테이너라는 형태로 실행(run)하는 것과 같다.
이미지는 스냅샷을 찍듯 특정 소프트웨어 소스코드, 의존성 패키지, 실행 환경 등에 대한 모든 정보를 템플릿화 시킨 것이다. 그리고, 컨테이너는 이런 이미지를 PC에서 그대로 실행하는 개념이다. Java에 빗대어 표현하면, 이미지는 class 파일, 컨테이너는 그 class로 생성된 인스턴스라고 할 수 있다.
이미지(image)
- 컨테이너의 템플릿, 설계도 혹은 틀
- 소프트웨어(혹은 애플리케이션)의 실행 정보를 담고 있음 ( OS, Runtime, 의존성 패키지, 환경 변수 ... )
- 이미지에 담긴 데이터는 컨테이너 형태로 실행됨
- Java로 비유하면, class 파일
컨테이너(container)
- 도커 이미지의 인스턴스
- 표준화된 소프트웨어의 실행
- 이미지가 담고 있는 실행 정보를 읽어, 호출되는 곳에서 소프트웨어를 실제로 구동
- Java로 비유하면, class 파일의 인스턴스
3. 정리
짧게 도커에 대한 주요 개념 두가지(이미지와 컨테이너)를 알아보았다. 조금 더 깊게 도커를 이해하려면, 도커 실행의 베이스가 되는 도커 엔진(Docker Engine)에 대한 내용과 이미지 빌드의 레이어 베이스 구조(Layer-based Architecture) 개념을 참고하면 좋다.
이후 포스트에서 도커 허브(Docker Hub)와 NodeJS 환경에서 도커를 실행하는 예제를 업로드할 예정이다.