Docker는 컨테이너 기반의 오픈 소스 가상화 플랫폼으로, 애플리케이션 및 그에 따른 환경을 격리된 컨테이너에 패키징하여 개발, 배포, 실행을 쉽게 지원하는 툴이다.
먼저 Docker를 이해하기 위해서는 가상화에 대해서 이해가 필요하다.
하이퍼바이저
를 이용해 여러개의 운영체제를 하나의 호스트에서 생성하는 방식이다.
하이퍼바이저는 다음과 같은 역할을 수행한다.
위 그림을 보면 하나의 Host OS에서 여러 개의 서버 운영 체제(게스트 OS)가 생성되어 있는 것을 볼 수 있다.
이렇게 생성된 게스트 OS들은 가상 머신이라는 단위로 구별되고, 다른 게스트 OS와는 완전히 독립된 공간과 시스템 자원을 할당 받아 사용한다.
기존 가상화의 대표적인 예로는 VMware, VirtualBox가 있다.
이런 가상머신을 사용하려면 처음에 OS 설치를 해야한다.
호스트 OS와 다르게 독립적으로 게스트 OS를 구축해서 동작하기 때문이다.
이 뿐만 아니라 실제 PC처럼 별도로 환경설정을 하는 등 세팅을 해줘야하기 때문에 시간도 소요된다. (메모리도 많이 잡아먹음)
반면에 컨테이너를 사용하면 이런 부분을 해결할 수 있다.
이제 컨테이너에 대해 알아보자.
컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, 네임스페이스, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만든다.
위 그림을 보면 기존 가상화와는 달리 컨테이너 엔진위에 컨테이너들이 할당되어 있는것을 볼 수 있다.
컨테이너안에는 애플리케이션을 구동하는데 필요한 라이브러리 및 실행 파일만 존재하므로, 이미지를 만들었을 때 이미지의 용량이 가상 머신에 비해 훨씬 작다.
이미지의 용량이 작기 때문에 이미지를 만들어 배포하는 시간이 빠르고, 가상화된 공간을 사용했을 때 성능 손실도 거의 없다.
이 컨테이너 가상화의 대표적인 기술이 바로 Docker
이다.
궁극적으로 어떠한 큰 장점이 있어서 컨테이너 가상화를 사용하는지에 대해 의문이 있을 수 있다. 이에 대해 알아보자.
이제 편의상 컨테이너에 대해서는 Docker라고 하겠다.
개인적인 생각으로 도커를 사용하는 가장 큰 이유는 이식성 때문에 인것 같다.
예를 들어, EC2 인스턴스에서 Java 애플리케이션을 실행한다고 가정해보자. Docker를 사용하지 않는 경우, 먼저 EC2 인스턴스에 JDK를 설치하고, 애플리케이션의 모든 종속성을 설정해야 한다. 이렇게 하면 환경 설정에 많은 시간이 걸리고, 각 인스턴스마다 동일한 설정을 보장하기 어려워진다.
그러나 Docker를 사용하면, 필요한 JDK와 애플리케이션 종속성이 모두 포함된 Docker 이미지를 만들 수 있다. 이 Docker 이미지를 사용하면, EC2 인스턴스에 Docker만 설치되어 있으면, 그 위에서 동일한 환경으로 애플리케이션을 실행할 수 있다
Docker Image란
서비스 운영에 필요한 애플리케이션, 소스코드, 라이브러리, 실행파일, 설정 값들을 묶어서 가지고 있는 것이다.
도커 이미지를 만들기 위해서는 도커 파일
이 필요하다.
FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY build/libs/plant-sns-service-1.0.jar plant-sns-service.jar
ENTRYPOINT ["java", "-jar", "plant-sns-service.jar"]
도커 컨테이너
는 도커 이미지로 생성할 수 있으며, 도커 이미지와 컨테이너는 1 : N 관계를 갖는다.
즉, 하나의 이미지로 여러 컨테이너를 생성할 수 있는 것이다.
이미지를 실행하여 컨테이너를 생성하면, 도커 파일로 작성된 해당 이미지의 목적에 맞게 프로세스 단위의 격리 환경에 컨테이너가 생성된다.
https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90
https://hstory0208.tistory.com/entry/Docker%EB%8F%84%EC%BB%A4%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90