프로그래밍/도커

Linux) Doker와 Container의 탄생과 설명, 차이점

Hwan2 2019. 11. 13. 22:35
반응형

이 글은 제가 인터넷으로 공부한걸 바탕으로 작성된 글입니다. 잘못된 내용이나 보충해야할 내용이 있으면 댓글이나 E-mail로 피드백 해주시면 감사하겠습니다.

 

 

 

 

 

What is Docker?

 

 

도커는 리눅스의 컨테이너라는 기술(LXC)를 이용한 소프트웨어로 지금은 자체 라이브러리인 libcontainer를 사용하고 있습니다.

 

위 말만 들으면 도커가 뭐하는건지, LXC는 뭐고 libcontainer는 뭔지... 감이 안잡힙니다.

 

흔히 웹 검색으로 알 수 있는 지식은 다음과 같습니다.

 

1. 도커를 이용하면 개발환경에 구에받지 않고 손쉽게 내가 사용하던 개발환경을 구축할 수 있다.

2. 도커를 이용하면 여러개의 독립된 프로세스를 띄워 마이크로서비스가 가능해진다.

3. 도커를 이용하면 배포가 쉽고 수정도 쉽다.

4. 도커는 일반적인 Hypervisor가상화 방식과는 다르게 경량 가상화로 실행이 빠르다. 그로 인해 한개의 서버만 있으면 

   여러개의 서비스(위에서 말한 마이크로서비스)가 가능해지므로 불필요한 서버 확장이 필요없다.(금전적으로 이득)

5. 도커를 이용하면 여러개의 프로세스(컨테이너)관리가 쉬워진다.

 

 

대충 이렇게 정리할 수 있겠습니다.

 

저는 이 정보를 찾고 다음과 같은 의문이 들었습니다.

 

1. 리눅스 컨테이너가 왜 탄생했고 이제와서 이렇게 핫한가?

2. 독립된 프로세스? 여러개의 서버환경? 도대체 어떤 원리로 가능하고 이게 무슨 말인가?

3. 도커가 뭔지는 대충 머리속에 잡히긴 하는데 두루뭉실하게 잡힌다. 사용하면 사용하겠지만 뭔가 찝찝한 기분이 든다....

4. 도커도 가상화라고 하는데 Hypervisor(VMware, KVM, etc...)가상화 방식과는 뭐가 다른가??

 

 

이러한 이유 때문에 이 글을 작성하게 되었으며 긴 글이 예상됩니다. 

 

저와 같은 궁금증과 고민으로 여기를 찾아오셨다면 도움받고 가셨으면 좋겠습니다.

 

 

목차에 대해 설명해보자면 다음과 같습니다.

 

1. 컨테이너의 탄생 배경.

2. 컨테이너란? (LXC), namespace와 cgroup의 설명.

3. 컨테이너와 도커의 차이점.

4. 도커를 통해 가져갈 수 있는 이점.

 

 

 

그럼 시작하겠습니다.

 

 

 

 

1. 컨테이너의 탄생 배경

 

컨테이너가 나오기 전에 비슷한 기술을 FreeBSD에서 사용하고 있었습니다.

 

그것은 바로 FreeBSD jail입니다. 감옥이라는 뜻인데, 게스트 유저를 가둬둔다는 의미입니다.

 

이 개념을 알기 위해선 리눅스의 chroot라는 기능을 알아야 합니다.

 

chroot는 루트 디랙토리를 바꿔주는 기능을 수행하는데, 무슨말이냐? 하면 다음과 같습니다.

 

일반적으로 리눅스 콘솔창에서 'ls /' 명령어를 입력하면 루트 디렉토리에 대한 목록이 나오게 됩니다.

 

그럼 Guest 유저가 리눅스 서버에 접속해서 'ls /' 명령어를 입력했을 때 어떻게 될까요??

 

이건 관리자가 Guest에게 권한을 어떻게 주느냐에 따라 달라지게 됩니다. 접근이 안될수도 있고 될 수도 있고.....

 

만약 안되게 퍼미션을 걸어버린다면 많은 제약이 따릅니다. 이러한 재약을 좀 더 유연하면서 보안도 유지되는걸 고민해서 탄생한것이 

 

chroot 입니다. chroot를 사용하게 되면 기본 root디렉토리가 변경됩니다.(Guest 유저 한에서...) 

 

만약 Guest유저에 대해 chroot로 루트 디렉토리를 /home 디렉토리로 변경하게되면 다음과 같이 표시되게 됩니다.

 

