컨테이너와 가상화
가상화
서버, 스토리지, 네트워크 및 기타 물리적 시스템에 대한 가상 표현을 생헝하는데 사용할 수 있는 기술, 물리적 자원을 추상화하는 기술
- 가상 소프트웨어는 물리적 하드웨어 기능을 모방하여 하나의 물리적인 컴퓨터에서 여러 대의 가상 시스템을 동시에 실행한다.
- 기업은 가상화를 사용해 하드웨어 리소스를 효율적으로 사용하여 투자 대비 이익을 더 많이 얻을 수 있고 클라우드 컴퓨팅 서비스를 지원하여 조직의 인프라를 더욱 효율적으로 관리할 수 있다.
가상화의 이점
- 효율적인 리소스 사용
- 자동화된 IT 관리
- 신속한 재해 복구
가상화 서비스
- 서버 가상화
- 스토리지 가상화
- 네트워크 가상화
- SDN(Software-Defined Networking) : 물리적 환경의 데이터 라우팅에서 라우팅 관리를 인수하여 트래픽 라우팅을 제어
ex 애플리케이션 트래픽보다 영상 통화 트래픽을 우선적으로 처리하도록 시스템을 프로그래밍해서 모든 온라인 회의에서 일관된 통화 품직을 보장하도록 하는 것
- 네트워크 기능 가상화
- 데이터 가상화
- 애플리케이션 가상화
- 데스크톱 가상화
가상화 방식
호스트 운영체제 가상화
물리적 하드웨어 위에 설치된 호스트 운영체제 위에 가상화 소프트웨어와 가상 머신에 설치된 운영체제를 움직이는 방식

- 가상의 하드웨어를 Emulating 하기 때문에 호스트 운영체제에 크게 제약사항이 없다.
- OS 위에 OS가 얹히는 방식이기 때문에 오버헤드가 클 수 있다.
- 이 방식의 소프트웨어로는 VMWare Workstation, Virtual Box, Virtual PC가 있다.
하이퍼바이저 가상화
호스트 운영체제 없이 하드웨어에 하이퍼바이저를 설치하여 사용하는 가상화 방식
✏️ 하이퍼바이저 : 한 컴퓨터에서 여러 가상 머신을 관리하는 소프트웨어 구성 요소로, 각 머신이 할당된 리소스를 얻고 다른 가상 머신의 작동을 방해하지 않도록 한다.
- 하이퍼바이저 가상화는 호스트 운영체제와 별도로 개별 시스템처럼 행동하기 때문에 처리 오버헤드가 존재하지 않음
- 별도의 호스트 운영체제가 없어 하드웨어를 직접 제어하기 때문에 효율적으로 리소스를 사용할 수 있음
- 자체적으로 머신에 대한 관리 기능이 없기 때문에 관리를 위한 컴퓨터나 콘솔이 별도로 필요함
- 서버 가상화 기술에서는 주류 방식으로 사용
- 하드웨어와 운영체제 사이에서 물리적 시스템의 하드웨어에 직접 설치되는 경우를 베어메탈 하이퍼바이저라고 함
구현 방식
1. Full Virtualization(전가상화)
하드웨어를 완전히 가상화하는 방식으로 Hardware Virtual Machine이라고도 한다.
- 게스트 운영체제가 HW에 접근하면서 제어를 요구하는데 이 때 CPU는 가상화가 지원 가능한지 아닌지를 확인하여 지원하지 않으면 게스트 운영체제는 운영할 수 없으며, 지원 가능하면 HW 제어를 요구하고 이후 제어를 할 수 있게 됨
- 하이퍼바이저를 구동하면 DOM0이라는 관리용 가상 머신이 구동되는데 모든 가상 머신의 하드웨어 접근이 이 DOM0으로 이루어지는 구조
- 하드웨어를 완전히 가상화하기 때문에 게스트 운영체제의 별다른 수정이 필요없다.
- 하이퍼바이저는 중재 이외의 다른 문제들도 처리하면서 모든 명령을 중재하기 때문에 비교적 느리다.
- 이 방식의 소프트웨어로는 VMWare ESX Server, MS의 Hyper V가 있다.

2. ParaVirtualization(반가상화)
전가상화의 단점인 성능 저하 문제를 해결하기 위해서 Hyper Call이라는 인터페이스를 통해 하이퍼바이저에게 직접 요청하는 방식
- 모든 명령을 DOM0을 통해 하이퍼바이저에게 전송하는 전가상화에 비해 빠르다.
- 이 방식의 대표적인 소프트웨어로는 Xen, KVM이 있다.

