[dev] 컨테이너를 활용해 보자 #1 - 샌드박스 (sandbox)

in #kr8 years ago (edited)

front_wide.jpeg

컨테이너 기술에 대해서 글을 적어볼까 합니다.

첫편은 비 개발자들도 관심을 갖고 읽어볼 수 있도록 용어 및 개념 설명부터 캐주얼하게 시작하겠습니다. 너무쉬워서 도저히 못참겠다 하시는 분들은 한번만 참아주세요. 다음편 부터는 개발자만을 대상으로, 좀더 구체적인 내용으로 들어갈 계획입니다.

컨테이너에 대해서 이야기 하기 위해서 무엇부터 이야기를 해야할까 생각을 해 봤습니다. 여러 방향에서 접근할 수 있으나, 저는 먼저 샌드박스라는 것부터 한번 이야기를 시작해 볼까 합니다.

샌드박스?

컨테이너 이야기하다가 갑자기 샌드박스 이야기를 하니, 우릴 무시하느냐, 아무나 갖다붙이느냐, 재밌는 글인척 하려고 낚시하는거냐 하시는 비 개발자 분들이 계실지도 모르겠습니다. 맞습니다 (아닙니다, 맞습니다), 샌드박스(sandbox)는 말그대로 모래상자입니다. 놀이터에 가면 어린이들이 놀 수 있는 공간에 모래를 가득 채워놓았죠? 어린이들이 넘어져도 굴러도 다치지 않고, 모래의 특성상 바닥도 손상되지 않지요. 뭐든지 마음놓고 할 수 있는 공간입니다.

Mr-Baute-Adventure-sandbox-sandigz1a.jpg
출처

이번에는 모래가 가득 들은 쟁반 있다고 상상해 봅시다 (sandbox가 아닌 sand tray이긴 합니다만). 모래를 평평하게 만든 후, 손가락으로 글씨를 썼다 지우고, 모래성을 쌓았다 부수고, 구멍을 팠다 메우고 할수 있습니다. 마음껏 놀고나면? 손바닥으로 스윽 모래를 평평하게 하면 리셋 되지요. 모래가 너무 더러우면? 가져다 버리세요.


출처

그렇다면 샌드박스가 소프트웨어 분야에서 왜 필요한걸까?

소프트웨어 분야에서 샌드박스라는것은, 뭔가 안전하지 않거나, 임시적인 실험등을 안전하게 수행할 수 있는 공간을 의미합니다. 이 개념에서 출발하여 여러 가지로 뻗어 나가게 됩니다.

간단한 예를 들어 볼께요. 바이러스 파일을 분석하는 프로그램을 만들었습니다. 이제 실제 테스트 해볼 일만 남았는데, 자신의 PC에서 테스트하다가 바이러스에 감염될까바 걱정이 됩니다. 사람이 만든코드에는 오류가 있기 마련이고, 바이러스는 100% 막을 수가 없기 때문입니다. 게다가 그 바이러스는 시스템을 몽땅 날려버리는 악성 바이러스입니다.

이 프로그램은 어떻게 프로그램을 테스트 할까요? 그렇습니다. 자신의 PC안에 샌드박스를 만들고, 그안에 자신의 프로그램과, 바이러스 파일을 넣은후 돌려보면 됩니다. 프로그램에 오류가 있어서 바이러스가 활개를 친다 하더라도, 그 영향력이 샌드박스 밖으로 미치지 못합니다. 모래상자 안에만 난장판이 될 뿐이지요. 난장판이 된 샌드박스를 지워버리기만 하면 모든게 없었던 일이 됩니다. 참 쉽죠?

