Docker란?
Docker는 컨테이너 기반의 오픈 소스 가상화 플랫폼으로, 애플리케이션 및 그에 따른 환경을 격리된 컨테이너에 패키징하여 개발, 배포, 실행을 쉽게 지원하는 툴이다.
먼저 Docker를 이해하기 위해서는 가상화에 대해서 이해가 필요하다.
가상화란?
하이퍼바이저를 이용해 여러개의 운영체제를 하나의 호스트에서 생성하는 방식이다.
하이퍼바이저
하드웨어에서 시스템의 운영 체제와 리소스를 분리해 VM에 할당하여 가상 머신을 생성하고 구동하는 소프트웨어이다.
하이퍼바이저는 다음과 같은 역할을 수행한다.
- 실제 CPU, RAM, 디스크, 네트워크 카드 등을 가상화하여 VM에게 제공 (VM은 이 가상 하드웨어를 진짜 하드웨어로 인식)
- 호스트 OS가 실제로 갖고 있는 물리적 자원보다 더 많이 할당할수도 있다.
- 각 VM이 자신의 독립적인 커널을 실행
- OS들의 커널을 번역해서 하드웨어에게 전달
이렇게 생성된 게스트 OS들은 가상 머신이라는 단위로 구별되고
각각 자신만의 독립적인 커널을 실행하며, 다른 게스트 OS와는 완전히 독립된 공간과 시스템 자원을 할당 받아 사용한다.
* 커널 : 항상 메모리에 상주하는 운영체제의 핵심이 되는 부분으로 컴퓨터 자원을 관리하는 자원 관리자 (모든 프로세스는 커널을 통해 하드웨어 자원에 접근)
얼핏보면 좋은거아니야?? 라고 생각할 수 있다. 하지만 이 가상화 방식은 아래와 같은 단점들이 존재한다.
서버 가상화의 단점
- 모든 명령이 하이퍼바이저를 거쳐야 하므로 일반 호스트에 비해 속도가 느리다.
- 각 VM 이미지는 완전한 운영체제를 포함하므로 용량이 크다.
- 각 가상 머신마다 독립된 운영체제를 가지고 있어서 추가적인 메모리 및 디스크 공간이 필요하다.
- VM을 실행하지 않을 때도 할당된 디스크 공간은 계속 점유된다.
- VM 간에 중복된 라이브러리와 애플리케이션이 각각 메모리에 로드된다. -> 다른 VM과 자원을 쉽게 공유할 수 없어 중복 발생
- 각 VM마다 관리가 필요하다.
기존 가상화의 대표적인 예로는 VMware, VirtualBox가 있다.
이런 가상머신을 사용하려면 처음에 OS 설치를 해야한다.
호스트 OS와 다르게 독립적으로 게스트 OS를 구축해서 동작하기 때문이다.
이 뿐만 아니라 실제 PC처럼 별도로 환경설정을 하는 등 세팅을 해줘야하기 때문에 시간도 소요된다. (메모리도 많이 잡아먹음)
컨테이너란?
애플리케이션과 그 실행에 필요한 모든 의존성(라이브러리, 바이너리, 설정 파일 등)을
하나의 패키지로 묶어 어디서나 일관되게 실행할 수 있게 해주는 경량화된 가상화 기술이다.
컨테이너는 가상화된 공간을 생성하기 위해 리눅스 네임스페이스(namespace)와 cgroups를 사용해 자원을 격리하고 제한해
프로세스 단위의 격리 환경을 만든다.
컨테이너 엔진이 호스트 OS 위에서 실행되고 컨테이너들은 호스트 OS 커널을 공유한다. (메모리 사용량이 적고 시작이 빠르다.)
또한 이러한 특성으로 컨테이너는 호스트와 동일한 OS 커널이 필요하다. (Linux 호스트에서는 Linux 컨테이너만 실행 가능)
컨테이너안에는 애플리케이션을 구동하는데 필요한 라이브러리 및 실행 파일만 존재하므로, 이미지를 만들었을 때 이미지의 용량이 가상 머신에 비해 훨씬 작다.
이미지의 용량이 작기 때문에 이미지를 만들어 배포하는 시간이 빠르고, 가상화된 공간을 사용했을 때 성능 손실도 거의 없다.
만약 10개의 애플리케이션을 실행한다면 VM과 다음과 같은 차이가 있다.
- VM 방식: 10개의 완전한 OS를 실행 (10개의 커널, 10개의 모든 시스템 프로세스) = 10개의 완전한 컴퓨터를 켜는 것과 비슷
- 컨테이너 방식: 1개의 OS 커널 위에 10개의 격리된 프로세스 실행 - 1대의 컴퓨터에서 10개의 앱을 실행하는 것과 비슷
이 컨테이너 가상화의 대표적인 기술이 바로 Docker이다.
Docker의 특징
어떠한 큰 장점이 있어서 Docker를 사용하는지 특징에 대해 알아보자.
격리(Isolation)
Docker는 프로세스를 격리된 환경에서 관리한다.
격리된 환경이란 Host OS 와의 격리를 의미하며 컨테이너에 어떠한 설정을 하든 Host OS에 영향을 끼치지않는다.
우리만의 독립된 개발 환경을 보장받는 것이다.
Docker를 사용함으로써 프로세스를 컨테이너 단위로 사용할 수 있게 되어
각 애플리케이션과 그와 관련된 의존성 및 설정 파일 등을 완전히 분리하여 지원되어 이러한 격리로 인해 서로 다른 애플리케이션 간의 충돌 및 호환성 문제를 방지하는 등..
프로세스의 관리, 확장이 용이 해진다.
이식성(Portability)
Docker로 만들어진 컨테이너는 Docker가 설치된 모든 환경에서 동일하게 실행된다.
이게 가능한 이유는 다음과 같다.
컨테이너는 호스트 OS의 커널을 사용해 하드웨어와 통신한다.
따라서 직접 하드웨어와 상호작용하지 않고, OS가 제공하는 표준화된 인터페이스를 사용해 기본 하드웨어와 무관하게 작동할 수 있다.
이를테면 개발을 진행한 로컬 환경의 애플리케이션을 다른 서버 환경으로 쉽게 옮겨 실행할 수 있게 한다.
경량(Lightweight)
VM처럼 전체 OS를 가상화하지 않아 메모리 사용량이 크게 줄어든다.
애플리케이션이 동작하는데 필수적인 실행 가능한 파일과 라이브러리만 포함해 작은 크기의 이미지를 가질 수 있다.
VM과 다르게 컨테이너는 필요할 때만 자원을 사용하고, 필요하지 않을 때는 반환한다.
또한 이미 실행 중인 호스트 커널을 그대로 활용하기 때문에 새로운 커널을 시작하지 않고, 기존 커널에 작업을 위임해
마치 한 명의 관리자가 여러 부서를 효율적으로 관리할 수 있다.
버전 관리
Docker는 이미지 빌드와 배포를 위한 버전 관리를 제공한다.
이미지는 여러 레이어로 구성되며, 변경 사항에 대해 새로운 레이어를 추가하여 효율적인 빌드와 저장 상황을 제공한다.
커뮤니티 및 이미지 공유
Docker Hub를 통해 다양한 Docker 이미지를 제공한다.
또한 사용자는 자신만의 Docker 이미지를 만들어 공유할 수 있다.
Docker Image
Docker Image란 서비스 운영에 필요한 애플리케이션, 소스코드, 라이브러리, 실행파일, 설정 값들을 묶어서 가지고 있는 것이다.
즉, 애플리케이션을 행하기 위한 모든 요소를 포함하고 있는 것이다.
Docker 이미지들은 github과 똑같이 Docker Hub 사이트를 통해 버전관리 및 배포 Push, Pull이 가능하다.
Docker Hub 사이트에서 다양한 컨테이너 이미지를 사용할 수 있는데, 여기서 Nginx 도커 이미지를 다운받고 실행시키면 Nginx가 바로 실행되는 것이다.
도커 이미지에 대해 더 자세한 내용은 아래 링크를 참조.
[Docker] 도커의 레이어(Layer)에 대해 알아보자.
도커 이미지는 컨테이너를 만들기 위한 "압축파일" 개념이다. 이미지는 한번 만들어지면 이미지 내의 정보는 절대 변하지 않으며(불변성), 이미지를 통해 컨테이너를 만들 수 있다. 이 이미지는
hstory0208.tistory.com
DockerFile
도커 이미지를 만들기 위해서는 도커 파일이 필요하다.
도커 파일을 이용해 이미지를 구성하기 위한 명령어들을 작성하여 이미지를 구성할 수 있다.
도커파일은 이미지를 생성하기 위한 스크립트 파일이다.
주로 텍스트 형식의 명령어들로 구성되어 있으며, 이를 사용하여 이미지 빌드 과정을 자동화하고 문서화할 수 있다.
도커 파일을 사용하여 이미지를 만드는 방법은 다음 포스팅에서 알아보자.
[Docker] dockerfile의 개념과 작성법에 대해 알아보자.
hstory0208.tistory.com
Docker Container
도커 컨테이너는 도커 이미지로 생성할 수 있으며, 도커 이미지와 컨테이너는 1 : N 관계를 갖는다.
즉, 하나의 이미지로 여러 컨테이너를 생성할 수 있는 것이다.
이미지를 실행하여 컨테이너를 생성하면, 도커 파일로 작성된 해당 이미지의 목적에 맞게 프로세스 단위의 격리 환경에 컨테이너가 생성된다.
'◼ 오픈소스' 카테고리의 다른 글
[Docker] 도커의 레이어(Layer)에 대해 알아보자. (0) | 2023.06.22 |
---|---|
[Docker] DockerFile의 개념과 작성법에 대해 알아보자. (도커 이미지 생성 방법) (2) | 2023.06.22 |
[Grafana] 그라파나란? 대쉬보드 만들기 및 활용 (0) | 2023.05.24 |
[Grafana] 그라파나 - 프로메테우스 연동 방법 (0) | 2023.05.23 |
[Grafana] 그라파나 설치 방법 (Window) (0) | 2023.05.23 |