가상 머신(Virtual Machine)
가상 머신(Virtual Machine, VM)은 물리적 컴퓨터에서 소프트웨어로 구현된 독립적인 운영 체제 환경을 말합니다. 이는 하이퍼바이저(Hypervisor)라는 소프트웨어 계층을 통해 하드웨어 자원을 가상화하여 여러 개의 운영 체제(OS)를 하나의 물리적 호스트에서 실행할 수 있도록 합니다.
하이퍼바이저(Hypervisor): 가상 머신을 생성하고 관리하는 소프트웨어(하드웨어 자원을 가상화하여 여러 가상 머신이 자원을 공유할 수 있게 함)
그러나, 각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 하이퍼바이저를 반드시 거치기 때문에 일반 호스트에 비해 성능의 손실이 발생합니다.
그 뿐만 아니라, 가상 머신은 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 가상 머신을 배포하기 위한 이미지로 만들었을 때 최소 GB 단위의 공간이 필요하며, 가상 머신 수에 비례해서 늘어납니다.
컨테이너(Contanier)
컨테이너는 애플리케이션의 코드, 라이브러리 및 기타 종속 구성 요소를 포함하는 소프트웨어 코드 패키지입니다. 컨테이너화를 통해 애플리케이션을 이동 가능하도록 만들어 모든 디바이스에서 동일한 코드를 실행할 수 있습니다. 이는 운영체제 수준에서의 가상화를 통해 이루어지며, 애플리케이션의 배포, 관리, 확장을 더 쉽게 하고 효율적으로 만듭니다.
도커(Docker): 가장 널리 사용되는 컨테이너 플랫폼으로, 컨테이너의 생성, 배포, 관리 기능을 제공
컨테이너는 운영체제 커널을 공유하기 때문에 가상 머신보다 훨씬 가벼우며, 더 빠르게 시작되고 종료될 수 있습니다.
가상 머신과 컨테이너
가상 머신
- 호스트 운영체제 위에 가상화된 하드웨어 계층을 생성
- 각 VM은 독립된 운영체제, 커널, 드라이버 등을 가져서 무거움
- 운영체제의 부팅 과정이 필요하므로 로딩 시간이 오래 걸림
- 독립된 운영체제를 가지므로 메모리, 디스크 공간 등 자원을 많이 소비
컨테이너
- 호스트 운영체제의 커널을 공유하며 프로세스 단위의 격리 환경 조성
- 가볍게 격리된 환경을 생성하여 VM보다 더 가벼우며 효율적으로 실행
- 이미지와 컨테이너 레이어를 사용하여 빠르게 생성되며, 실행 속도가 매우 빠름
- 호스트 운영체제의 커널을 공유하므로 가볍고 효율적으로 자원을 활용
정리하자면,
컨테이너는 프로세스 단위의 격리 환경을 조성하고 있어 상호 간의 의존도를 낮추어 줍니다. 또한 VM에 비해 사이즈가 작아서 배포가 빠르고 성능 손실이 거의 없습니다.
다양한 컨테이너 런타임 기술(컨테이너를 생성, 관리하는 플랫폼)이 존재하지만 단연 그중에 도커(Docker)가 사실상 표준으로 여겨지고 있습니다.
도커(Docker)
도커(Docker)는 애플리케이션을 더 쉽게 개발, 배포, 실행할 수 있도록 해주는 오픈소스 가상화 플랫폼입니다. 도커를 사용하면 애플리케이션과 그에 필요한 환경을 격리된 공간인 컨테이너에 패키징하여 실행, 관리할 수 있습니다.
도커 아키텍처는 애플리케이션의 컨테이너화를 가능하게 하는 여러 구성 요소로 이루어져 있습니다. 이 아키텍처는 도커 클라이언트, 엔진, 레지스트리 등의 주요 구성 요소를 포함합니다.
도커 아키텍처
1. 도커 클라이언트(Docker Client)
- 사용자가 도커와 상호작용할 수 있는 명령줄 인터페이스로, 사용자는 도커 클라이언트를 통해 컨테이너를 생성하고 관리할 수 있습니다.
2. 도커 데몬(Docker Daemon)
- 도커 엔진의 백그라운드 프로세스로, 컨테이너의 생성, 실행, 중지, 삭제 등을 관리합니다.
- 도커 클라이언트와 REST API를 통해 통신하며, 호스트 시스템의 리소스를 관리하고 컨테이너를 실행합니다.
3. 도커 이미지(Docker Image)
- 애플리케이션과 그 실행 환경을 포함하는 읽기 전용 템플릿입니다.
- 이미지는 여러 레이어로 구성되어 있으며, 각 레이어는 파일 시스템의 스냅샷을 나타냅니다.
- 생성: Dockerfile을 사용하여 이미지를 빌드할 수 있습니다.
- 저장: 이미지는 도커 레지스트리에 저장될 수 있으며, 필요할 때마다 가져와서 사용할 수 있습니다.
4. 도커 컨테이너(Docker Container)
- 도커 컨테이너는 도커 이미지를 실행한 상태로, 애플리케이션의 실행 환경을 제공합니다.
- 컨테이너는 이미지의 인스턴스라고 할 수 있습니다.
- 각 컨테이너는 독립된 네임스페이스, cgroups를 통해 격리된 환경에서 실행됩니다.
5. 도커 레지스트리(Docker Registry)
- 도커 레지스트리는 도커 이미지를 저장하고 배포하는 저장소입니다.
- 도커 허브(Docker Hub)와 같은 퍼블릭 레지스트리가 있으며, 프라이빗 레지스트리도 설정할 수 있습니다.
- 도커 허브(Docker Hub): 가장 널리 사용되는 퍼블릭 레지스트리로, 수많은 도커 이미지를 호스팅하고 있습니다.
- 프라이빗 레지스트리: 기업 내부에서 이미지를 공유하기 위해 설정할 수 있습니다
도커 동작 원리
1. 이미지 빌드
- Dockerfile을 작성하고 docker build 명령어를 사용하여 이미지를 빌드합니다.
- 빌드된 이미지는 로컬 이미지 저장소에 저장됩니다.
2. 이미지 배포
- 이미지를 도커 레지스트리에 푸시(docker push)하여 다른 사용자나 시스템에서 접근할 수 있게 합니다.
3. 컨테이너 실행
- 도커 클라이언트에서 docker run 명령어를 사용하여 컨테이너를 실행합니다.
- 도커 데몬이 이미지를 가져와 컨테이너를 생성하고, 필요한 자원을 할당하여 애플리케이션을 실행합니다.
4. 컨테이너 관리
- 실행 중인 컨테이너는 docker ps 명령어로 확인할 수 있으며, docker stop, docker rm 등의 명령어로 중지 및 삭제할 수 있습니다.
도커 기본 명령어
- docker run: 새 컨테이너를 생성하고 실행합니다.
예: docker run -d -p 8080:80 nginx - docker stop: 실행 중인 컨테이너를 중지합니다.
예: docker stop <container_id> - docker start: 중지된 컨테이너를 다시 시작합니다.
예: docker start <container_id> - docker restart: 컨테이너를 재시작합니다.
예: docker restart <container_id> - docker rm: 컨테이너를 삭제합니다.
예: docker rm <container_id> - docker rmi: 이미지를 삭제합니다.
예: docker rmi <image_name> - docker pull: Docker Hub 또는 다른 레지스트리에서 이미지를 다운로드합니다.
예: docker pull nginx - docker push: 이미지를 Docker Hub 또는 다른 레지스트리에 업로드합니다.
예: docker push <username>/<image_name> - docker images: 로컬 시스템에 있는 이미지 목록을 보여줍니다.
- docker ps: 실행 중인 컨테이너 목록을 보여줍니다. -a 옵션을 추가하면 중지된 컨테이너를 포함한 모든 컨테이너를 보여줍니다.
예: docker ps - docker logs: 컨테이너의 로그를 출력합니다.
예: docker logs <container_id> - docker exec: 실행 중인 컨테이너 내부에서 명령어를 실행합니다.
예: docker exec -it <container_id> /bin/bash - docker build: Dockerfile을 사용하여 이미지를 생성합니다.
예: docker build -t <tag_name> . - docker network: Docker 네트워크 관련 명령어들입니다.
예: docker network ls, docker network create - docker volume: Docker 볼륨 관련 명령어들입니다.
예: docker volume create, docker volume inspect - exit : 빠져나오기
참고자료
https://born-dev.tistory.com/39
https://aws.amazon.com/ko/compare/the-difference-between-containers-and-virtual-machines/
https://www.samsungsds.com/kr/insights/220222_kubernetes1.html
https://www.codestates.com/blog/content/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4
'AWS 클라우드' 카테고리의 다른 글
VPC(Virtual Private Cloud)란? / VPC 및 서브넷(Subnet) 구성 실습 (0) | 2024.11.21 |
---|---|
AWS EC2 인스턴스 생성, 웹 사이트 배포 및 인스턴스 유형 (0) | 2024.11.21 |
AWS 기반 통합 로그 모니터링 및 대응방안 이해 (0) | 2024.06.18 |
AWS 주요 서비스 분석 (0) | 2024.06.18 |
AWS 환경에서의 ISMS-P 보안 (0) | 2024.05.24 |