또다른 예를 들어 볼까요? 프로그램의 오류를 악용하는 바이러스들도 있습니다. 예를 들면, 많은 아마추어 개발자들에 의해 개발된 프로그램들은, 아주아주 드문 케이스에 발생할 수 있는 오류들을에 대한 처리 로직이 없는 경우가 있습니다. 그 부분을 노리고 공격하는 악성코드들에게 먹잇감이 되지요. 하지만 그런 상황을 재현시키고 프로그램을 테스트하는것이 그리 간단하지는 않습니다. 요즘같은 세상에 하드디스크 용량이 1메가만 남았을때 프로그램이 어떻게 동작하는지 테스트하려면 다음중 어떤방법이 가장 좋을까요?

  1. 용량을 채워서 실제로 1메가만 남도록 한다
  2. 하드 파티션을 나눠서 1메가 남은 디스크를 만든다
  3. 1메가의 용량을 가진 샌드박스 만든다.

네 정답은 3번입니다. 물론 마운트 등을 통해서 용량 제한을 줄 수 있지 않느냐 하시는분이 있을수 있습니다. 50K 메모리만 남은 상황에서 시험하고 싶다는 조건이 추가 된다면? 네, 샌드박스 없이는 눈물겨운 뻘짓을 할 수 밖에는 없습니다. 물론 샌드박스 없이도 가능하기는 하고, 실제로 소프트웨어 유닛테스트시에 사용되고 있으나, 여기서는 다루는 영역을 벗어나니 생략합니다.

이렇게 샌드박스를 만들어서 뭔가를 돌리는것을 샌드박싱 이라고 합니다. Isolation 이라는 용어도 사용되고 있으나, 더욱 보편적인 용어는 역시 샌드박싱입니다.

샌드박스는 어떻게 만드나?

샌드박스를 만드는 방법은 다양합니다.

  1. 성능구린 컴퓨터를 하나 사서 프로그램을 돌리고, 바이러스걸리면 포멧한다
    가장 원초적인 샌드박싱입니다. 아주 오래전에는 이 방법이 최선이었지만, 지금은 똥멍청이짓이라고 부릅니다.

  2. 가상머신(Virtual Machine; VM)을 만든다
    가장 확실한 샌드박스입니다만 상당히 무겁다는것이 단점이죠.

  3. 수제 샌드박스를 만든다 - fork-exec, chroot, cgroups, namespace, apparmor etc..
    수제라는 말이 왠지 고급지지만, 소프트웨어에서 '수제'라 함은 원시적이고 노가다중의노가다임을 의미합니다. 리눅스 커널과 그위의 툴을 통해서 샌드박스를 만들 수 있습니다. 독자가 원하지 않을 것 같아서 생략합니다. 원하시는 분 계시면 나중에 추가로 다루도록 하겠습니다.

  4. 컨테이너를 만든다
    컨테이너는 시스템 자원을 공유하면서도, 독립적인 환경과 제약을 만들 수 있습니다. 생성 삭제가 엄청나게 빠르고, 부팅이 필요가 없습니다. 백개고 천개고 만들수 있으며, 허용된 자원을 공유하기때문에 집적도 등의 효율이 높습니다. 가상머신에 비해서 보안쪽 약점이 존재합니다. 또한 독립성과 고립성이 가상머신에 비해 많이 떨어집니다.

컨테이너는 가상머신과 라이벌 존재가 아니라 상호 보완재로 사용됩니다. 제가 하고있는 프로젝트도 VM과 컨테이너를 혼용하고 있으며, 컨테이너 덕분에 복잡한 문제를 많이 해결했습니다. 샌드박싱으로 이야기를 시작했지만, 컨테이너의 사용 범위는 무궁무진합니다. 앞으로 힘이 닿는데로 조금씩 다뤄 보겠습니다. 물론 제가 이론에 약하니, 실제 사용해보는 쪽으로 진행해 보려고 합니다.

감사합니다.


back.png

Sort:  

오오 Docker 관련 연재인가요? 대박 기대됩니다! 저는 이거 개념잡기가 넘 어렵고 막상 실전에 적용할만한 일이 없어서 공부하다 포기했었는데, 실전 강의를 여기서 보게되다니 진짜 기대되네요. 두근두근.

