[이론] docker 란 ?

mallin·2022년 2월 14일
1

docker

목록 보기
1/2
post-thumbnail

docker 란 ?

Go 언어로 만들어진 컨테이너 기반의 오픈소스 가상화 플랫폼

docker 공식 사이트 👉 https://www.docker.com

한줄 설명에서 컨테이너 기반 이란 단어가 나오는데 해당 단어를 통해 docker 가 어떤건지 알아보겠습니다

컨테이너란 ?

컨테이너라고 하면 많은 사람들이 공사 현장에서 많이 사용되는 아래와 같은 컨테이너를 생각하실 것 같은데요.
https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Container_01_KMJ.jpg/300px-Container_01_KMJ.jpg
이미지 출처 : https://ko.wikipedia.org/wiki/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88

Docker 의 컨테이너도 위 컨테이너와 유사합니다.

Docker 의 컨테이너란 격리된 공간에서 프로세스가 동작하는 기술로 기존의 가상화 기술 중 하나지만 기존 방식과는 차이점이 있습니다.

가상화란 ?
물리적인 하드웨어 장치 를 논리적인 객체로 추상화 하는 것
이를 통해 하나의 하드웨어를 여러 개처럼 동작시키거나 반대로 제공

기존의 방식은 보통 OS 를 가상화 했지만 docker 는 OS 레벨의 가상화로 프로세스를 격리시켜 동작합니다.

https://subicura.com/assets/article_images/2017-01-19-docker-guide-for-beginners-1/vm-vs-docker.png
출처 : https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

왼쪽이 VM을 사용한 기존 가상화 방식, 오른쪽이 docker 를 사용한 가상화 방식입니다.

VM의 경우 ➡️ OS 를 분리
Host OS 위에 가상 머신을 생성하고 실행하는 프로세스 인 Hypervisor (가상 머신 모니터) 엔진이 있고, 그 위에 Guest OS 를 올려서 사용합니다.

① 👍 장점
각각 Guest OS 가 돌아가기 때문에 Host OS 와 완벽하게 분리됩니다
높은 격리 레벨
멀티 OS 가 가능합니다 (리눅스 환경 위에 윈도우를 올릴 수 있다)

② 👎 단점
OS 위에 OS 를 올리기 때문에 무겁고 성능이 느립니다.

Docker의 경우 ➡️ OS 는 Host OS 를 사용하고 프로세스를 분리
Host OS 위에 Docker 엔진이 올라가고 그 위에는 Application 실행에만 필요한 Binary 파일들만 올라가게 됩니다. 즉 Host OS 가 사용하는 자원을 분리하여 여러 환경을 만듭니다

① 👍 장점
성능 향상
뛰어난 이식성
쉽게 Scale out 이 가능한 유연성
자원의 낭비가 없음 (CPU 나 프로세스를 프로세스가 필요로 한만큼만 사용함)

② 👎 단점
보안에 유리하지 않다

Docker 에서 컨테이너는 이미지를 바탕으로 실행됩니다.

이미지란 ?

이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있습니다.
컨테이너는 이 이미지를 실행한 상태라고 생각하면 됩니다.

📑 예를 들어서 수학 시험에 족보(원본)가 있다고 했을 때
이 족보는 학생들 사이에서 프린터를 통해 복사되고 복사되어서 떠돌게 됩니다. 여기서 족보(원본) 는 프린터를 통해 계속해서 복사본이 생성될 수 있고, 복사본을 찢거나 불태워 버린다고 해도 족보(원본) 에는 아무런 영향이 없습니다.

해당 예에서 이미지가 원본 족보라고 생각하면 되고, 컨테이너가 해당 예에서 복사본 족보 라고 생각하면 됩니다.

MySQL 이미지인 경우 MySQL 을 실행하기 위해 필요한 모든 파일과 실행 명령어, 포트 정보를 가지고 있고, ubuntu 이미지는 ubuntu 를 실행하기 위한 모든 파일을 가지고 있습니다. 그렇기 때문에 복잡하게 로컬 컴퓨터에 설치하지 않고 컨테이너를 통해 쉽게 작업할 수 있습니다.

이미지가 만들어지는 과정
https://t1.daumcdn.net/cfile/tistory/991ACC3C5B8D445C0C
출처 : https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90

docker 의 이미지는 프로그램을 생성하기 위한 모든 정보를 가지고 있다 보니 용량이 엄청 커지고 무거워 질 수 밖에 없습니다. 그렇기 때문에 레이어 라는 개념을 사용합니다.

이미지는 여러개의 읽기 전용 레이어로 이루어져 있고, 수정하거나 새로운 기능을 추가하는 경우 새로운 레이어가 더해집니다.

위 사진 처럼
ubuntu 이미지 ➡️ Layer A + Layer B + Layer C
nginx 이미지 ➡️ ubuntu 이미지를 바탕으로 Layer A + Layer B + Layer C + nginx Layer
web app 이미지 ➡️ nginx 이미지를 바탕으로 Layer A + Layer B + Layer C + nginx Layer + web app source

그렇기 때문에 만약 web app 의 이미지를 수정하면 web app source 만 수정되고 다운로드 되게 됩니다.

이미지를 바탕으로 컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가합니다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되기 때문에 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용합니다.

docker 이미지는 docker hub 를 통해서 찾을 수 있습니다.

ruby 이미지 를 찾은 예시 ⬇️

아키텍처

Docker daemon

  • 도커 API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 도커 객체를 관리합니다
  • 다른 데몬과 통신하여 도커 서비스를 관리할 수도 있습니다

Docker Registry

  • 도커의 이미지를 저장
  • docker pull 혹은 docker run 명령어를 실행하는 경우 필요한 이미지를 Docker Registry 에서 꺼내서 사용합니다
  • docker push 명령어를 실행하는 경우 이미지가 구성된 Registry 에 푸쉬합니다

🙇🏻‍♀️ 레퍼런스

도커가 뭐고 왜 쓰는건가요?
가장 쉽게 배우는 도커
docker docs
초보를 위한 도커 안내서 - 도커란 무엇인가?
[Docker] Docker의 개념 및 핵심 설명

0개의 댓글