반응형

 

앞서 컨테이너 가상화에 대해 언급을 했다. 리눅스 컨테이너는 컨테이너 가상화 기술을 사용한다.

 

이 리눅스 컨테이너에는 애플리케이션이나 그에 따라 필요한 라이브러리나 설정파일 등이 포함되어 있다. 가상머신과는 다르게 가상화 계층이 없고 커널이 별도로 존재하지 않기 때문에 가상머신에 비해서 가볍고 실행속도도 빠르다.

 

리눅스 컨테이너는 예전부터 사용되어졌지만 도커가 개발된 후로부터 최근 활발하게 사용되고 있다. 도커는 리눅스 컨테이너를 다루는 도구중의 하나이며 도커와 같은 다른 도구들도 있으나 대부분 도커를 사용한다. 컨테이너 런타임이라고도 한다.

 

 

가상머신과 컨테이너 비교

 

 

리눅스 컨테이너의 핵심 기술은 2가지가 있는데 cgroup과 namespace이다.

 

1. cgroup (control group의 약자)

프로세스나 쓰레드를 그룹화해서 관리하는 기능, 시스템의 CPU, 메모리, 디스크I/O 등 리소스의 사용을 제한하는 기술이다. 리눅스 컨테이너는 호스트의 리소스를 공유하여 사용하는데, 이 때 cgroup을 사용하여 컨테이너가 사용하는 리소스의 양을 제한할 수 있다. 또한 같은 호스트에서 동작하는 서로 다른 컨테이너에 영향을 주지 않도록 막아주는 역할도 한다.

 

2. namespace

space 공간 안에 다수의 오브젝트를 격리(isolation)할 수 있다. 예를 들어서 동일한 호스트에서 동일한 PID(Process ID)를 가질 수 없지만 서로 다른 namespace에서는 동일한 PID 를 가질 수 있다. 격리되어 있다는 것이 포인트다.

 

추가로 윈도우 운영체제는 도커 컨테이너를 올릴 수 없으니 하이퍼바이저를 이용해서 도커를 사용한다.

 

 


 

Docker Daemon과 Podman

 

 

Docker 의 구성요소 중 하나로 Docker Daemon이 있다.

 

 

Docker 동작방식

 

 

위의 이미지와 같이 도커는 데몬 위에서 동작한다. 또한 프로그램이 동작하려면 방식이 3가지가 있다.

* 데몬 : 부팅시 올라오는 프로그램들

 

 

* 프로그램 동작방식 3가지

 

1) 부팅시 동작

runlevel 같이 부팅할 때 동작하는 개념이다.

 

2) 런레벨에 의존하지 않고 항시 동작시키는 방식

예를 들어서 systemctl enable 설정처럼 부팅시 실행되도록 동작시킬 수 있다.

 

3) /etc/rc.local에 올려서 동작시키는 방식

이 방식은 부팅시 부팅 스크립트의 끝자락에 읽어진다. 스크립트가 읽어지게 되면 항시 프로그램을 동작시킬 수 있다. 스크립트를 많이 추가하다보면 복잡해지기도 하고, 여기 올려서 동작시키려면 신뢰할 수 있고 믿을 수 있는 프로그램만 동작시킨다.

 

 


<podman>

 

 

docker를 사용하다보면 docker daemon이 죽을 가능성이 높다보니 데몬 없이 image, container, kernel에 그냥 던져주기 위해서 나온 것이 바로 podman이다. RHCSA시험이 8버전으로 바뀌면서 podman에 대한 내용이 추가되기도 했다.

 

docker의 또 한가지 문제는 클러스터링(쉽게 말해서 컨테이너들을 묶어주는 것)을 해주는 쿠버네티스(kubernetes)와는 연동이 잘 안된다. 이미지를 한 개만 올리는 것은 docker나 kubernetes나 어느것을 사용해도 상관이 없지만 보통 일반 회사에서는 컨테이너 이미지를 하나씩 올리는 경우는 거의 없다. docker는 가상화해서 올리는 것도 아니다.

 

