코딩두의 포트폴리오

01 도커(Docker)란? 본문

Docker

01 도커(Docker)란?

코딩두 2024. 4. 3. 01:16

1.1 도커를 사용하는 이유

회사에 도커 사용 비중 상승 -> 어떠한 프로그램을 내려받는 과정을 간단히 만들기 위해서

도커 사용하지 않을 때와 도커를 사용해 프로그램 설치 시

도커를 사용하지 않고 프로그램 설치 시

인스톨러 내려받기 -> 인스톨러 실행 -> 프로그램 설치 완료 -> 에러 발생...

에러 발생 이유: 프로그램을 설치하려는 서버, 패키지 버전, 운영체제 등

[도커 사용 X 인스톨러로 레디스(Redis) 설치] vs [도커 이용 O 같은 프로그램 설치] 비교 해볼 예정

레디스 설치하기 (window)

1. 레디스 홈페이지로 이동 (https://redis.io/)

2. 윈도우 환경이라서 github에서 제공된 msi 확장자 설치 (https://github.com/microsoftarchive/redis/releases)

3. 레디스 설치완료

4. 레디스 실행

 

 

1.2 도커와 컨테이너

AWS에 명시된 도커의 정의

애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼

소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징 

컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 SW 실행의 필요한 모든 것이 포함

 

위키디피아에서 제공하는 도커의 정의

리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트

 

도커 공식 사이트에서 도커의 정의가 나오기 전 웹페이지

세 군데 모두 컨테이너라는 개념이 등장 -> 도커와 컨테이너는 불가분의 관계

 

실 세계의 컨테이너 

실 세계에서는 컨테이너 다양한 물건을 넣음 -> 컨테이너에 담은 물건은 다양한 운송 수단을 통해 쉽게 옮길 수 있음

도커에서의 컨테이너

도커에서는 다양한 프로그램과 실행 환경을 컨테이너에 담고

동일한 인터페이스를 제공 -> 프로그램의 배포 및 관리를 단순하게 함

 

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

도커 컨테이너를 만들기 위해선 도커 이미지가 필요

  • 도커 컨테이너는 코드와 모든 종속성을 패키지화하여 응용 프로그램이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는 소프트웨어 표준 단위
  • 도커 이미지는 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행하는 데 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지

도커 이미지를 이용해 도커 컨테이너 생성

도커 컨테이너를 도커 이미지의 인스턴스라 부르고, 도커 컨테이너를 실행하면 그 컨테이너 안에서 실행하고자 하는 프로그램을 실행할 수 있음

 

1.4 도커 설치하기 (Window)

도커 회원 가입하기

도커 공식 홈페이지 (https://www.docker.com/) -> [Sign in] 회원 가입 페이지로 이동 -> 로그인 페이지 나오면 회원 가입 -> [Sign Up] -> 회원가입 완료

 

윈도우 환경에서 도커 설치하기

도커 공식 홈페이지에서 도커 설치

도커 접속까지 완료
CMD로 도커 설치 완료까지 확인

 

1.5 도커를 사용할 때의 흐름

1. 도커 클라이언트(CLI)에 원하는 명령을 위한 명령어 입력

2. 도커 서버(도커 데몬)가 도커 클라이언트에 입력한 명령어를 전달받으면 명령어에 따른 이미지를 생성하고, 컨테이너를 실행함. 그리고 해당 컨테이너에서 애플리케이션을 실행

기본 개념을 익히기 위해 hello -world라는 프로그램을 도커 환경에서 실행해보기

 

hello-world 프로그램 실행 시 도커에서 일어나는 내부적인 처리 과정

  1. 도커 클라이언트에 명령어를 입력 -> 클라이언트에서 도커 서버로 요청 보냄
  2. 서버에서 hello-world라는 이미지가 로컬에 이미 다운로드돼 있는지 확인
  3. 기존에 내려받은 hello-world 이미지가 없기 때문에 'Unable to find image 'hello-world:latest' locally'라는 문구가 출력
  4. 도커 이미지가 저장된 도커 허브(Docker Hub)에서 hello-world 이미지를 가져오고, 로컬에 보관
  5. 이제 hello-world 이미지가 있으니 그 이미지를 이용해서 컨테이너 생성
  6. 생성된 컨테이너는 이미지에서 받은 설정이나 조건에 따라 프로그램 실행

 

 도커 클라이언트에 'docker run hello-world' 명령어 한 번 더 입력 시?

 

hello-world 이미지를 도커 허브에서 이미 내려받았기 때문에 캐시 보관 장소에 hello-world 이미지가 보관돼 있고,

보관된 hello-world 이미지를 이용해 컨테이너를 만든 후 프로그래을 실행하기 때문에

두 번 입력 시 'Unable to find image 'hello-world:latest' locally'라는 문구 없이 프로그램 바로 실행됨

 

1.6 도커와 기존 가상화 기술의 차이점

도커 기술은 갑자기 생겨난 것이 아닌, 이전의 기술들을 이용해 만들어진 기술이기 때문에 가상화 기술이 나오기 이전에는 어떠한 방식으로 서버를 사용했는지 보고, 기존의 가상화 기술은 어떠한 방식인지 볼 예정

가상화 기술이 나오기 전에 서버를 사용하던 방식

가상화 기술 등장 이전에는 한 대의 서버를 하나의 용도로만 사용 (비효율적)

-> 한 대의 서버에서 사용하고 남는 서버 공간은 방치, 하나의 서버에 하나에 운영체제, 하나의 프로그램만 운영

 

하이퍼바이저 기반의 가상화 기술

  • 가상화 기술이 나오기 이전의 비효율적인 면을 개선하기 이해 새롭게 출현
  • 논리적으로 공간을 분할하여 가상 머신(VM)이라는 독립적인 가상 환경에서 서버를 이용
  • 하이퍼바이저는 호스트 시스템에서 다수의 게스트 운영체제(OS)를 구동할 수 있게 하는 SW
  • HW를 가상화하면서 하드웨어와 각각의 가상 머신(VM)을 모니터링하는 중간 관리자

 

하이퍼바이저의 종류

 

좌: 네이티브 하이퍼바이저 / 우: 호스트형 하이퍼바이저

네이티브 하이퍼바이저

하이퍼바이저가 HW를 직접 제어 -> 자원을 효율적으로 사용

별도의 호스트 OS X -> 오버헤드가 적음

여러 HW driver를 세팅해야 하므로 설치가 어려움

 

호스트형 하이퍼바이저 

일반적인 SW처럼 호스트 OS 위에서 실행,

하드웨어 자원을 VM 내부의 게스트 OS에 에뮬레이트 하는 방식 

* 에뮬레이트(emulate): 한 시스템이 다른 시스템의 기능이나 행동을 모방하거나 재현하는 것

오버헤드가 크지만, 게스트 OS 종류에 대한 제약 X, 구현이 다소 쉬움

-> 구현이 쉬워 다수가 사용하는 가상 머신(VM)

호스트형 하이퍼바이저의 구조

하이퍼바이저에 의해 구동되는 가상 머신은 각 가상 머신마다 독립된 가상 하드웨어 자원을 할당받음

논리적으로 분리돼 있어 하나의 가상 머신에 오류가 발생 -> 타 가상 머신으로 오류가 퍼지지 X

 

Core1은 무조건  Core1 쪽에 있는 가상 머신에만 이용, Core 2는 Core2 쪽에 있는 가상 머신에만 이용

-> Cor1 쪽에서 에러 발생 시 Core2 쪽 가상 머신에는 영향 X

 

도커 vs 기존 가상화 기술(VM)

도커 컨테이너

  • 구동되는 애플리케이션은 컨테이너가 제공하는 격리 기능 내부에 샌드박스가 있음
  • 여전히 같은 호스트의 다른 컨테이너와 동일한 커널을 공유
  • 컨테이너 내부에서 실행되는 프로세스는 호스트 시스템(모든 프로세스를 나열할 수 있는 충분한 권한 O)에서 볼 수 있음
  • ex) 도커와 MySQL DB 컨테이너 함께 실행 시 -> 도커가 아닌 호스트의 일반 셸에서 ps-e grep MYSQL 명령어를 실행 시
  • 프로세스 표시
  • 컨테이너가 전체 OS를 내장할 필요 X -> 컨테이너가 매우 가볍고, 일반적으로 용량이 아주 작음

 

가상 머신

  • 가상 머신과 함께 가상 머신 내부에서 실행되는 모든 것은 호스트 OS or 하이퍼바이저와 독립돼 있음
  • 가상 머신 플랫폼은 특정 VM에 대한 가상화 프로세스를 관리하고 위해 프로시ㅔ스를 시작
  • 호스트 시스템은 하드웨어 자원의 일부를 가상 머신에 할당

 

도커 컨테이너 VS 가상 머신 차이점

  • 가상 머신은 시작 시각에 가상 머신 환경을 위한 커널을 부팅하고, os 프로세스 세트를 시작해야 함 -> 응용 프로그램만 포함하는 일반적인 컨테이너보다 VM의 크기를 훨씬 크게 만듦
  • 도커 컨테이너가 가상 머신보다 하이퍼바이저와 게스트OS가 덜 필요하기 때문에 더 가벼움
  • 컨테이너 방식에서는 애플리케이션 시행 시 호스트 OS 위에 애플리케이션의 실행 패키지인 이미지만 배포하면 됨
  • BUT, 가상 머신은 가상 머신을 실행하고 자원 할당 후 게스트 OS 부팅하고 애플리케이션 실행 -> 훨씬 복잡하고 무거움

더 자세한 도커 컨테이너

컨테이너 영역과 하드웨어 영역이 존재, 컨테이너들은 커널을 공유

이 때 컨테이너는 격리, 격리된 컨테이너에서 각각의 프로그램이 실행

도커 컨테이너 구조

컨테이너가 각 프로그램을 위해서 격리돼서 사용

Q. 도커 컨테이너는 어떻게 격리?

  1. 리눅스에서 쓰이는 Cgroup(control groups)과 네임스페이스(namespaces)에 대해 알기
  2. Cgroup과 네임 스페이스는 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널의 기능
  3. 도커 컨테이너 역시 리눅스 커널 기능 이용 -> 컨테이너와 CPU 등을 격리

Cgroup, 네임스페이스

  • Cgroup - CPU, 메모리, 네트워크 대역폭, HD I/O 등 프로세스 그룹의 시스템 리소스 사용량 관리                                    ex) 어떤 애플리케이션의 사용량이 너무 많을 시 -> 그 애플리케이션을 Cgroup에 배치 -> CPU와 메모리 사용                    제한
  • 네임스페이스 - 하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술로 별개의 독립된 공간을 사용하는 것처럼 격리된 환경을 제공하는 경량 프로세스 가상화 기술

도커 컨테이너의 구조

 

  • 커널은 다른 컨테이너와 공유하지만, 하나의 컨테이너는 다른 컨테이너와 격리되어 그 안에서 실행되는 프로세스를 작동시키기 위해 필요한 양에 맞는 하드디스크, 네트워크, RAM 등이 할당돼 있음
  • 격리된 컨테이너에서 프로세스를 작동시키는 데 필요한 양만큼 하드웨어를 할당할  수 있는 것은 리눅스 커널에 있는 Cgroup과 네임스페이스 기능을 이용하기 때문

 

1.7 도커 이미지로 도커 컨테이너 만들기

도커 이미지로 만드는 도커 컨테이너

 

도커 이미지는 응용 프로그램을 실행하는 데 필요한 모든 것을 포함

도커 이미지를 이용해 도커 컨테이너를 생성하고 애플리케이션을 생성

 

응용 프로그램을 실행하는 데 필요한 모든 것

응용 프로그램 실행 시 컨테이너가 시작될 때 실행할 명령어와 실행하고자 하는 프로그램을 구성하는 파일 스냅숏이 필요

 

01. 컨테이너가 시작될 때 실행할 명령어

ex) run kakaotalk

