Docker
Go 언어로 작성된 리눅스 컨테이너를 기반으로 하는 오픈소스 가상화 플랫폼이다.
- 컨테이너에 기술을 넣으면, 모든 기술들의 실행 방법이 다 같아진다.
- OS와 CPU에 상관없이 컨테이너를 사용 가능하다.
- Spring, Node.js, Django, Next.js 등등 관련 없이 컨테이너에만 넣으면 모두 동일하게 실행이 가능하다.
- 컨테이너를 삭제하면 내부의 데이터가 모두 삭제되기 때문에 중요한 데이터는 외부 스토리지에 저장이 필요하다.
가상화를 사용하는 이유
- 활용도가 낮은 서버들이 존재한다면 CPU 측면에선 리소스 낭비일 수밖에 없다.
- 그렇다고 해서 모든 서비를 한 서버 안에 올리면 안전성에 문제가 생길 수도 있다.
- 그래서 안전성을 높이면서 리소스도 최대한 활용할 수 있는 방법으로 서버 가상화가 나타나게 됐다.
컨테이너(Container)
논리적인 공간(컨테이너)을 만들어 다양한 어플리케이션을 설치해 하나의 서버처럼 사용할 수 있는 패키지
한 마디로 하나의 공간(컨테이너)에 다양한 물건들을 담아서 옮기면, 옮긴 곳에서 그 물건들을 사용할 수 있게 되는 것과 같다.
각 서버에서 컨테이너를 구동해 그 안에 존재하는 어플리케이션을 별도의 설정 없이 쉽게 사용할 수 있다.
컨테이너를 왜 사용하는가?
개발을 하기 위해 하나의 환경을 구축하기란 간단하지 않다.
- 서버가 있어야 되고
- OS를 구축해야 하며
- 개발을 위한 네트워크 통신 포트 구성과
- 개발 툴들의 설치
- 서로의 연동 환경 구성 등등...
이런 환경을 매번 일일이 설치하기란 반복적인 일들을 여러 번 해야 하는 것은 물론, 환경 구성이 잘못되거나 에러가 발생하면 처음부터 다시 해야한다는 불편함이 존재한다.
이런 반복적이고 불편한 세팅을 한 번 해놓고, 쉽게 그 설정을 배포하기 위해 우리는 컨테이너를 사용한다.
컨테이너 오케스트레이션(Container Orchestration)
여러 대의 서버와 여러 개의 서비스를 관리하여 자동화 하는 기술
대표적인 예시로는 kubernetes가 있다.
- 스케줄링
: 컨테이너를 스케줄링해서 가상 머신에 배치하는 역할을 한다. 배치시 컨테이너 스택에 매칭되는 가상 머신을 자동으로 선택하고, 문제 발생시 자동으로 다시 배치를 한다고 할 수 있다.
- 서비스 디스커버리
: 수많은 컨테이너들이 생성과 종료를 반복한다. 이 때 매번 IP, Port 정보를 알 수가 없기 때문에 이를 자동으로 매칭한다.
Docker Swarm
Docker에서 개발한 컨테이너 오케스트레이션 툴이다.
- 기능이 단순하여 쉽게 사용 가능하나
- 대용량 분산 환경과 같은 복잡한 시스템에서는 적합하지 않아 Kubernetes를 많이 사용한다.
Kubernetes
Google에서 개발한 컨테이너 오케스트레이션 툴이다.
- 대규모 분산 환경에 최적화된 기능을 제공한다.
- 넓은 생태계가 구축이 되어 있다.
Docker의 기초 개념
Docker는 Immutable Infrastructure(불변 인프라) 패러다임을 실현하는 기술로, 서버 구축 후에는 변경이 불가능하다. 따라서, 변경이 필요하다면 삭제 후 다시 구축을 해야 한다.
- Image
: image는 프로그램이라고 생각하면 된다. image layer들의 집합으로 image를 만들기도 가능하다. 읽기만 가능(read-only)하고 변할 수 없다.(immutable)
- Container
: container는 프로세스라고 생각하면 된다. 쓰기가 가능하며, 휘발성으로 메모리에 상주한다.
- Dockerfile
: instruction set으로 도커 이미지를 만드는 설명서라고 생각하면 좋다.
- Registry
: Github와 같은 이미지 저장소이고, 대표적인 public registry로 DockerHub가 있다.
Docker Compose
여러 개의 컨테이너로부터 이루어진 서비스를 구축, 실행하는 순서를 자동으로 하여, 관리를 간단히 하는 기능
Docker Compose에서는 compose 파일을 준비하여 커맨드를 1회 실행하는 것으로, 그 파일로부터 설정을 읽어들여 모든 컨테이너 서비스를 실행시키는 것이 가능하다.
Docker Compose를 사용하기까지의 주요한 단계
- 각각의 컨테이너의 Dockerfile을 작성한다.(기존 이미지를 사용하는 경우는 필요하지 않음)
- docker-compose.yml를 작성하고, 각각 독립된 컨테이너의 실행 정의를 실시(경우에 따라는 구축 정의도 포함)
- "docker-compose up" 커맨드를 실행하여, docker-compose.yml으로 정의한 컨테이너를 개시
Docker Compose는 start, stop, status, 실행 중의 컨테이너의 로그 출력, 약간의 커맨드 실행이과 같은 기능도 가지고 있다.
docker-compose.yml
yaml으로 Docker 컨테이너에 관한 실행 옵션(build 옵션도 포함되어 있는 경우도 있음)을 기재한 파일이다.
yaml
yaml 문법으로 작성한다는데 모르는 문법이라 또 찾아봤다.
yaml 문법은 들여쓰기와 함께 key, value를 중심으로 작성된다.
해당 문법은 기본적으로 숫자형, 문자형, Boolean 자료형을 지원한다.
기본 문법
- # : 해당 라인을 주석처리
- --- : 문서의 시작을 알림(옵션)
- ... : 문서의 끝을 알림(옵션)
- key : 딕셔너리 자료형의 key 값과 동일 개념
- value : 딕셔너리 자료형의 value 값과 동일 개념
참고한 글
https://han-py.tistory.com/494
사실 공부하면서 정리한 거라 이 글 저 글 많이 참고하고 갖고 왔지만... 많은 도움이 됐다 생각하는 글의 링크를 첨부합니다.