Docker 란

리브리버·2023년 5월 26일
1

Docker

Docker ?
왜 써야 할까요

  • 로고가 귀엽다
  • 도커가 저 사람 컴퓨터에서는 되는데 내 컴퓨터에서는 안돼 ! 와 같은 상황을
    해결해주기 때문 !!

도커란 ?

  • 컨테이너 기반의 가상화 시스템
  • 도커 엔진(Docker Engine) 혹은 도커에 관련된 모든 프로젝트를 말함

도커 엔진이란 ?

  • 컨테이너를 생성하고 관리하는 주체로서 이 자체로도 컨테이너를 제어할 수 있고 다양한 기능을 제공하는 도커의 프로젝트
  • 도커의 핵심

컨테이너 ? 가상화 ? 가 뭘까요

하나하나 차근히 알아보겠습니다


Virtualization

가상화

  • 실제 있지 않는 것을 마치 있는 것 처럼 보이게 해주는 기술

이 개념을 조금 넓게 본다면 ..

현재 존재하지 않는? 애인을 마치 있는 것처럼 화면속에 띄워주는 것도 가상화 이고

내 컴퓨터에는 하드디스크가 하나 밖에 안 꽃혀 있는데 파티션을 나누어

C 드라이브와 D 드라이브 두개가 있는 것처럼 보이게 하는 것도 가상화 입니다

여기서 조금 더 나아가면 인셉션(영화)처럼 컴퓨터 안에 가상의 컴퓨터를 만들게 되는데

VirtualBox를 이용해서 윈도우즈 안에 윈도우즈를 띄운다거나 Mac Os에서 Parallels를 이용해서 원도우즈를 띄우는 것을 가상화인 한 가지인 가상 머신이라고 부릅니다

이러한 가상화의 개념은 클라우드 시장의 핵심 기술로써 큰 환영을 받고 있습니다


집 하나를 여러 구역으로 쪼개는 것처럼

물리적인 서버 하나를 여러 개의 가상 서버로 쪼개서

여러 명한테 각각 빌려줄 수 있게 된 것입니다

고객들도 굳이 개인이 비싼 서버 한 대를 통째로 다 쓸 필요는 없는데 서버를 나누어 가격이 더 저렴해진다면 이득이죠


그런데 이렇게 한 컴퓨터에서 독립된 운영체제를 여러 개 돌리는 가상화는 문제가 있습니다

컴퓨터 한 대에서 운영체제를 여러 개를 한꺼번에 돌리려다 보니 서로에게 치여 느릴 수 밖에 없는데요

그래서 리눅스 진영에서 고민을 하기 시작합니다

  • 서버로 많이 쓰는 운영체제들은 Ubuntu, CentOs, RedHat들이 모두 동일한 리눅스 커널이라는 알맹이를 사용하는데 이를 하나로 퉁칠 수는 없을까 ?

그래서 여러 가지 역사를 거쳐 완성된 오픈소스 기술이 바로 도커 입니다


도커를 쓰면 굳이 독립된 운영체제를 여러 개 띄울 필요가 없습니다

집주인 운영체제 위에다가 도커만 설치하면 어느 컴퓨터에서든 똑같이 돌아가는 가상 환경을 여러 개 띄울 수 있습니다

운영체제 알맹이는 통일하고 그 위에 나머지 필요한 부분만 묶어 가볍게 가상화한 것이 바로 컨테이너 입니다


Countainer

도커 컨테이너란 ?

  • 가상화된 공간을 생성할때 리눅스 자체 기능을 사용하여 프로세스 단위의 격리 환경을 만듦
  • 가상머신과 달리 커널을 공유해서 사용하므로, 컨테이너에는 라이브러리 및 실행파일만 있으므로 용량이 비교적 작음
  • 위의 이유로 컨테이너를 만들때 배포하는 시간이 가상머신에 비해 빠르며, 사용할 때의 성능 손실 또한 거의 없음

도커 아키텍처

Docker Client -> 도커를 설치하면 그것이 Client며 build, pull, run 등의 도커 명령어를 수행합니다.

DOCKER_HOST -> 도커가 띄워져있는 서버를 의미합니다. DOCKER_HOST에서 컨테이너와 이미지를 관리하게 됩니다.

Docker daemon -> 도커 엔진입니다.

Registry -> 외부(remote) 이미지 저장소입니다. 다른 사람들이 공유한 이미지를 내부(local) 도커 호스트에 pull할 수 있습니다. 이렇게 가져온 이미지를 run하면 컨테이너가 됩니다.

public 저장소: Docker Hub, QUAY
private 저장소: AWS ECR 혹은 Docker Registry를 직접 띄워서 비공개로 사용하는 방법등이 존재합니다.


도커 이미지와 도커 컨테이너

도커 엔진에서 사용하는 기본 단위는 이미지와 컨테이너이며 도커 엔진의 핵심입니다

도커 이미지와 컨테이너는 1:N 관계 입니다

도커 이미지와 컨테이너의 관계는 운영체제에서의 프로그램 <-> 프로세스, 객체지향 프로그래밍에서의 클래스 <-> 인스턴스의 관계와 비슷하다고 생각하면 이해가 더 편합니다.


Docker File -> Docker Image: Docker File은 도커 이미지를 만들때 사용하는 파일. docker build 명령어를 실행시키면 도커 이미지를 만들 수 있습니다.

Docker Image -> Docker Container: Docker Image를 docker run 명령어를 실행시키면 Docker Container를 만들 수 있습니다.

도커 이미지

도커 이미지(Docker Image)는 컨테이너를 생성할 때 필요한 요소이며, 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념입니다.

이미지는 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용되며 여러 계층으로 된 바이너리 파일로 존재합니다.

도커 컨테이너

도커 컨테이너(Docker Container)는 도커 이미지로 생성할 수 있으며, 컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일이 들어 있는, 호스트와 다른 컨테이너로부터 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간(프로세스)이 생성됩니다.

대부분의 도커 컨테이너는 생성될 때 사용된 도커 이미지의 종류에 따라 알맞은 설정과 파일을 가지고 있기 때문에 도커 이미지의 목적에 맞도록 사용되는 것이 일반적입니다.

ex) 웹 서버 도커 이미지로부터 여러개의 도커 컨테이너를 생성하면 생성된 컨테이너의 개수만큼 웹 서버가 생성되고, 이 컨테이너들은 외부에 웹 서비스를 제공하는 데에 사용됩니다.

컨테이너는 이미지를 읽기 전용으로 사용하되 이미지에서 변경된 사항만 컨테이너 계층에 저장하므로 컨테이너에서 무엇을 하든지 원래 이미지는 영향을 받지 않습니다. 또한 생성된 각 컨테이너는 각기 독립된 파일시스템을 제공받으며 호스트와 분리돼 있으므로 특정 컨테이너에서 어떤 어플리케이션을 설치하거나 삭제해도 다른 컨테이너와 호스트는 변화가 없습니다.

ex) 같은 도커 이미지로 A, B 두 개의 컨테이너를 생성한 뒤에 A 컨테이너를 수정해도 B 컨테이너에는 영향을 주지 않습니다.


참고

0개의 댓글