도커를 쓰는 이유?
도커 없이 다운로드 받을 때는 Installer 다운로드 -> 실행 -> 에러 일 경우가 많다. Installer 자체가 외부(운영체제, 버전, 서버 등등)에 많은 영향을 받기때문에 하나하나 맞춰서 제대로 install 하는 게 어렵다. -> Docker를 통해 편하게 다운로드 가능하다.
도커는 무엇일까?
도커를 이해하기 위해서는 먼저 컨테이너에 대해 이해해야 한다.
- Container
- 다양한 프로그램, 실행환경을 컨테이너로 추상화해서 프로그램을 손쉽게 이동 배포 관리를 할수있게끔 해준다.
- 코드와 모든 종속성을 패키지화해서 응용프로그램이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는 소프트웨어의 표준 단위다.
도커 이미지
: 프로그램이 실행되는데 필요한 모든것 (설정이나 종속성들)을 포함하고 가볍고 독립적으로 실행가능한 소프트웨어 패키지를 뜻하며 이미지를 이용해서 컨테이너를 만든다.
- 컨테이너가 실행을 해서 그 안에서 프로그램이 돌아간다. -> “컨테이너는 이미지의 인스턴스” 이다.
- 이미지를 이용해서 컨테이너를 만든다.
도커 사용시 흐름
1
2
3
4
5
6
7
8
- 도커 클라이언트에서 command 입력해서 프로그램을 실행한다.
- docker가 초록불이어야지 도커 클라이언트에 명령어 입력이 가능하다.
- (EX Command) docker run -it hello-world
- 이미지 Cache 장소에서 명령어로 친 hello-world가 있는지 찾는다.
- 한번도 저장되지 않은 hello-world를 실행시키려 했기때문에 존재하지 않는다.
- 도커 허브(많은 이미지들이 보관되어져있음)에서 가지고 온다.
- pull 해서 실행시켜준다.
- 클라이언트에 입력해주면 중요한 일들은 서버가 다 처리해 프로그램을 실행시켜준다.
도커와 기존의 가상화 기술 비교를 통해 Container 심화버전 이해하기
- 가상화 전
- 하나의 서버를 하나의 용도로 사용했다. -> 안정적이나 비효율적이다.
- 하이퍼 바이저 기반의 가상화
- 호스트 시스템에서 다수의 게스트 OS 구동이 가능하다.
- 논리적으로 공간분리 가능해 다수의 게스트 OS로 사용이 가능하다.
- 네이티브 하이퍼 바이저
- 하드웨어 위에서 실행된다.
- 호스트형 하이퍼 바이저 (-> 주로 사용한다)
- 호스트 OS 위에서 실행된다.
- 오버헤드가 크지만 구현이 비교적 쉽다.
- 각 게스트 OS 마다 논리적으로 분리된 하드웨어 자원을 할당받기 때문에 서로 영향을 받지 않는다.
도커와 기존의 VM의 공통점
: 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치하는 방법이다.
도커와 기존의 VM의 차이점
: 얼마나 격리시키는 지에 차이가 있다.
- 도커
- 게스트OS 가 존재하지 않다. -> 가벼움
- 실행시에 호스트 OS에서 이미지 배포한다.
- 동일한 호스트 OS에서 다른 이미지들이 올라가는 것이기 때문에 같은 커널을 공유한다.
- VM
- 실행시에 vm 실행 -> 게스트 OS 실행 -> 어플리케이션 실행 -> 무겁다.
- 사용방법은 간단하다. 하지만 무거워서 느리다.
도커의 컨테이너들은 격리되어있는데 어떻게 격리시키는 건가요?
아래의 두 가지 기술을 통해 컨테이너들을 격리시키는 게 구현이 가능하며 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널 기능이다.
- C-group: CPU와 메모리의 사용을 제한해서 group 에 넣는다.
- 네임스페이스: 하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술, 프로세스 가상화 기술
이미지로 컨테이너 만들기
이미지로 컨테이너를 만든다. 그 이미지에는 프로그램 실행시 필요한 모든 것들이 들어있다.
- 컨테이너가 시작될때 실행되는 명령어
- 컨테이너 안에서 무언가를 실행하기 위해서는 명령어를 치는데 그 명령어를 인식하려면 이미 그 이미지 안에 그 명령어가 존재해야 한다.
- 파일 스냅샷(실행하고자 하는 디렉토리나 파일을 카피한 것)
- 이미지로 컨테이너를 만드는 순서
1 2 3
1. docker 클라이언트에서 docker run <이미지> 2. 이미지 안에 존재한 명령어와 파일 스냅샷이 컨테이너 안으로 들어간다. 3. 명령어를 사용하면 커널을 통해 내가 설정해놓은 파일 스냅샷 프로그램이 실행된다.
C-group, 네임스페이스를 도커환경에서 쓸 수 있는 이유
: 앞서 C-group과 네임스페이스는 리눅스 환경에서 쓰이는 기술이라고 했다. 하지만 나는 리눅스를 사용하지 않는데 어떻게 사용할 수 있는 것일까?
사실상 운영체제 위에 리눅스를 올린것이기 때문에 docker는 리눅스에서 사용되는 것이라고 보면된다.
현재 내 컴퓨터
1 2 3 4 5 6 7
리눅스 커널 | 리눅스VM | MacOS / Windows (운영체제) | 하드웨어
출처: 인프런, “따라하며 배우는 도커와 CI환경”, 따라하며 배우는 도커와 CI환경