1. Docker
1) Docker 의 등장
- VM Based Host: Bare metal 시스템에 Hypervisor의 소프트웨어 적인 기술을 토대로 Virtual Machine을 만들었다.
- Container: 서비스 중단 없이 애플리케이션을 운영하기 위해 Bare metal 시스템에 Container Engine (Docker)를 올리고 그 위에 Container Application을 운영한다.
- Isolate된 공간 안에서 적은 용량의 프로그램이 실행되어 높은 확장성, 적은 용량, 배포가 매우 용이하다.
- Conainer안에 라이브러리, 소프트웨어 플랫폼(nodejs,java) 등을 미리 넣어두고 독립된 환경을 만든다.
2) Docker의 장점
- 개발자가 만든 프로그램을 어디서든 실행할 수 있다.
- 유연한 스케일 아웃/인 → MSA, Devops 환경에 적합하다.
2. Container
1) Container 란?
- 컨테이너는 하나는 Application 프로세스이다.
- Application들이 독립된 공간에서 분리되어 운영된다.
- CPU, Memory, Network, Disk 등이 모두 독립적으로 운영된다.
- 리눅스 커널을 갖고 있는 OS(Windows, Linux, Mac OS) 에 Docker를 설치해서 Docker Daemon을 실행시킨다. → 이 환경을 Docker Host라고 부른다.
2) Container Image란?
- Container Image는 여러 개의 Layer로 되어 있다.
- Container Image는 하드디스크에 파일 형태로 저장되어 있다.
- Container를 실행하면 메모리에 하나의 Application Process로 Running 된다.
- Docker 명령어 예시
- docker search nginx → Docker Hub에서 nginx 이미지가 있는지 확인한다.
- docker pull nginx:latest → Docker Hub에서 nginx 이미지를 가져온다.
3) 리눅스에서 컨테이너를 사용하는 이유
- Linux Kernal 기능을 사용하여 컨테이너를 만들었기 때문에 리눅스를 사용한다.
- Linux Kernal 기능
- chroot: 독립된 공간 형성
- namespace: 6가지의 독립된 isolate 기능 지원
- cgroup: 필요한 만큼 HW 지원
- 컨테이너 엔진(ex. Docker)을 통해 Linux Kernal에 있는 Storage, Namespace, Networking 등의 기능을 컨테이너 플랫폼에서 쓸 수 있게한다.
- Windows or Mac os에서는 Linux Kernal이 없음으로 시스템의 Hypervisor 기능을 활성화해야 Docker 를 사용할 수 있다.
4) 일반적인 프로그램과 컨테이너의 차이점
- 일반 프로그램과 컨테이너의 하는 일은 동일하나 생긴 모양이 다르다.
예제 1. 일반적인 프로그램
- 웹 서비스를 Node.js 기반의 코드로 만든 예제
- 이 프로그램을 실행하기 위해서는 Linux OS + Node.js 설치 필요
- node app.js 로 실행
# cat app.js
const http = require('http');
const os = require('os');
console.log("Test server starting...");
var handler = function(req, res) {
res.writeHead(200);
res.end("Container Hostname: + os.hostname() + "\n");
var www = http.createServer(handler);
www.listen(8080);
예제 2. 컨테이너
- 위와 동일한 예제
- Dockerfile을 통해 container build 진행
- node라는 환경 설치
- 생성해둔 app.js 실행
# cat Dockerfile
FROM node:12
COPY app.js /app.js
ENTRYPOINT ["node", "app.js"] 4
참고
'Container > Kubernetes' 카테고리의 다른 글
[Kubernetes] AKS 클러스터 노드 접속 방법 (0) | 2024.03.07 |
---|---|
[AKS] Azure Key Vault Provider for Secrets Store CSI Driver 테스트 (0) | 2024.01.22 |
[Kubernetes] Network Policy 개념 및 적용 방법 (0) | 2024.01.09 |
[Kubernetes] Helm을 사용하여 Nginx Ingress 설치 (0) | 2024.01.02 |
[Kubernetes] 서로 다른 Namespace에 있는 서비스로 Nginx Ingress 설정 (0) | 2024.01.02 |