'Guest@ : ls /'

/home

 

이렇게 말이죠. 즉 Guest 입장에서의 root 디렉토리는 /home 디렉토리가 되는 것입니다. 

 

그럼 루트디렉토리만 바뀌게 되는 것이냐?? 그건 아닙니다.

 

사용자가 chroot를 설정하면서 설정한 루트 디렉토리(/home) 아래에 Guest가 필요로 하는 참조하는 파일들을 제공함으로 써

 

Guest는 서버의 불필요한 접근을 할 필요 없이 자신의 일을 수행하면 됩니다.

때문에 보안을 유지하면서 Guest에게 유연성을 제공하는 것이 가능해 졌습니다.

 

chroot는 대부분의 리눅스에서 설정이 가능하지만 설정 또한 까다롭습니다. 

 

이 개념을 기반으로 2001년 VServer Project를 통해 Linux에 격리된 공간이 구축되었으며 이것이 발전해 컨테이너란 녀석으로 탄생하게 됩니다.

 

 

 

 

2. 컨테이너란? (LXC), namespace와 cgroup의 설명

 

위와 같은 배경으로 탄생한 컨테이너는 리눅스의 시스템 기능 2가지를 기반으로 만들어 집니다.

바로 namespacecgroup입니다.

 

namespace는 프로세스를 독립시켜주는 가상화 기술입니다. 즉 프로세스 ID(PID)가 같아도 서로 다른 프로세스입니다.

 

vlan 개념과 비슷한데 같은 커널 위에서 돌긴 하지만 namespace로 만들어진 프로세스는 현재 커널에서 작동중인 프로세스와의 충돌이 없습니다.

 

계속 비슷한 말만 하는데..... 쉽게 말해서 같은공간에 존재하지만 서로 볼 수 없는 그런 녀석으로 생각하면 될 것 같습니다.

 

이렇게 독립이된 프로세스는 다음과 같은 특징을 같는데, PID, IPC, Network, UID, Mount, UTS가 독립적으로 존재할 수 있습니다.

 

즉, 프로세스간의 통신을 IP로 해야한다는 뜻입니다. 

 

내부에서 간섭을 받지 않는 격리된 공간(프로세스)를 만들고 나면 cgroup을 사용해 줘야 합니다.

 

cgroup은 control group의 약자로 하드웨어 자원을 배분하는 기능을 수행합니다.

 

한마디로 놀고 있는 녀석들(CPU, RAM 등....)의 자원을 사용자가 원하는만큼 격리된 프로세스에 할당해 주게 되는 것입니다.

 

이렇게 할당하게되면 컴퓨터 성능을 좀 더 효율적으로 사용할 수 있으며, 

추 후 컨테이너에 올라가는 응용프로그램마다 필요에 따라 자원을 더 줄 수 있다는 뜻이 됩니다.

 

namespacecgroup으로 만들어진 컨테이너를 LXC(LinuX Container)라고 부르며,

 

독립된 공간의 프로세스 위에 사용자가 원하는 기능을 올릴 수 있게 됩니다.

OS를 올리고, 해당 OS위에 JAVA서버, nodejs, FTP, DB, etc.... 여러가지를 말이죠....

 

마치 Hypervisor의 VMware나 KVM과 비슷해보이지만 엄연히 다릅니다. 

 

 

 

 

 

출처 : https://cloud.google.com/containers/?hl=ko

 

 

 

위 그림을 보면 알겠지만 VM은 Hypervisor위에 Guest OS가 올라갑니다. 즉, 하드웨어를 논리적으로 가상화를 하고 그 위에 OS를 통째로 올리게 됩니다.

 

OS는 상당히 무겁습니다. 설치가 완료되면 20GB정도는 우습게 먹고 들어갑니다. 사용자가 사용하지 않은 불필요한 기능들도 많이 있습니다.

 

치명적인 단점은 너무 느립니다. OS자체가 무겁기 때문에 잡아먹는 자원도 많고 부팅과 종료가 상당히 느립니다. 

 

하지만 컨테이너를 보시면 Container Runtime 위에 Guest OS없이 응용프로그램이 올라와 있는걸 확인할 수 있습니다.

 

저것이 무엇을 의미하냐면 컨테이너에서 OS가 실행되긴 하지만 사용자가 사용할 응용프로그램만 작동되도록 정말 최소단위만 올라가게 됩니다.

 