Container 가상화
호스트 운영체제 위에 Container 관리 소프트웨어를 설치하여 논리적으로 Container를 나누어 사용하는 방식
- Container는 애플리케이션 동작을 위한 라이브러리와 애플리케이션 등으로 구성되어 있기 때문에 이를 각각 개별 서버처럼 사용한다.
- 오버헤드가 적어서 가볍고 빠르지만, 다양한 OS를 사용할 수 없고 보안적으로 완전히 격리되지는 않는다는 단점이 있다.
- 이 방식의 가상화 소프트웨어로는 OpenVZ, LXC, Linux Vserver, Docker, Oracle Solaris Zones가 있다.
애플리케이션 배포 방식의 변화
하드웨어 위에 운영체제를 설치하고 그 운영체제 위에 애플리케이션을 배포
⬇️
가상화된 방식을 이용해서 배포
⬇️
컨테이너를 이용해서 배포
Container
각 애플리케이션에는 운영체제가 아닌 의존성 요소만 포함되어 있고, 호스트 운영체제와 직접 연결되기만 한다면 게스트 운영체제 같은 추가 레이어가 없기 때문에 성능은 향상되고 리소스가 낭비되지 않고 Image 파일 크기도 작다.
- Container의 경우 호스트 OS의 프로세스 수준에서 격리하는데 Container들이 의존성을 공유하지 않는다.
- Doceker 엔진에서는 Container용 Linux 네임 스페이스와 컨트롤 그룹을 생성해 이를 처리하는데 이는 Docker의 보안이 Linux 커널 프로세스 격리를 기반으로 하는 이유이다.
장점
- 하이퍼바이저와 게스트 OS가 없기 때문에 가볍다.
- 경량이기 때문에 만들어진 Image 복제, 이관, 배포가 쉽다.
- 게스트 OS를 부팅하지 않기 때문에 애플리케이션 시작 시간이 빠르다.
- 가상머신보다 경량이므로 더 많은 애플리케이션을 실행할 수 있다.
Docker
Container형 가상화 기술을 구현하기 위한 상주 애플리케이션과 이 애플리케이션을 조작하기 위한 명령형 도구로 구성되는 애플리케이션으로, 같이 사용되는 프로그램과 데이터를 격리시키는 기능을 제공하는 애플리케이션-Container 가상화 소프트웨어이다.
Container와 Docker 엔진
- 프로그램과 데이터를 격리하는데 이 격리된 영역을 container라 하고 container를 다루는 기능을 제공하는 소프트웨어중 하나가 Docker
- Docker를 사용하려면 Docker 소프트웨어 본체인 Docker 엔진을 설치해야 하고, Docker 엔진을 사용해 Container를 생성하고 구동시킬 수 있다.
- 마이크로 서비스 전환, DevOps, Testing 등 다양한 분야에서 활용된다.
- Linux Container 구현체의 사실상 표준(de-facto)
- Docker는 Linux를 사용하기 때문에 Linux 운영체제가 필요하다.
(Windows나 MacOS에서도 Docker를 구동할 수는 있지만 이 경우 내부적으로 Linux가 사용되며 Container에서 동작시킬 프로그램도 Linux용 프로그램)
- Container 가상화는 프로세스 가상화로 Container 엔진인 Docker와 오케스트레이션 도구인 Kubernetes는 호스트 운영체제의 커널을 공유하고 그 위에 실행 파일 및 라이브러리, 기타 구성 파일 등을 Image로 빌드하여 패키지로 배포한다.
LXC(Linux Container)
운영체제 수준의 가상화를 구현하기 위한 방법으로, 단일 Linux 커널을 사용하는 제어 호스트에서 여러 개의 격리된 Linux 시스템(Container) 실행한다.
⇒ 컨테이너 기술을 구현하는데 중요한 역할
LXC에서 제공하는 주요 기능
- Namespce
- 프로세스를 독립시켜주는 가상화 기술(Linux 커널 리소스의 분리)
- 운영 환경에 대한 애플리케이션 보기의 완전한 분리를 허용
- 프로세스 트리, 네트워킹, 사용자 ID 및 마운트 된 파일 시스템 포함
- cgroups : 자원(CPU, 메모리, 블록I/O, 네트워크 등)을 제한하고 격리시키는 Linux 커널 기능
- chroot : 특정 디렉토리를 최상위 디렉토리인 root로 인식하게끔 하는 기능
데이터나 프로그램을 독립된 환경에 격리하는 이유
대부분의 프로그램은 프로그램 단독으로 동작하는 것이 아니라 어떤 실행 환경이나 라이브러리 또는 다른 프로그램을 이용해서 동작한다. 따라서 프로그램 하나가 다른 프로그램에 영향을 미치게 되기 때문에 Docker Container를 사용해서 프로그램을 격리하면 여러 프로그램이 한 서버에서 실행되면서 발생하는 문제를 대부분 해결할 수 있다.
동작 원리
- Container 안에는 운영체제와 유사한 것이 들어있음
- Windows나 MacOS에서 구동할 때는 Linux 운영체제를 끌어들여서 사용
(Windows에서는 WSL2가 이 역할을 수행)
Image와 Container
Image는 Container를 만들어내는 설계도(Class) 역할을 수행하는 것으로, 하나만 있으면 동일한 Container를 여러 개 생성할 수 있다.
- Container로도 Image를 생성할 수 있음
- 기존 Image를 수정해서 새로 만드는 것이 가능
- 동일한 Container를 여럿 만들지 않더라도 다른 물리 서버에 설치된 Docker 엔진에 Container를 이동시킬 수 있음
Docker Hub와 Docker Image
Docker Registry
Image를 배포하는 장소
- Docker Hub는 도커 제작사에서 운영하는 공식 도커 레지스트리로, Apache나 MySQL, Ubuntu의 공식 이미지 모두 Docker Hub에 참여해 Docker Hub에서 Image를 배포하는데 run이나 pull 커맨드를 사용할 때 내려받는 Image를 제공하는 사이트 (https://hub.docker.com)
- Private Registry를 직접 구축해서 사용할 수 있고, CSP(Cloud Service Provider)의 Registry를 이용할 수 있음
- Repository는 Registry 내에서 하나의 이미지를 저장하기 위한 단위
Docker Image의 종류
- 운영체제
- 소프트웨어가 포함된 이미지
- 소프트웨어가 여러 개 포함된 이미지
다양한 형태로 조합이 가능한 Container
Docker 사용 원칙 중 하나로 한 Container에 하나의 프로그램이라는 것이 있는데, 하나의 프로그램이 담긴 Container를 사용한다는 의미로 보안 및 유지 관리 측면에서 유리하기 때문에 많이 쓰이는 정책이다.
ex Wordpress를 사용하려면 Apache(Web Server), MySQL(Database), WordPress 세가지 소프트웨어가 필요한데, 이를 하나의 Container로 구성할 수도 있고 각각의 Container로 구성할 수도 있다.
데이터 저장
Container를 폐기하면 데이터도 소멸된다는 특징이 있기 때문에 Docker가 설치된 물리적 서버의 디스크를 마운트해서 데이터를 저장하는 것이 가능하다.
장점
- 애플리케이션 배포에 특화되어 있기 때문에 애플리케이션 개발 및 운영을 Container 중심으로 할 수 있음
- 가상화 소프트웨어보다 더 가볍게 동작
- 이식성이 뛰어나서 로컬 머신의 Docker 환경에서 실행했던 Container를 다른 컴퓨터에 있는 Docker 환경에 배포하거나 다른 서버의 Docker 환경에서 동작하던 Container를 로컬로 가져올 수 있는데 개발 환경과 운영 환경을 거의 동등하게 재현할 수 있음
- 물리적 환경의 차이나 서버 구성의 차이를 무시할 수 있음
- Container 간의 연동이나 클라우드 플랫폼 지원 등 여러 면에서 장점이 있음
추천하지 않는 경우
- Container는 운영 체제의 동작을 완전히 재현하지는 못하기 때문에 좀 더 자세한 Linux 계열 운영체제의 동작이 요구되는 경우
(이 경우에는 기존 방법대로 가상화 소프트웨어를 사용하는 것이 나음)
- 비Linux 환경이 필요한 경우에도 Docker가 적합하지 않음
Docker의 주요 도구
- LXC를 이용한 Container 구동 : containerd는 Linux 및 윈도우용 데몬으로 Image 전송 및 스토리지에서 Container 실행 및 구동, 네트워크 연결까지 호스트 시스템 전체 Container의 라이프 사이클을 관리
- 통합 Buildkit : Dockerfile의 설정 정보를 이용하여 Docker Image를 빌드하는 오픈 소스 도구이며 빠르고 정확하게 여러가지 아케텍쳐 향상 기능을 제공
- Docker CLI : Docker 명령을 수행하는 기본적인 도구
구성 요소
- Docker Client : 명령을 수행하는 CLI
- Docker Host : 도커를 설치한 서버 혹은 가상머신
- Docker Engine : 도커를 이용한 애플리케이션 실행 환경을 제공하는 핵심 요소
- Docker Hub : 전 세계 도커 사용자들과 함께 Docker Container Image를 공유하는 클라우드 서비스
- Docker-Compose : 의존성 있는 독립된 Container에 대한 구성 정보를 yaml 코드로 작성하여 일원화된 애플리케이션 관리를 가능하게 하는 도구
- Docker Registry : Docker Container Image를 push/pull 할 수 있는 레지스트리 구축에 사용하는 도구
- Docker Swarm : 여러 Docker Host를 클러스터로 구축하여 관리할 수 있는 Docker 오케스트레이션 도구 (쿠버네티스와 비슷한 역할을 하지만 기능이 다소 약함)
우분투에 도커 엔진 설치
https://docs.docker.com/engine/install/ubuntu/
# Add Docker's official GPG key:
# 패키지 목록 업데이트
sudo apt-get update
# 패키지 설치
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# 저장소 확인
apt-cache policy docker-ce
# 도커 클라이언트와 엔진 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 도커 설치 확인
sudo docker version
# 서비스 시작 및 상태 확인
sudo service docker start
# sudo service docker enable
# 매번 start 하기 번거로우니까 enable로 시작하자
# 데몬 확인
sudo systemctl status docker
# 매번 sudo로 실행하기 번거로우므로
# 현재 로그인한 유저에게 docker 명령 실행 권한 부여
sudo usermod -aG docker $(whoami)
sudo chmod 666 /var/run/docker.sock
sudo service docker restart