가상화를 공부하다 보면 꼭 나오는 내용인 컨테이너 와 하이퍼바이저를 공부하게됩니다. 주로 컨테이너 와 하이퍼바이저를 비교하면서 차이점을 확인하게 되는데 컨테이너는 리눅스와 매우 관련이 깊은 기술이라 조금 딥하게 공부해보고 싶어 이러한 공부한 기록을 남기게 되었습니다. 그럼 바로 본론으로 시작!
현재는 도커를 통해 수많은 컨테이너를 실행하고 중단하지만 알고보면 도커를 통해 사용하는 컨테이너라는 기술은 휠씬 이전부터 시작됨.
컨테이너의 시작은 1979년에 유닉스 버전 7(Unix Version 7)에서 도입된 chroot 이다. chroot는 change root의 줄임말로 프로세스의 루트 디렉토리를 변경하여 특정 디렉토리의 접근을 제한하는 기능이다.
하지만 chroot는 디렉토리에 대한 액세스 권한만 제어하고 현 컨테이너 처럼 네트워크, 프로세스를 격리할순 없었음 따라서 한계가 있었음

2000년 FreeBSD 4.0 에서 Jail이 도입 되면서 현 컨테이너의 기술의 시작점이 시작됨 chroot의 개념을 크게 확장하여 여러 격리 기술을 제공하였음.
이렇게 분리된 미니 시스템(프로세스,네트워크,사용자)는 모두 하나의 동일한 커널을 공유하게 되는데 이는 우리가 알고 있는 현재 컨테이너의 개념이기도 함.
2005에 Parallels(현재 맥에서 많이 사용되고있는 VM툴)에서 OpenVZ를 오픈소스로 내놨다.
OpenVZ는 다음과 같은 특징을 가지고 있다.
컨테이너를 딥하게 공부해보면 무조건 한번씩 본 개념이다. 2006년에 구글에서 Process Containers 라는 이름으로 cgroups 개발을 시작했다.
2008년에 IBM에서 LXC(Linux Containers)를 발표하며 지금 현대 컨테이너 기술의 기반이 마련됬다.
2013년에 Docker를 오픈소스로 발표하면서 컨테이너 기술이 대중화되어 현재 많은 사람들에게 사용되고 있다.
이 이후에도 쿠버네티스, OCI 등 많은 일들이 있었음
이제 컨테이너의 역사는 그만 알아보고 본격적으로 랩을 진행하기 위해 환경을 만들어보겠다.
실행환경은 vagrant로 진행한다.
먼저 본인은 실리콘 맥 os 환경으로 진행함.
홈브루로 vagrant를 설치해준다. 이미 본인은 vmware fusion이 설치되어있어 vmware 설치는 스킵하고 vmware 유틸이랑 플러그인만 설치를 진행함
brew install vagrant --cask
brew install --cask vagrant-vmware-utility
vagrant plugin install vagrant-vmware-desktop
vagrant 플러그인까지 설치한다음 참고한 사이트에서 git으로 파일을 받아준다.
vagrant 파일을 약간 수정하였다. ubuntu가 아닌 rocky 리눅스로 변경하였고 x86이 아닌 arm 으로 변경하였다.
BOX_IMAGE = "rocky9arm64_vmware"
HOST_NAME = "rocky9arm"
$pre_install = <<-SCRIPT
echo ">>>> pre-install <<<<<<"
sudo dnf -y update &&
sudo dnf -y install gcc make pkgconf-pkg-config libseccomp-devel tree jq bridge-utils
echo ">>>> install go <<<<<<"
curl -O https://storage.googleapis.com/golang/go1.15.7.linux-arm64.tar.gz > /dev/null 2>&1 &&
tar xf go1.15.7.linux-arm64.tar.gz &&
sudo mv go /usr/local/ &&
echo 'PATH=$PATH:/usr/local/go/bin' | tee /home/vagrant/.bash_profile
echo ">>>>> install docker <<<<<<"
sudo dnf -y install dnf-plugins-core &&
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo &&
sudo dnf -y install docker-ce docker-ce-cli containerd.io &&
sudo systemctl enable docker &&
sudo systemctl start docker
SCRIPT
Vagrant.configure("2") do |config|
config.vm.define HOST_NAME do |subconfig|
subconfig.vm.box = BOX_IMAGE
subconfig.vm.hostname = HOST_NAME
subconfig.vm.network :private_network, ip: "192.168.104.2"
subconfig.vm.provider "vmware_desktop" do |v|
v.memory = 1536
v.cpus = 2
end
subconfig.vm.provision "shell", inline: $pre_install
end
end
처음에는 vagrant up 명령어를 사용했을때 에러가 뜨는데 해당 vagrant 파일을 실행하기 위한 box가 없어서 그런것이다.

그래서 rocky 리눅스 공식 홈페이지에 있는 vagrant 용 box 이미지(arm)를 등록해준다.
vagrant box add --provider=vmware_desktop rocky9arm64_vmware https://download.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-Vagrant-VMware-9.6-20250531.0.aarch64.box
box 이미지를 등록하고 list 명령어를 통해서 확인해준다.

그런다음 vagrant up 명령어를 다시 시작해주면 스크립트가 실행되며 많은 패키지 파일들이 설치된다.

이제 vm으로 들어가서 제대로 실행됬는지 확인까지하면 실행환경은 제대로 되었다.
vagrant status
vagrant ssh rocky9arm

다음부터 밑바닥에서 컨테이너를 만들어보겠다.
참고
https://netpple.github.io/docs/make-container-without-docker/container-internal-1