도커 이미지를 이용해 도커 컨테이너를 만들면 컨테이너 안에서 애플리케이션을 실행

따라서 컨테이너가 시작될 때 애플리케이션을 실행할 명령어가 필요

만약 run kakaotalk이란 명령어를 입력해 카카오톡 애플리키에션을 실행할 수 있다면 이 명령어를 이미지가 가지고 있어야 함

 

02. 파일 스냅숏 (디렉터리나 파일을 복사한 것)

카카오톡 애플리케이션을 실행 시 명령어가 필요하지만, 명령어만 있다면 결국은 카카오톡을 실행할 수 없음

명령어와 함께 카카오톡을 실행할 때 필요한 파일들도 이미지가 가지고 있어야 함.

도커 컨테이너가 생성되는 순서

01. 도커 클라이언트에 'docker run <이미지>' 명령어 입력

 

02. 도커 이미지에 있는 파일 스냅숏을 컨테이너에 있는 하드디스크로 옮김

(컨테이너 안에서 애플리케이션을 설치하고 실행해야 하므로 컨테이너로 이동시킴)

도커 이미지에서 도커 컨테이너로 파일 스냅숏 전달

 

03. 컨테이너가 실행될 때 명령어를 이용해 hello-world 애플리케이션을 실행

도커 이미지에서 도커 컨테이너 명령어 전달

 

