1. 도커(Docker)란?
도커
개발자가 애플리케이션을 컨테이너로 패키징하여 다양한 환경에서 일관되게 실행할 수 있게하는 플랫폼이다. 컨테이너는 애플리케이션과 그에 필요한 모든 종속성을 포함하므로, 개발 환경에서 프로덕션 환경까지 동일하게 작동한다. 이는 "내 머신에서는 작동하는데..."라는 흔한 개발 문제를 해결하는데 큰 도움이 된다.
도커와 컨테이너

도커(Docker)의 컨테이너 개념은 항구의 물류 혁신에서 유래한 비유로, 말콤 맥린의 컨테이너 운송 혁명에서 영감을 얻었다. 아래는 도커와 컨테이너를 간단히 정리한 내용이다.

- 항구와 트럭의 비효율성
- 과거 항구에서는 트럭이 짐을 개별적으로 싣고 와 노동자들이 일일이 짐을 꺼내 배에 실었다.
- 이 과정은 시간이 오래 걸리고, 트럭 대기와 노동력 낭비로 비효율적이었다.
- 컨테이너 혁명
- 말콤 맥린은 짐을 컨테이너 박스에 통째로 담아 기계로 빠르게 옮기는 방식을 도입.
- 컨테이너는 짐을 꺼내지 않고 통째로 배나 트럭에 실어 이동, 시간과 노동력을 크게 절감.
- 다른 항구에서도 컨테이너를 그대로 트럭에 옮겨 빠르게 처리.
- 도커의 컨테이너
- 도커에서 컨테이너는 OS와 프로그램(JDK, Git, Python 등)을 포함한 실행 환경을 표준화된 단위로 묶은 것.
- 배(OS) 위에 컨테이너를 올려, 특정 컴퓨터 환경에 구애받지 않고 동일한 실행 환경을 빠르게 배포/이동.
- 컨테이너는 독립적이지만, 도커 컴포즈를 통해 여러 컨테이너가 상호작용하며 복잡한 애플리케이션을 구성.
왜 배로 비유했을까?
- 배는 운영체제(OS)처럼 컨테이너를 싣고 실행하는 기반
- 컨테이너라는 이름은 짐(프로그램)을 통째로 묶어 이동시키는 물류 컨테이너에서 유래됨.
도커 vs 도커 컴포즈 vs 도커 허브

- 도커 (Docker)
- 비유: 악단 (드럼, 기타, 베이스, 피아노 등)
- 설명:
- 도커는 컨테이너를 만드는 도구로, 컨테이너는 악단과 같다.
- 악기(프로그램): JDK, Python, Git 등 소프트웨어와 설정을 포함.
- 음악 재생(실행): 컨테이너는 독립적인 환경에서 프로그램을 실행.
- 악단: 컨테이너
- 도커 컴포즈 (Docker Compose)
- 비유: 악단과 조명
- 설명:
- 도커 컴포즈는 여러 컨테이너를 조화롭게 관리하는 도구로, 조명(컴포넌트)와 악단(컴포넌트)를 함께 사용하여 무대를 구성하는 것과 같다.
- 최소 2개 이상의 컨테이너를 결합해 복잡한 애플리케이션을 구성.
- 예) 웹 서버 컨테이너와 데이터베이스 컨테이너를 함께 실행하고 상호작용하도록 설정.
- 도커 허브 (Docker Hub)
- 비유: 깃허브 회원가입
- 설명:
- 도커 허브는 컨테이너 이미지를 저장하고 공유하는 클라우드 기반 저장소
- 사용자는 도커 허브에서 컨테이너 이미지를 업로드하거나 다운로드해 사용

도커 작동 원리

애플리케이션은 커널을 통해 하드웨어에 접근한다.

커널영역만 자세히 살펴보자.
커널 영역에는 리눅스 하위시스템과 설치한 컨테이너들, 그리고 도커 서버가 있다.
cmd창에서 명령어를 내리면,
1. 가장 먼저는 host 운영체제에 도달한다.
2. 이후 도커 서버로 명령어를 전달한다.
3. 해당하는 컨테이너에게 명령어가 전달된다.
2. VM vs Docket
도커 컨테이너는 vm과 동일한 개념인가요?

