데브옵스 / 도커
IT 로드맵의 데브옵스 / 도커 구역이다.
Docker · CI/CD · 배포 · 모니터링 · 인프라
짓기 단위 — 설계한 도서관을 어느 땅에 몇 채 세우나
백엔드의 크기의 단위에서 크기를 세 줄로 갈랐다 — 실행 · 설계 · 짓기. 설계 단위는 도서관(앱 하나)에서 끝나고, 이 구역은 그 도서관을 실제로 세우는 짓기 단위를 맡는다.
| 크기 | 개발에서 | 도서관으로 | 여기서 고르는 것 |
|---|---|---|---|
| 이미지 | Docker 이미지 | 공장에서 찍어 내는 도서관 꾸러미 — 책 상자 · 배치표 · 기본 비품 | 세트에 무엇을 넣나 (Dockerfile) |
| 컨테이너 | 실행 중인 컨테이너 | 그 꾸러미로 실제로 세운 도서관 한 채 | 같은 도서관을 몇 채 세우나 |
| Pod | 쿠버네티스 Pod | 한 필지에 붙여 지은 본관과 별관. 마당과 수도를 같이 쓴다 | 무엇을 꼭 붙여서 세우나 |
| 노드 | 서버 한 대 | 필지 한 칸. 전기 · 수도 인입(커널)을 그 위 도서관들이 같이 쓴다 | 어느 땅에 세우나 |
| 클러스터 | 서버 여러 대 + 쿠버네티스 | 단지 터 전체와 관리사무소 | 관리사무소에 「주문 도서관 3채 유지」라고 적어 두면, 무너진 채를 알아서 다시 세운다 |
설계의 「단지 계획」과 짓기의 「단지 터」는 다른 질문이다
- 단지 계획(설계): 도서관을 몇 종류 짓나 — 모놀리스 · 모듈러 모놀리스 · 마이크로서비스
- 단지 터(짓기): 그 도서관들을 어느 땅에 몇 채 세우나 — 컨테이너 개수, 노드 배치
그래서 모놀리스도 컨테이너 여러 개로 돌릴 수 있다. 도서관 종류가 하나여도 세우는 채 수는 셋일 수 있다. 쿠버네티스가 하는 일은 단지 계획을 단지 터에 배치하는 것이다.
아래 그림은 두 경우를 나란히 놓았다. 위는 앱 한 종류(모놀리스)를 세 채로, 아래는 앱 두 종류(마이크로서비스)를 두 채씩 띄운다. 같은 색 상자는 같은 이미지에서 찍어 낸 채다. 색의 가짓수는 설계가 정하고, 상자 개수와 자리는 짓기가 정한다.
컨테이너는 운영체제가 치는 칸막이다
컨테이너는 Docker가 새로 만든 것이 아니다. 리눅스 커널이 원래 가진 칸막이 기능을 쓰기 쉽게 묶은 것이다. 칸막이는 두 종류다.
- 네임스페이스 — 무엇이 보이나를 가른다. 컨테이너 안에서는 자기 것만 보인다
- cgroup — 얼마나 쓰나를 가른다. 컨테이너마다 쓸 수 있는 양을 정한다
그런데 그 칸막이가 가르는 것이 하드웨어 & OS 구역의 다섯 분야와 거의 그대로 겹친다.
| 하드웨어 & OS 분야 | 커널의 칸막이 | 컨테이너에서 |
|---|---|---|
| 계정과 권한 | user 네임스페이스 (CLONE_NEWUSER) |
컨테이너 안의 사용자를 바깥과 따로 둔다 |
| 파일과 디렉터리 | mount 네임스페이스 (CLONE_NEWNS) |
컨테이너마다 보이는 파일 트리가 따로다 |
| 프로세스 | pid 네임스페이스 (CLONE_NEWPID) |
컨테이너 안에서는 자기 프로세스만 보인다 |
| 메모리 | 메모리 cgroup (memory.max) |
컨테이너마다 쓸 수 있는 메모리 양을 제한한다 |
| 네트워크 | net 네임스페이스 (CLONE_NEWNET) |
컨테이너마다 주소와 포트가 따로다 |
그래서 하드웨어 & OS가 이 구역의 선수 과목이다. 거기서 다섯 분야를 익혀 두면, 컨테이너는 「이미 배운 다섯 가지에 칸막이를 친 것」으로 읽힌다.
확인한 것과 안 한 것 — 표의 네 네임스페이스 이름은 이 저장소에 받아 둔 리눅스 커널 소스(7.3-rc4)의
include/uapi/linux/sched.h20 · 31 · 32 · 33줄에, 메모리 상한memory.max는mm/memcontrol.c에 실제로 있다. Docker가 컨테이너를 띄울 때 이 다섯을 실제로 다 쓰는지는 Docker 소스를 열어 보지 않아 확인하지 않았다. 커널에는 이 밖에도 uts · ipc · cgroup · time 네임스페이스가 더 있다.
비교해 두는 것 — 가상머신
| 도서관으로 | 무게 | |
|---|---|---|
| 컨테이너 | 한 땅 위에 여러 채. 전기 · 수도 인입을 같이 쓴다 | 가볍고 빨리 선다 |
| 가상머신 | 도서관마다 땅 · 기초 · 발전기를 따로 갖춘다 | 무겁다 |
프론트엔드는 이 짓기 단위를 따르지 않는다
백엔드는 우리 땅에 도서관을 세우고 손님이 찾아온다. 프론트엔드는 조립식 가구를 택배로 보내 손님 집(브라우저)에서 조립한다. 그래서 정적 파일만 있는 프론트에는 대개 컨테이너와 쿠버네티스가 필요 없다. 그 이야기는 프론트엔드 구역에 둔다.
아직 확인하지 않았다
짓기 단위 표의 Docker · 쿠버네티스 사실(컨테이너는 서버의 커널을 같이 쓴다, Pod 안의 컨테이너는 네트워크와 저장소를 같이 쓴다, 쿠버네티스는 적어 둔 상태를 유지한다)은 원본을 열어 확인하지 않았다. 칸막이 표는 커널 쪽만 확인했다. 이 구역을 공부할 때 하나씩 확인하고 고친다.