@segyepark님 안녕하세요 ㅎㅎ 도커는 강좌가 인터넷에도 많으니.. 그건아니고, 소개정도 할 계획입니다. 그보단 컨테이너의 내부 원리(?)해서 조금 더 다룬후, runc 쪽을 소개해드리려고 합니다. 도커의 이미지 버전컨트롤이 필요없는 경우엔 runC 가 접근이 쉽고 활용도가 더 높습니다.

오오 이런 설명 더 좋습니다. 뭔가 더 전문가 느낌이네요 ㅋㅋ
저는 진짜로 도커에 관심이 많아서 강좌도 보고 책까지 사서 열심히 봤더랬습니다. 근데 머리가 나쁜지 뭔가 계속 가물가물한게 잘 모르겠더라구요. '이걸 기필코 적용시키겠다' 라고만 하다가는 일이 진행이 안될거 같아서 일단 보류했었는데 항상 아쉬운 마음이 컸습니다. 이번 기회에 감만 잘 잡아갈 수 있다면 저는 정말 만족스러울듯 합니다. 기대하겠습니다^^

맞습니다. 딱 도입이 필요하지 않으면 사실 별로 관심이 가질 않죠 ^^ 이 시리즈는 도커는 거의 안다룰계획이긴 한대 그래도 간접적으로나마 도움 될거라고 믿습니다. 감사합니다.

runC 라니 처음 듣는데 접근이 쉽고 활용도가 높다니 더 기대됩니다. 저는 이 시리즈 대찬성입니다 ㅋㅋ

왜 전 읽어도 모르겠죠 ㅜㅜ. 참 씰링스템프 영상 만들었어요. 봐주세요. ㅎㅎㅎㅎ

읽어서 아시면 큰일납니다.
저는 어떻게 밥벌어먹고 살란 말입니까 ㅎㅎ

비디오 재밌게 잘봤습니다. 차창밖으로 들고 달릴때 현웃 터졌습니다 ㅋㅋㅋㅋ
만드느라 고생하셨겠는데요?

날마다 좋은 컨텐츠를 내주시네요 너무 전문적으로 풀어놓으시는것도 좋지만 이렇게 쉽게 풀어주시는것도 좋은것 같습니당

쉽게쓰려니 너무 비전문적인 글이되어서 신뢰도가 떨어져버리는것같고, 기술적인 부분으로 들어가면 스팀잇의 편집의 한계상 읽기가 불편해져버리고.. 역시 스팀 인터페이스가 가장 큰 안티입니다. 캐주얼한 글로 제한되어 버려요 ㅠ.ㅠ

지금 스티밋의 인원 풀로 봤을땐 캐주얼과 기술적을 반반 섞으시면 어떨까요? ㅎㅎㅎ 한번은 쉽게 읽어주는 독자를 위한... 하나는 개발자 후배들을 위한 약간은 전문적인 글 ㅎㅎㅎ ( 제 욕심 )

ㅎㅎ 이 컨테이너 시리즈 글은 여기서부터는 개발자를위한 내용으로 갈 수 밖에는 없지만, 다른내용을 적게 될땐 양념반후라이드반으로 적어볼게요. 감사드립니다 ^^

@nhj12311님 댓글의 대댓글로 정확히 양념반후라이드반 적으려고 했는데 이게 뭡니까 ㅋㅋㅋㅋㅋㅋ 선수 치셨네요 ㅋㅋㅋㅋ

앗... ㅋㅋㅋ 아재개그 찬스를 빼앗길번 했군요.

다음에는 좀더 신속하게 접근해야겠네요 ㅎㅎ

핰핰핰핰 ㅋㅋ 현웃 이 세계 사람들은 생각하는것도 참...

이 정도의 아재력은 필수죠 ㅋㅋㅋ

VM밖에 생각을 못했었는데, 싱기하네요...

개발자와 비 개발자의 간극을 좁혀주는 글이 저는 제일 마음에 듭니다.
저도 사실상 짭에 속해있기에... ㅋㅋ;