Virtual Machine
- vm은 하드웨어 infrastructure위에 hypervisor(vmware나 virtualBox와 같은) 소프트웨어를 이용해 가상의 머신을 각각 만드는 것.
- 한 운영체제 위에서 동일한 애플리케이션을 고립된 다른 환경에서 구동하기 위해서는 Virtual Machine이 필요하다.
- 이 VM(virtual Macine)은 무거운 운영체제를 각각 포함하고 있기 때문에 시작하는데 오래걸리고 운영체제의 infrastructure에도 부담이 갈 수 있다.

Docker
- 컨테이너: VM에서 경량화된 컨셉
- 하드웨어에 설치된 운영체제, 즉 HostOS에서 컨테이너 엔진이라는 소프트웨어를 설치하면 개별적인 컨테이너를 만들어 각각의 애플리케이션을 고립된 환경에서 구동할 수 있게 해준다.
- vm과의 큰 차이점은, 운영체제가 포함되지 않고 컨테이너 엔진에 설치된 HostOS를 공유한다.
- 앞서 언급한 VM에서 개별적으로 가지는 OS가 많은 리소스를 차지했기에, 그 부분이 제거되어 VM과 달리 매우 가벼워진다.
- 컨테이너가 구동되기 위해서는 컨테이너 엔진이 필요하고, 이 컨테이너 엔진이 HostOS에 접근해서 필요한 것들을 처리해준다.
- 이 컨테이너 엔진 중에 가장 많이 사랑받고 이용되는 것이 바로 도커(Docker).

3. 도커의 3대 구성요소
- Building Containers: Dockerfile, Image, Container

Dockerfile
- 도커 파일: 컨테이너를 어떻게 만들어야하는지에 대한 설명서. 요리로 치면 레시피
- Copy files: 애플리케이션 구동을 위해 꼭 필요한 파일들 목록
- Install Dependencies: 꼭 필요한 라이브러리, 외부 의존성
- Set environment variables: 필요한 환경변수 설정
- Run setup scripts: 어떻게 구동해야 하는지 설명하는 스크립트 파일

Image
작성한 도커 파일을 이용해 이미지를 만들 수 잇다.
- 이미지 안에는 애플리케이션을 실행하는데 필요한 코드, 런타임 환경, 시스템 툴, 시스템 라이브러리 등 모든 셋팅들이 포함되어 있다.
- 즉, 실행되고 있는 애플리케이션의 상태를 스냅샷해서 이미지로 만들어 둔다
- 이렇게 만들어진 이미지는 변경이 불가능한 불변의 상태로 볼 수 있다.

Container
- 도커 컨테이너
- 우리가 캡쳐해둔 애플리케이션 이미지를 고립된 환경에서 개별적인 파일 시스템 안에서 실행할 수 있는 것.
- 컨테이너 안에서 우리의 앱이 동작한다.
- 컨테이너는 우리가 스냅샷한 이미지를 이용해 애플리케이션을 구동한다.
- 이미지를 객체지향의 클래스에 비유할 수 있다.
- 동작하고 있는 앱을 스냅샷해서 템플릿 형태로 만들어두고, 이 클래스 이미지를 통해 실제로 동작하는 각각의 컨테이너를 만들 수 있다.
- 이미지 자체는 우리가 캡쳐했을 당시의 프로젝트 상태를 불변으로 가진다.
- 컨테이너에서 동작하는 애플리케이션은 개별적으로 수정이 가능한 상태이다.
- 컨테이너 내부에서 수정된 파일들은 이미지에 영향을 미치지 않는다.
- 즉, 이미지는 클래스, 컨테이너는 만들어진 인스턴스라고 볼 수 있다.

4. 도커 이미지 배포 과정
어떻게 컨테이너를 배포할 수 잇을까?
어떻게 이미지를 공유할 수 있을까?
- 도커의 사용은 깃과 깃허브에 비유할 수 있다.
- 로컬 머신에서 이미지를 만들어 깃허브와 같은 컨테이너 레지스트리(Container Registry)라는 곳에 내가 만든 이미지를 푸시한다.
- 필요한 서버나 내가 만든 PC에서 만들어둔 이미지를 가져와 그걸 그대로 실행한다.
- 물론 이 이미지의 정상 실행을 위해서는 도커와 같은 컨테이너 엔진이 꼭 설치되어 있어야 한다.

총정리

- 개발하는 로컬 머신, 서버에 도커를 설치한다.
- 애플리케이션 구동에 필요한 도커 파일을 만든다.
- 이걸 이용해서 우리 애플리케이션을 스냅샷하는 이미지를 생성한다.
- 이 이미지를 컨테이너 레지스트리에 올린다음, 서버에서 다운받아 실행할 수 있다.
Reference