따라서 컨테이너에서 실행되는 OS의 커널 크기를 보면 보통 수십~메가 에서 수백~메가 밖에 되질 않고 부팅과 종료 또한 빠릅니다.

 

덕분에 서버 한대에서 여러 기능을 하는 응용프로그램들, 소위 마이크로서비스식 서버를 구축할 수 있으며, 기존 서버 커널 하나로 모든 컨테이너들의 관리가 가능하므로 관리도 손쉬워 짐니다.

 

 

 

 

여기까지가 리눅스 컨테이너에 대한 전반적인 설명입니다. 쉽게 설명하기 위해서 생략한것도 있으니 유의하시고 보시면 되겠습니다.

 

 

 

 

 

3. 컨테이너와 도커의 차이점

 

 

Docker는 처음엔 LXC 기반으로 만들어 졌습니다. 즉, 도커는 LXC를 좀 더 효율적으로 생성, 관리, 배포 등....

컨테이너 관련 작업을 효율적으로 하기위해 만들어졌습니다.

 

그렇다고 Docker == LXC는 아닙니다.

 

출처 : redhat.com/ko/topics/containers/what-is-docker

 

 

위 사진을 보면 LXC와 Docker는 차이점이 존재합니다.

 

1. LXC는 하나의 컨테이너에 여러개의 응용프로그램들을 띄울 수 있습니다.

   하지만 도커는 컨테이너당 하나의 응용프로그램을 사용하길 권장하고 있고 이에 대한 수 많은 기능들을 제공합니다.

 

컨테이너당 응용프로그램을 하나씩 띄워 놓으면 다음과 같은 장점이 있습니다.

    • 다른 프로젝트에서 쉽게 재사용 가능
    • 보안 및 격리 관점에서 더 많은 유연성을 가져올 수 있음.
    • 업데이트시 서로간의 간섭을 받지 않음
    • 마이크로서비스 아키텍처를 구성하는것에 대해 효율적이다.
이러한 이유 때문에 Docker에선 1컨테이너 1응용프로그램을 권장하고 있습니다.
 
2. LXC는 캡쳐기능이 없지만 Docker는 캡쳐기능이 있습니다.
   VM의 스냅샷과 동일한 것인데, 구축된 환경을 이미지 파일로 저장 후 언제든지 사용 가능합니다.
   만약 초기 셋팅을 이미지 파일로 만든 후 새로운 패키지나 업데이트를 했는데 알 수 없는 이유로 프로그램이 작동이 안된다면
   초기에 만들어 놓은 이미지 파일로 쉽게 되돌아 갈 수 있습니다.
 
3. Docker는 새로운 컨테이너를 구축할 때 이러한 계층을 재사용하므로 구축 프로세스가 훨씬 더 빨라집니다. 
   중간 변경 사항이 이미지 사이에서 공유되므로 속도, 규모, 효율성이 더 개선됩니다.

 

4. Docker는 컨테이너를 이미지화 시켜 배포를 쉽고 빠르게 할 수 있습니다. 컨테이너의 시작과 종료가 불과 수 초에 해당되기 때문입니다.

 

5. 현재 Docker는 LXC 기반이 아닌 자체 라이브러리인 libcontainer를 사용함을로써 좀 더 Docker Engine에 맞게 실행되게 됩니다.

출처 : https://zetawiki.com/wiki/Libcontainer

 

 

 

 

 

4. 도커를 통해 가져갈 수 있는 이점

 

 

이점은 위에서 설명한 대로 입니다.

 

서버 하나에서 컨테이너를 이용해 여러 서버(응용프로그램)를 구축할 수 있으며, Docker를 사용해 쉽고 빠르게 배포, 관리가 가능합니다.

 

또한 개발환경에 구에받지 않아도 되며 불필요하게 돈을 주고 서버를 증설할 필요도 없습니다.

 

개발환경에 구에받지 않아도 된다는 뜻은 개발자 OS가 CentOS, Ubuntu, fedora, etc.... 상관 없이 

컨테이너를 이용해 OS를 띄워주기만 하면 되기 때문입니다.

 

 

 

 

 

마지막으로 쿠버네티스라는 녀석이 있습니다.

 

이녀석에 대해선 다음장에 설명하겠습니다.~~~

 

 

 

 

긴 글 읽어주셔서 감사하고 잘못된 정보가 있다면 꼭 알려주세요.!!!

 

반응형