이전 프로젝트부터 Docker를 사용해 배포를 한 경우가 많았다. 주로 배포를 직접 담당하지 않았어서 Docker에 대해 어렴풋이 알고 있던 내용을 이번 학기에는 직접 사용해볼 기회가 생겼다 ! 이번에는 Docker에 대해서 먼저 알아본 뒤, 사용방법에 대해 공부해야겠다. 🌱
Docker란?
- Docker란, GO 언어로 작성된 리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼이다.
- 컨테이너로 프로젝트를 관리하여 더 쉽게 실행하고, 관리할 수 있게 도움을 준다.
정의에 적힌 용어들이 와닿지 않았다. 🤕 처음 접하는 용어가 너무 많아 용어부터 정리하기로 했다.
용어 정리
가상화 (Virtualization)
- 하나의 컴퓨터 안에 잇는 하드웨어자원 (cpu, 메모리, 스토리지)를 가상머신(VM, 가상서버)라고 불리는 다수의 가상 컴퓨터에게 분할하는 과정
⇒ 하나의 하드웨어 자원을 여러 os로 실행 가능하도록 함으로 여러 대의 컴퓨터가 동작하는 효율을 이끌어 내는 것
😟 이전에도 가상화는 계속해서 존재하는 기술이었으나, 왜 Docker 가상화가 특히나 유명할까 ?
기존 가상머신 vs 도커 가상화
기존 가상머신 (ex. Virtual Box, VMware)
- Hypervisor를 이용해 여러 OS를 하나의 호스트에서 생성해서 사용
- Hypervisor가 생성/관리하는 OS == 게스트 OS : 완전히 독립된 공간과 시스템 자원 할당
- 그렇기 때문에, 일반 호스트에 비해 성능적 손실 발생
- 또한, 가상머신이 게스트 OS를 위한 라이브러리 커널등을 모두 포함하므로 배포할 때 이미지 용량이 큼 ⬆
도커 가상화
- 리눅스 자체 기능인 chroot, 네임스페이스, cgroup을 사용 => 프로세스 단위의 격리 환경
- 컨테이너에 필요한 커널을 공유 => 컨테이너에는 라이브러리 및 실행 파일만 존재 => 이미지의 용량이 작음 ⬇
- 배포 시간이 가상 머신에 비해 빠르고, 성능 손실도 적다.
😟 Docker Engine의 기본 단위 중에 컨테이너와 이미지가 있는데 그건 뭘까 ?
이미지 (Image)
- Docker File -> Docker Image
⇒ docker build 명령어로 Image 생성 가능 - Docker Image : Docker Continaer = 1 : N
⇒ docker run 명령어로 Contianer 생성 가능
컨테이너 (Container)
- 가상화 기술 중 하나
- 기존에 OS를 가상화 시키던 것과 달리, OS 레벨의 가상화로 프로세스를 격리시켜 동작하는 방식
⇒ 가상머신을 생성하는 것이 아니라 Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 함 - Docker Image들이 Container에 들어있으며, Image의 목적에 맞춰 사용된다.
- Image를 읽기 전용으로 사용하되, 변경된 사항만 해당Container 계층에 저장하기에 다른 image에 영향을 받지 않는다.
⇒ image a -> container A , image b -> container B : A 컨테이너 수정 != B 컨테이너 영향
🥳 드디어 감이 잡히기 시작했다! 그렇다면 마무리로 컨테이너의 장점을 정리해보자.
- OS 가상화는 OS 위에 OS를 올려서 무겁고 느리지만
- 컨테이너는 Docker Engine 위에서 바로 동작하고 Host의 커널을 공유하여 I/O 처리가 쉽고 효율적이다.