Julie의 Tech 블로그

컨테이너 개념 이해 - (2) VM vs Container 본문

Tech/AWS

컨테이너 개념 이해 - (2) VM vs Container

Julie's tech 2021. 5. 12. 23:27
728x90

AWS 컨테이너 서비스에 대한 이해를 하기 전, 컨테이너란 어떤 개념인지를 파악하기 위해 기록을 해보았다. VM과는 어떤 추상화 차이가 있는지에 대해서 살펴보며, 컨테이너 서비스 중 도커와 kubernetes에 대해 간략하게 정리하였다.

* VM (Virtual Machine)

- hardware-level virtualization

* 컨테이너

- OS-level virtualization이다.

즉 VM은 hardware (processor, ram, stroage, network 등)을 가상화하고,

컨테이너는 Operating System(OS)를 가상화한다.

VM은 hyperviser 를 통해 hardware가상화를 제공함으로써 machine의 isolation을 구현하였다.

즉 VM을 띄우면 개별 machine처럼 보인다.

각각의 서버가 철저히 독립된 상태이다.

이에 따라 하드웨어 유연성을 최대로 가져갈 수 있다.

컨테이너는 process를 isolation하였다. 프로세스끼리 자원 공유가 가능하며 위 장점에 따라 portability를 최대로 가져갈 수 있다. (흔히 도커를 파일로 저장하여 포팅하듯이) 컨테이너를 사용하게 되면 하드웨어적인 한계가 있을 수 있다.

 

VM 계층도 vs 도커 계층도

Docker

도커는 컨테이너화 기술 중 하나이며, VM과는 다르게 가상 실행 환경이다.

우분투 VM을 띄우면 우분투 서버가 실행되지만, 도커는 우분투 이미지를 run하면 우분투에 명령을 실행할 수 있는 환경만을 제공해준다는 점에서 큰 차이가 있다.

위 설명을 좀 더 직관적이게 이해하려면, 아래를 따라 터미널창에서 실행해보면 된다.

우분투 image를 run하면 아무 결과물을 내뱉지 않는다. 문제가 있다고 생각하기 쉬운데, 실상은 default 명령어인 “/bin/bash” 가 실행되고, 해당 명령어에 따른 output이 아무것도 나오지 않는 것이다. 하지만 output을 뱉지 않으니 프로세스가 명령어 수행시 바로 exit된 상태처럼 느껴질 수 있다.

docker run ubuntu 시 아무 결과도 내뱉지 않음

docker run ubuntu “env”와 같이 옵션에 명령어를 주게 되면 해당 명령어로 인한 결과물이 뱉고, 바로 종료된다는 점을 확인할 수 있다.

docker run ubuntu "env" 실행시 env 결과를 내뱉음

이처럼 도커는 가상 실행 환경을 제공하는 것이기 때문에 컨테이너에서 실행되는 명령이 계속되지 않는 이상 명령이 종료됨에 따라 컨테이너도 종료된다. 즉 도커 컨테이너는 host os 의 입장에서 보면 하나의 프로세스이기에 docker run이 끝나게 되면 프로세스가 종료되어 컨테이너가 종료된다.

백그라운드로 컨테이너를 실행해주더라도 명령어 수행이 마무리되면 바로 exit된다. (옵션 : -d)

-d 옵션으로 docker run시에 컨테이너 ID를 내뱉음

-it 옵션으로 실행할 경우 가상 shell환경이 실행되고 있기 때문에 컨테이너가 종료되지 않고 계속적으로 실행되고 있는 것을 확인할 수 있다.

* -i : interactive (표준입력, 표준출력을 키보드와 화면을 통해 가능하도록 함)

* -t : terminal 기반의 애뮬레이션 옵션

위에서 docker attach 명령어를 통해 컨테이너에 접속하여 shell환경처럼 명령어를 내릴 수 있다. (exit 명령어를 주게 되면 당연 컨테이너는 종료됨)

이처럼 가상 실행 환경을 제공해주는 도커는 일반적으로 4단계로 구성되어 심플하게 운영할 수 있다.

1) 컨테이너 실행

2) 도커 빌드 (dockerfile 작성 등)

3) 빌드한 도커를 registry 에 push

4) 도커 run

이처럼 도커의 개념과 특성을 정리하고 보면 아래와 같은 상황을 이해할 수 있다.

- 도커는 컨테이너가 각각 독립된 환경(sandbox화)을 사용하기 때문에 컨테이너 환경과 곳에서 프로세스에 접근하기 위해서는 Port를 뚫어줘야한다. 즉 내가 도커에 웹 서버를 띄우더라도 host network인 내 컴퓨터에서 접근하려고 하면 네트워크를 공유하고 있지 않기 때문에 포트를 매핑 해주어야한다.

- 또한 컨테이너는 stateless하기 때문에 host 내 데이터를 저장하고 다른 컨테이너를 띄우더라도 해당 데이터에 접근가능하도록 하기 위해서는 별도 명령어를 통해 host내 특정 경로로 저장을 해야한다. (docker run시 -v 옵션)

다음편에는 왜 도커를 사용해야하는 가에 대해 다뤄보는 것으로 글을 마무리하겠다 🙂


-- 내가 보려고 적은 추가 노트

* 리눅스 명령어 :

- ps aux : 프로세스 리스트가 출력됨

- ps aux | grep 프로그램명 : pid(process id)를 확인할 수 있음

- nester : 프로그램을 다른 프로그램의 namespace내에서 run하도록함

* Namespace : 프로세스가 보고 접근할 수 있는 부분을 한정하는 것. 다른 네트워크 환경이거나 다른 프로세스인 경우 접근이 불가함

- control group, ipc(interprocess communication), its (hostname), user ID, 등을 저장할 수 있음

- control group이란 프로세스가 소비할 수 있는 자원의 량을 한정하는 것

* 도커 명령어 관련

- docker run -d redis <- -d는 background에서 돌게 하는 옵션, docker run <option> <image-name>:<tag> (tag없으면 최신버전으로 자동다운)

- docker ps : 실행되고 있는 프로세스를 보여줌

* 백그라운드 vs 포그라운드

백그라운드 기능은 프로세스가 실행되는 동안 다른 프로세스가 실행 가능

즉 하나의 쉘에서 여러 개의 프로세스를 동시에 실행할 수 있는 방식

반면 포그라운드는 명령어 실행이 완료될 때까지 기다리는 방식


출처 및 참고자료

www.docker.com/whatisdocker - 도커, VM 사진 출처

https://www.popit.kr/개발자가-처음-docker-접할때-오는-멘붕-몇가지/

https://gocoder.tistory.com/1814 [고코더 IT Express] - 백그라운드 vs 포그라운드

반응형