04. 컨테이너가 실행될 때 명령어를 이용해 hello-world 애플리케이션을 실행

도커 컨테이너에서 애플리케이션 실행

 

 

1.8 Cgroup, 네임스페이스를 쓸 수 있는 이유

Cgroup과 네임스페이스는 리눅스 환경에서 사용되므로 윈도우, macOS 등의 환경에서도 컨테이너가 어떻게 격리되는지?

 

도커 컨테이너 구조

 

윈도우 환경에서 어떻게 Cgroup과 네임스페이스를 사용할 수 있는지?

01. 터미널 실행

02. 터미널에 'docker version' 명령어를 입력 후 서버 정보 확인

 

서버 정보 중 OS/Arch 부분 확인 시 linux/amd64라고 쓰여 있음

윈도우 환경에서 'docker version' 명령어 입력해 도커의 서버 정보 확인임에도 불구하고 OS가 linux로 나옴

-> 현재 사용하는 컴퓨터가 윈도우 환경이어도 도커 서버는 리눅스 VM 환경에서 실행되고 있기 때문

모든 컨테이너가 리눅스 가상 머신에서 실행되며, 리눅스 커널이 컨테이너를 격리시키고 리소스를 나눠줌

도커 컨테이너의 구조

 

 

 

 

 

 

 

 

 

 

'Docker' 카테고리의 다른 글

02 기본적인 도커 클라이언트 명령어  (0) 2024.04.04