현실에서는, VM 안에 컨테이너 만들어 쓰는경우가 많습니다.
하우스셰어 + 룸셰어 같은 구조랄까요. ㅎㅎ

이 시리즈는 보상 포기하고 적는거지만, 누군가에겐 큰 도움이 될거란 확신은 있습니다 ^^ runc 관련 내용은 다른데서 찾아보기 어려운 내용이라서요.

컨테이너라고 해서 수출용 컨테이너를 생각했.. (아는 만큼 보인다고했나요?ㅋㅋ) 어린이용 샌드박스 이후로 이해 불가네요ㅋㅋㅋ

아... 저의 노력은 물거품이 되었지만, 어린이용 샌드박스까지라도 읽어주셔서 감사합니다. 다음글은 외면해주시길.. ㅜㅜ

[dev]라고 붙였습니다. 또다른 희생양을 막기 위하여 ㅎㅎ 감사합니다!

잘봤습니다.
물리적인 환경에서 가상화 그리고 컨테이너까지 올라가는 개념을 전문성있게 잘 적어주셨네요ㅎㅎ 컨테이너는 VM을 넘어선 차원인 것 같습니다.
사실 10년전에는 가상화라는 기술이 각광받던 시기였는데 그 시기가 너무 빨리 지나가고 클라우드 환경으로 그리고 클라우드 환경에서 컨테이너를 제공해주는게 너무 막강하다보니 IT인력들도 많이 해매는 듯 합니다ㅎㅎ

사실 요즘 클라우드에서 간단히 지원해주니 자세히 알 필요는 없는데, 세밀하게 들어가면 알아야될것들이 좀 있습니다. 세밀하게 들어갈 사람이 거의 없어서 그렇지만..

샌드박스ie 인가 이건 컨테이너 인가요? 너무 허접한 질문인가.. ^^;;;;

샌드박스나 가상머신 하니까 기업용 솔루션중에 재밌는 컨셉의 가상머신이 생각나네요. 기업용으로 가상머신을 거의 안 쓰던 시절(amd 64가 막 나왔던 때) 마라톤이라는 재밌는 가상머신 솔루션이 있었는데 가상머신을 전체를 실시간으로 동기화가 가능했습니다.

하드웨어를 2,3중화 하는 것은 무중단 시스템의 기본이었지만 더 극단적인 컨셉이었죠. 아예 서비스를 가상머신으로 돌리고 가상머신 자체를 미러링 하는..

문득 생각났습니다. ㅋㅋㅋㅋ 마무리가 안되네요 ㅋㅋㅋㅋ큐ㅠㅠㅠㅠ

sandboxie는 윈도우용인데, 써본적도 없고 내부 들여다본적도 없지만 컨셉을 보면 컨테이너에 가까운듯 합니다. 보안에 정말 민감한거라면 안쓰는게 낫습니다. 제가 그거 판매사인 Sophos (영국 옥스포드에있습니다)하고 6개월째 업무협력 중인데, 걔들도 그거 안쓰고 VM쓰고 있습니다. ㅋㅋㅋ

현재 컨테이너는 리눅스기반으로 갑니다. LXC로 시작해서 현재는 Libcontainer로 흘러가고있구요. 윈도우는 앞으로도 따라오기 어려울겁니다. libcontainer자체가 리눅스 커널기반이라 윈도우는 단기적으로는 리눅스레이어를 두고 컨테이너를 써야할거같습니다. 제가 기술동향 본지가 좀돼서 지금은 어떨지 모르지만요.

sandboxie 란 프로그램도 있죠
꽤 유용하더군요. 다만 은행계는 역시 안되기에 은행은 vm을 씁니다..ㅡ,.ㅡ

sandboxie.. 떠흑.. 이더.. ㅜ.ㅜ
다음글을 기대해 주세요. ㅎㅎ

Coin Marketplace

STEEM 0.13
TRX 0.33
JST 0.034
BTC 110258.44
ETH 4278.25
USDT 1.00
SBD 0.83