티스토리 뷰
Docker란?
도커는 컨테이너 기술을 기반하여 만든 오픈소스 가상화 플랫폼입니다. (도커 ≠ 컨테이너)
컨테이너?
사전적 의미
- 화물을 담아 나르기 위해 주로 쓰는, 쇠로 만들어진 큰 상자.
기술적 의미
- 이미지 목적에 따라 생성되는 프로세스 단위의 독립 환경입니다.
- 환경을 제공하며 프로세스의 생명주기를 관리합니다.
왜 컨테이너를 사용할까요?
HOST와 격리를 통하여 독립된 개발환경을 보장하기 위해 사용합니다.
컨테이너의 역사
FreeBSD Jail
오픈소스 Unix인 FreeBSD의 기술입니다.
특징
- 프로세스의 구획화
- 네트워크의 구힉화
- 파일 시스템의 구획화
(구획이란? 경계를 갈라 정하는 것 또는 그 구역)
Solaris Containers
Oracle의 상용 Unix인 Solaris 의 기술입니다.
특징
- Solaris 존 기능
- Solaris 리소스 매니저 기능
Linux Containers (LXC)
Linux 커널의 컨테이너 기능을 이용하기 위한 툴이나 API를 제공합니다.
가상화??
하나의 물리적 서버 호스트에서 여러개의 서버 호스트를 게스트로 실행할 수 있게 해주는 소프트웨어 아키텍쳐
이런 서버 가상화를 구현해주는 기술이 바로 Hypervisor
이라고 합니다.
하이퍼바이저는 하나의 호스트 OS 위에 여러 개의 게스트 OS를 사용할 수 있게 도와주고 또한 이렇게 생성된 게스트OS는 각각 가상머신
이라는 단위로 구별됩니다.
하이퍼바이저는 게스트 운영체제를 실행하고 관리할 수 있게끔 돕는 역할과 호스트 머신들이 자원들을 VM들에게 분배할 수 있도록 도와주는 역할을 합니다.
위 그림을 보면 하이퍼바이저와 컨테이너의 방식은 유사해보이지만 큰 차이는 아래와 같습니다.
VM
은 호스트 os 위에 게스트 os 가 구동되기 때문에 이미지로 만들 때 무겁고 가상화 작업에서는 무조건 하이퍼바이저를 거쳐야합니다.
컨테이너
는 애플리케이션을 구동하는 데 필요한 라이브러리 및 실행 파일만 존재하기 때문에 가볍고 이식성이 좋습니다.
다시 강조하지만 컨테이너 ≠ 도커는 아닙니다.
도커의 기능
- 이미지를 만듬 (Build)
- 이미지를 공유 (Ship)
- 컨테이너를 작동 (Run)
이미지를 만드는 기능 - Build
애플리케이션의 실행에 필요한 프로그램 본체, 라이브러리, 미들웨어 , OS나 네트워크 설정 등을 하나로 모아서 이미지로 만듭니다.
즉, 실행환경에서 움직이는 컨테이너의 바탕이 됩니다.
도커에서는 하나의 이미지 - 하나의 애플리케이션
만 넣어두는 것을 권장합니다.
이미지는 겹쳐서 사용할 수 있기 때문에 OS 용 이미지에 웹 애플리케이션용 이미지를 겹쳐 다른 새로운 이미지 또한 만들 수 있습니다. ( 변경한 부분(이미지 레이어) 차분으로 관리합니다)
이미지를 공유하는 기능 - Ship
이미지는 Docker 레지스트리(ex. docker hub) 에서 공유할 수 있습니다.
깃허브와 연계하여 dockerfile을 관리하고 자동으로 docker 이미지를 생성하여 hub 에 공개하는 것도 가능합니다.
컨테이너를 작동시키는 기능 - Run
Linux 상세어 컨테이너 단위로 서버 기능을 작동시킵니다.
vm 같은 경우 서버 기능을 실행시키려면 os 의 실행 부터 해야하기 때문에 오래 걸리지만
도커는 이미 동작되는 os 상에서 프로세스를 실행시키는 것과 같은 속도로 빨리 실행 시킬 수 있습니다.
하나의 Linux 커널을 여러 개의 컨테이너에서 공유하고 있습니다.
Linux 커널 기능 기술 (namespace, cgroups 등) 을 사용하여 컨테이너를 독립된 공간으로서 관리할 수 있습니다.
Docker 컴포넌트
Docker Engine
도커의 이미지를 생성하고 컨테이너를 가동시키기 위한 핵심 기능입니다.
Dokcer Registry
도커 이미지를 공개 및 공유하기 위한 레지스트리 기능입니다.
실제 도커 공식 레지스트리 서비스인 도커 허브도 이 도커 레지스트리를 사용하고 있습니다.
Docker Compose
여러 개의 컨테이너로부터 이루어진 서비스를 구축, 실행하는 순서를 자동으로 하여, 관리를 간단히하는 기능입니다.
Docker Machine
더이상 지원되지 않습니다. https://docs.docker.com/machine/
Docker Swarm
여러 도커 호스트를 클러스터화 하기 위한 툴입니다. → 쿠버네티스와 비슷
도커의 작동 구조
도커는 Linux 커널의 기술이 베이스로 되어 있습니다.
컨테이너를 구획화하는 장치 (namespace)
도커가 컨테이너라는 독립된 환경을 만들고 그 컨테이너를 구획화하여 어플리케이션의 실행 환경을 만들 수 있도록 하게끔 해준 기술입니다.
개념
한 덩어리의 데이터를 이름을 붙여 분할함으로써 충돌 가능성을 줄이고, 쉽게 참조할 수 있게 함
독립된 환경
- PID
- Network
- UID
- MOUNT
- UTS
- IPC
릴리스 관리 장치 (cgroups)
도커가 물리 머신의 자원을 여러 컨테이너가 공유하여 작동할 수 있게 하게끔 해준 기술입니다.
→ 예를 들면, 어떤 컨테이너가 호스트 os 의 자원을 모두 사용해 다른 컨테이너의 영향을 주는 일을 막아줌.
cgroups의 부모자식 관계에서는 자식이 부모의 제한을 물려받습니다.
네트워크 구성
서버의 물리 NIC가 docker0 이라는 가상 브리지 네트워크로 연결됩니다. (docker0 은 기본 값입니다)
도커 컨테이너와 외부 네트워크가 통신을 할 때는 가상 브리지 docker0 과 호스트 os 의 물리적 NIC에서 패킷을 전송하는 장치가 필요합니다. → NAPT 기능 사용
도커 이미지의 데이터 관리 장치
데이터를 복사하고 변경이 없다면 그 복사는 쓸데 없이 점점 공간 낭비가 발생하는 문제가 있습니다.
하지만 도커는 복사를 요구받아도 바로 복사하지 않고 원래 데이터를 그대로 참조시켜, 원본 또는 복사 어느 쪽에 수정이 가해진 시점에 비로소 새로운 빈 영역을 확보하고 데이터를 확보합니다.
→ Copy on Write
라고 부릅니다.
위 방식으로 도커는 컨테이너의 이미지를 관리합니다.
이미지를 관리하는 스토리지 디바이스
- AUFS
- Btrfs → 롤백, 스냅샷 기능
- Device Mapper
- OverlayFS
📍 궁금했던 것들
왜 하필 도커?
주관적인 생각
편리성
클라우드와 친화적
거대한 커뮤니티
이식성
등등..
많은 장점들로 하여금 사용하지 않았을까요?
Linux 커널 기능 - namespace, cgroups ?
구글링
커널 →컴퓨터 자원을 관리
namespace ?
→ 프로세스를 실행할 때 시스템의 리소스를 분리해서 실행할 수 있도록 도와주는 기능
쉽게 말해 한 덩어리 데이터를 네이밍하여 서로 충돌을 방지하고 쉽게 참조할 수 있게 해주는 기능입니다.
cgroups ?
→ 프로세스들이 사용할 수 있는 컴퓨터 자원을 제한하고 격리시켜주는 기능
제한 가능한 자원리스트
- 메모리
- CPU
- 네트워크
- 장치
- I/O
'인프라 > Docker' 카테고리의 다른 글
[Docker] Dockfile을 이용하여 이미지 만들기 - centos , nginx (0) | 2022.02.25 |
---|
- Total
- Today
- Yesterday
- Spring Boot
- 프로토콜
- dto
- 회고록
- SpringBoot
- 삽질
- lambda
- 자바
- 네트워크
- 스위치
- 프로그래머스
- tcp
- 개발자
- 라우팅
- aws
- s3
- spring
- ec2
- 계층
- Docker
- rds
- .NET
- java
- 라우터
- 초보
- 개발
- osi7계층
- 알고리즘
- 회고
- 3Way Handshake
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |