일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- dockerfile
- EC2
- kernel
- asgi
- leetcode
- YAML
- K8S
- 자바스크립트
- ebs
- intervals
- IAC
- EKS
- github
- terraform
- asyncio
- POD
- AWS
- FastAPI
- IAM
- Python
- 쿠버네티스
- elasticsearch
- Django
- ansible
- Service
- Deployment
- event loop
- WSGI
- Kubernetes
- docker
- Today
- Total
궁금한게 많은 개발자 노트
[ Docker ] Docker란? 본문
AWS, k8s 서비스들을 이용하고 있지만 docker의 개념과 목적에 대해 정확히 정리를 한번 해야할 것 같아 작성하는 글
도커(Docker)는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다. 도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다.
IaC(infrastructure as Code)를 가능하게 해주는 서비스: Docker로 컨테이너를 관리하고 애플리케이션을 분리해주는 가상 공간이라 생각할 수 있지만 가장 큰 장점은 인프라를 코드화하여 관리할 수 있다는 점입니다.
그리고 Docker가 Container기술을 만든 것이 아니라, 기존에 존재하는 Container기술을 이용하여 Application에 필요한 환경을 신속하게 구축하고 테스트 및 배포할 수 있게 해주는 플랫폼입니다.
Docker Container란?
소프트웨어는 OS와 라이브러리에 의존성을 뛴다. 그러므로 하나의 컴퓨터에서 성격이 다른(OS,라이브러리 버전이 다른) 소프트웨어를 한번에 실행할 때 어려움을 가질 수 있고 관련된 구성을 관리하기가 어렵다. 컨테이너(Container)는 개별 Software의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술을 말합니다. 컨테이너는 애플리케이션을 실제 구동 환경으로부터 추상화할 수 있는 논리 패키징 메커니즘을 제공한다.
쉽게 말해 Host OS상에서 리소스를 논리적으로 구분하여 마치 별도의 서버인 것 처럼 사용할 수 있게 해주는 기술. 물리적으로 구분하지 않기 때문에 큰 비용없이 쉽게 없애고 다시 생성할 수 있기에 가볍다고 표현할 수 있습니다.
가상머신 VM또한 독립적인 실행환경을 구성할 수 있도록 지원하지만, 차이점으로는 VM은 Hypervisor에 의해 컴퓨터가 가지고 있는 인프라 리소스를 VM별로 배분하는 역할을 해준다. 또한 VM에서는 독립적인 Guest OS를 가지고 있다.
따라서 VM을 생성할 때 마다 OS를 만드는 작업을 반복해야 하며 확장성이 낮다. 추가적으로 메모리나 자원에 대해 유동적으로 관리되는 것이 아니라 VM 생성시에 정해지므로 비효율적일 수 있다.
컨테이너의 경우 하나의 Host OS위에서 마치 각각의 독립적인 프로그램처럼 관리되고 실행된다. 불필요한 OS만드는작업 및 Infra를 독립적으로 나눌 필요가 없어서 확장성이 좋고 빠르다.
여기서 Docker의 역할로는 인프라에서 애플리케이션을 분리하여 컨테이너로 추상화시켜 소프트웨어를 빠르게 제공 할 수 있습니다. 이는 주어진 Host OS안에서 여러 컨테이너를 동시에 실행할 수 있게해주고 Docker는 컨테이너들의 라이프사이클을 관리하고 어플리케이션을 서비스로 배포할 수도 있습니다.
예를들어 백엔드 서비스, DB 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있고 어느 환경에서든 실행이 가능하도록 해줍니다.
Docker의 동작 구조
Container라는 독립적인 환경을 만들기 위해 Linux 커널의 namespace와 cgroups라는 기능을 활용합니다.
VM은 OS자체를 가상화 해서 격리시킨다면, 도커 컨테이너는 Host OS 커널을 공유하며 단순히 하나의 격리되어 있는 프로세스로서 동작합니다. 그렇게 하기위해 위의 두가지 기술이 사용됩니다.
namspace: 프로세스를 독립시켜 주는 가상화 기술로 컨테이너에서 실행된 프로세스가 시스템(user, file, network, hostname, process ex) mnt, pid, net, ipc, uts, user)등에 대해 독립적일 수 있게 해줍니다.
cgroups: 컨테이너에 자원 할당을 관리하기 위한 기술. 프로세스는 하나 이상의 스레드를 가질 수 있는데, cgroups는 프로세스와 스레드를 그룹화하여 그 그룹 안에 존재하는 프로세스와 스레드 관리를 수행하기 위한 기능.
Host OS의 resource들에 대해 groups별로 제한 가능 ex) cpu, memory, I/O, network, device node
'DevOps' 카테고리의 다른 글
[ Ansible ] Ansible Vault (0) | 2023.01.08 |
---|---|
[ Ansible ] Ansible이란? (0) | 2023.01.07 |
[ AWS ] EC2 Instance Storage Section - 2 (0) | 2022.12.09 |
[ AWS ] EC2 Instance Storage Section (0) | 2022.12.08 |
[ AWS ] EC2 instance Purchasing Options (0) | 2022.12.08 |