podman은 데몬이 아니라 일종의 커맨드처럼 쓰인다. docker는 가상머신에 올리는 것처럼 사용하는 것이 아니지만 podman은 가상머신처럼 사용한다. 운영체제가 올라가고 ssh로 접근해서 제어할 수도 있다. 서비스를 이용하기 위해서는 포트를 열어줘야 한다. 밖에있는 자원을 이용하기 위해서는 마운트도 시켜주는 등 동일하게 사용한다.

 

Virtualbox같은 가상머신은 HDD를 장치 디바이스에 인식할 수 있도록 계속 추가했었는데, podman은 외부 리소스를 컨테이너에서 사용하고 있는 tcp, port 관련 영역과 맵핑(연결) 시켜준다. 외부의 디스크를 사용하고 싶다면 관련 명령어도 사용할 수 있다.

 


다시 컨테이너로 돌아와서..

 

isolation(격리)적인 부분에서도 우수한 것은 가상머신이지만, 지금 컨테이너같은 경우에는 구조상 동작하는 프로세스가 직접 노출된다. 자원들도 isolation 되어있는 것이 아니라 밖에있는 외부 자원을 그대로 가져다 쓴다. 대표적으로 도커허브(docker hub) 같은 곳에서 image를 가져다가 쓴다. official하게 도커허브 자체에서 제공해주는 이미지들도 있지만 사용자가 수정 보완해서 만들어놓은 이미지 또한 pull 명령어를 이용해 다운받아서 사용할 수 있다.

 

자원을 공유해 사용한다는 것이 편리하고 장점이 있지만 그에 따른 보안 이슈가 존재한다. 외부 자원을 그대로 가져다 쓰는것에 대한 접근 통제가 그만큼 중요시 되고 있다. 실제로 일부 사용자가 만들어놓은 이미지 안에 비트코인 채굴을 위해 다운받아 사용하는 사용자의 CPU를 사용하게 한다거나 랜섬웨어를 깔아놓는 등의 범죄에도 노출되어 있으며 실제 사례이다. 또한 잘못하면 불필요한 정보에 쉽게 노출된다는 단점이 있다.

 

그럼에도 불구하고 컨테이너기술과 도커, 쿠버네티스는 여전히 핫한 기술이다.

 

또한 쿠버네티스는 AWS, GCP를 지원해준다. 쿠버네티스를 접할 기회가 있었는데, 요즘에는 거의 컨테이너 오케스트레이션으로 쿠버네티스가 독보적이라고 한다.

 

위에서 언급한 Podman은 Pod Manager tool 의 약자로 OCI 표준 container와 런타임을 개발, 관리, 실행할 수 있게 해주는 container engine 이다. 레드햇에서 쿠버네티스에 올릴 수 있도록 만들어 놓은 것이다. 도커와 명령어가 완전히 똑같기 때문에 docker라는 이름 대신 podman으로 변경해서 사용하면 쉽게 익숙해질 수 있다. 요즘엔 또 podman으로 컨테이너를 관리해서 쿠버네티스와 연동한다는데 실제로 쓰는 사람은 아직 본 적이 없다.

 

 

글을 쓰면서 주제가 조금씩 바뀌기도 해서 내용이 들쑥날쑥이지만, 앞으로는 개념적인 부분도 쉽게 설명할 예정이다.

 

 

 

* 추천 책

가장 빨리만나는 도커(Docker)

 

 

* 출처 및 참고자료

https://www.weave.works/blog/a-practical-guide-to-choosing-between-docker-containers-and-vms

 

A Practical Guide to Choosing between Docker Containers and VMs

Docker, Kubernetes, and containers are indeed powerful technologies that can bring many benefits to a business. But they are not necessarily the right choice for every workload. In some cases, you’re better off sticking with simple virtual machines.

www.weave.works

https://www.lesstif.com/container/podman-98926748.html

 

podman 소개 및 설치

 

www.lesstif.com

 

반응형

'Docker' 카테고리의 다른 글

도커 입문 : 가상화의 배경과 종류  (0) 2021.06.01

+ Recent posts