[Docker] Docker 소개
📌 Topic
- 도커를 쓰는 이유
- 도커란 무엇인가
- 도커 이미지와 도커 컨테이너 정의
- WINDOWS를 위한 도커 설치
- 도커를 사용할 때의 흐름
- 도커와 기존의 가상화 기술과의 차이를 통한 컨테이너 이해
01. 도커를 쓰는 이유?
도커는 리눅스의 응용 프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈 소스
Docker를 사용하는 이유는 어떠한 프로그램을 다운받는 과정을 굉장히 간단하게 만들기 위해 사용이 된다.
우리는 어떠한 프로그램을 다운로드 받기 위해 인스톨러를 내려 받는다.
이 때, 갖고 있는 서버, 패키지 버전, 운영체제 등에 따라 프로그램 설치 과정에서 에러가 발생한다.
즉, 이러한 애플리케이션 환경에 따라 설치 방식이 달라지게 되고 각각의 환경에 맞는 설치 방법을 통해 우리는 설치를 진행해야 한다.
도커는.. 애플리케이션 환경에 구애 받지 않고 실행하는 기술 이다. 또한 애플리케이션 뿐만 아니라 애플리케이션을 실행하는데 필요한 모든 환경을 포함한다.
02. 도커란 무엇인가?
컨테이너를 사용하여 응용 프로그램을 더 쉽게 만들고 배포하고 실행할 수 있도록
설계된 도구 이며 컨테이너 기반의 오픈소스 가상화 플랫폼이며 생태계이다.
02-1. Docker
도커는 컨테이너 기반의 오픈소스 가상화 플랫폼
- Go 언어로 작성된 Linux 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼
- 현실 세계의 컨테이너
- 배에 실는 네모난 화물 수송용 박스
- 옷, 신발, 전자제품, 술, 과일등 다양한 화물을 넣어서 규격화가 가능
- 컨테이너선이나 트레일러 등 다양한 운송 수단으로 쉽게 옮길 수 있음
- 서버 관점에서의 컨테이너
- 다양한 프로그램, 실행환경을 컨테이너로 추상화
- On-premise, Cloud(AWS, Azure, Google Cloud)등 어디에서든 실행 가능
02-2. Docker 부연
하나의 운영체제(OS) 위에서 lib, bin 파일만 가지고 실행
우리는 VMware, Virtual Machine을 사용하여 서버를 가상화해본 경험이 있다.
02-3. 컨테이너(Container)
Docker는 컨테이너 기반 기술을 제공
- 격리된 공간에서 프로세스가 동작하는 기술
- 가상화 기술의 하나지만 기존 방식과는 차이가 있음
- VMware, VirtualBox같은 가상머신은 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용
- 즉, 하이퍼 바이저 위에 새로운 게스트 OS를 배치하여 사용이 되기 때문에 무겁다
- 여러가지 OS를 가상화하여 사용법은 간단, 무겁고 느려서 운영 환경에서 사용 힘듬
가상 컴퓨팅(VMware, VirtualBox)은 한 물리적 컴퓨터 안에 각각 OS를 돌리는 컴퓨터들이 물리적 자원을 분리해서 사용하기에 메모리를 더 많이 잡아먹어서 성능에 한계가 생김.
Docker의 경우 OS딴까지 내려가는것이 아니라, 실행 환경만 독립적으로 실행 시키는 것이기 때문에 컴퓨터에 직접 설치를 한 것과 같은 성능을 낼 수 있고 가상 컴퓨팅에 비해 훨씬 가볍고 빠르게 구동, 종료 등을 수행할 수 있다.
02-4. 도커 이미지 vs 도커 컨테이너
도커에서 중요한 개념이 되는 이미지와 컨테이너의 차이점
이미지
- 서비스 운영에 필요한 서버 프로그램, 소스코드, 컴파일된 실행파일을 묶은 형태
- 실제로 저장소에 올리고 받는 것은 이미지
- 컨테이너를 구축하기 위한 하나의 레시피
- 카카오톡을 예로 든다면
- 카카오톡 실행에 필요한 모든 설정 파일
- 카카오톡 실행에 필요한 모든 종속성
컨테이너
- 컨테이너는 이미지를 이미 실행한 하나의 형태(프로세스)
- 레시피를 통해 준비된 케이크, 빵, 햄버거
- 이미지를 통해 실제 구동이 되고 있는 하나의 프로세스(인스턴스)
03. 도커를 사용할 때의 흐름
03-1. Hello World 이미지 실행
❯ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:13e367d31ae85359f42d637adf6da428f76d75dc9afeb3c21faea0d976f5c651
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
- hello-world 이미지를 실행 시키려고 하는데 로컬 캐시 보관 장소에 해당 이미지가 존재하지 않음
- 원격지(Docker Hub)에 존재하는 hello-world 이미지를 pulling 해서 받아옴
- 가져온 이미지를 통해 프로그램을 실행
04. 도커와 기존의 가상화 기술과의 차이를 통한 컨테이너 이해
위에서 언급한 VM과 Docker의 차이가 존재하지만 이번 시간에는
어떠한 차이가 있는지 조금 더 알아보는 시간을 가져보자.
04-1. 가상화 기술이 나오기 전
- 한대의 서버를 하나의 용도로만 사용
- 남는 서버 공간 그대로 방치
- 하나의 서버에 하나의 운영체제, 하나의 프로그램만을 운영
- 안정적이지만 리소스 차원에서 비효율
04-2. 하이퍼 바이저 기반의 가상화 출현
- 논리적으로 공간을 분할하여 VM이라는 독립적인 가상 환경의 서버 이용 가능
- 하이퍼 바이저는 호스트 시스템에서 다수의 게스트 OS를 구동할 수 있게 하는 S/W
- 하드웨어를 가상화 하면서 하드웨어와 각각의 VM을 모니터링하는 중간 관리자
하이퍼 바이저
하이퍼바이저에 의해 구동되는 VM은 VM마다 독립된 가상 하드웨어 자원을 할당 받는다
- 네이티브 하이퍼바이저
- 하이퍼 바이저가 하드웨어를 직접 제어
- 별도의 호스트 OS가 없으므로 오버헤드가 적음
- 여러 하드웨어 드라이버를 직접 설치 해야함(어려움)
- 호스트형 하이퍼바이저
- 호스트 OS 위에 설치 및 실행
- 하드웨어 자원을 VM 내부의 게스트 OS에 애뮬레이트
- 게스트 OS 종류에 대한 제약이 없음
04-3. 컨테이너 가상화 기술
- 공통점
- 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치
- Docker
- VM과 비교하였을때 하이퍼바이저와 게스트 OS가 필요하지않음(가벼움)
- Docker Engine 위에서 애플리케이션이 구동 됨
- 실제로는 호스트 운영체제(Host O/S)위에 실행 패키지인 이미지를 배포
- 컨테이너 내부에서 실행되는 프로세스는 호스트 시스템에서 볼 수 있다
- 컨테이너의 다른 프로세스 간에도 커널을 공유한다
- 컨테이너는 각각의 단위 내에서 격리되어 구동이 된다
04-4. 도커 컨테이너를 어떻게 격리 시키는가?
- 먼저 리눅스에서 쓰이는 Cgroup(control groups)과 네임스페이스(namespaces)에 대해 알아야 한다
- 위 기능들은 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널 기능
- Cgroup(리소스 사용량이 많으면 C group에 넣어서 제어)
- CPU, Memory, Network Bandwith 프로세스 그룹의 시스템 리소스 사용량 관리
- 어떤 어플의 사용량이 많다면 해당 애플리케이션을 C group에 넣어 CPU, Memory 사용 제한
- 네임스페이스(하나의 시스템에서 프로세스 격리)
- 하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술
- 별개의 독립된 공간을 사용하는 것처럼 분리된 환경을 제공하는 경량 프로세스 가상화 기술
참고 자료
- [인프런] 따라하며 배우는 도커와 CI 환경
- [문서] Amazon EKS란 무엇입니까?
- [문서] EKS란? EKS 생성하기(AWS Consonle, AWS CLI사용)
- [문서] 초보를 위한 도커 안내서 - 도커란 무엇인가?
- [문서] Dockerhub
- [문서] Docker 이미지와 컨테이너 차이
- [문서] Docker의 개념 및 핵심 설명
- [문서] 초보자를 위한 EKS 맛 보기
- [문서] Kubernetes-on-AWS
- [발표] Kubernetes 네트워크 이해하기 : 서비스 개념과 동작 원리
- [영상] 도커가 뭐고 왜 쓰는건가요?
- [영상] AWS EKS를 이용하여 Kubernetes를 구축해보자
- [영상] EKS란 무엇인가. (빅챗 6화)
댓글남기기