도커가 도대체 뭘까요..

도커가 뭔데? 하고 인터넷에 검색하면 Docker란 리눅스 컨테이너에 리눅스 어플리케이션을 프로세스 격리 기술을 사용하여 가상화하여… 라는 글이 보통 나옵니다.

그러면 어.. 그럼 가상화는 뭐고 격리는 또 왜하는건데…. 라는 생각이 저는 들었습니다.

새로운 기술을 배울 때 제가 생각하는 가장 좋은 방법은, “그래서 이거 왜 씀?” 에 대한 답변을 먼저 찾는 것입니다.

그래서? 도커가 없었을 때 왜 삶이 피폐했는지, 도커가 어떻게 삶의 질을 향상시켰는지? 이야기를 하려고 합니다.

도커가 없던 먼 옛날..

(설명을 위한 과장이 포함되어 있습니다.)

개발자 A는 Node로 월급을 받아서 다음달 월세를 내고 있습니다. Node 20으로 우분투에서 서버를 짭니다. 그리고 우분투 EC2 두대에 Node 20을 깔고 서버를 배포합니다. 잘 동작해요! A는 행복합니다.

그리고… Node 22가 나왔습니다. 신버전 나왔으면 깔아야겠죠? A는 자기 로컬에서 노드를 22 버전으로 올리고, 다시 개발을 열심히 합니다.

그리고 서버에다가 코드를 올렸더니.. 앗! 서버 노드가 20이라 뭔가 잘 안 됩니다!

그래서… A는 각 서버에 접속해서 Node를 22로 업데이트 하고.. 다시 서버를 굴립니다. 아무튼? 예상치 못한 이슈가 생겨서 노드 버전 올린다고 한 한시간쯤 까먹긴 했지만, 아무튼 돌아가니 행복합니다.

그리고… 사업이 잘 되어서 새로 동료가 들어옵니다. 새 동료는 자기는 맥북이 너무 편해서 맥북을 쓴다고 합니다. 쓰고싶으면 써야죠..

그리고 뭔가 동료가 새 기능을 올립니다. 음.. 동료 컴퓨터에서 도는거 보니 잘 도는 것 같습니다. 그리고 서버에 올립니다.

앗! 뭔가 MacOS에서는 도는데 우분투에서는 안 도는게 있는 것 같습니다. 어… 뭐가문제지? 일단 또 롤백합니다.

그리고 도와주려고 pull 땡겨서 제 로컬에서 돌려봅니다. 근데 안 도네요. 그래서 옆자리 동료한테 가니 거기서는 또 잘 돕니다.. 아.. 머리가 아픕니다.

일단 또 어떻게어떻게 하다 보니 이 라이브러리 문제인 것 같습니다. 아무튼 고치고 배포하니까 또 돌아가니까 행복합니다.

앗! 그 사이에 우리 사업이 좀 잘 되어서, 서버를 증설해야 할 것 같습니다. EC2를 2대 추가로 띄웁니다. 그리고 Node 22 버전을 다시 깝니다. 그리고 서버를 배포합니다. 와! 잘 돕니다. A는 다시 행복합니다.

그리고.. 새로운 기능을 만들어서.. 또 서버 4개에 배포합니다.

앗! 근데 최근에 추가한 서버에서는 잘 도는데, 예전 버전 서버에서는 안 돕니다. 뭐지? 똑같은 노드 22인데? 하고 버전을 쳐 보니, lts 버전으로 깔았는데 최근에 추가한 서버는 node v22.13.0이고, 예전 서버는 node v22.1.0이네요. 아…. 일단 옛날 서버에서 노드 버전을 일단 올려봅니다.. 아… 최신 버전으로 올렸더니 이번엔 node v22.14.0이 깔렸네요.. 또 버전이 다릅니다….. 그럼 신규 서버도 일단 버전 올려서 맞춰야겠네요.

EC2 4대까진 할만합니다. 근데 서버가 8대면..? 16대면…?

환경 정리가 안 되니까 삶이 고달파집니다

물론? 위 예시는 과장입니다. 사실 Node 위에서 도는 라이브러리는 OS따라 돌던게 안 도는 경우는 이미지처리 하는 경우가 아니면 흔하진 않습니다. 또 노드 마이너 패치한다고 서버가 깨지고 잘 그러진 않습니다.

(물론 Python으로 서버 짜고 있으면 이야기가 다릅니다.)

근데 서버에 깔려있는게 Node 하나밖에 없을까요? Nginx 혹시 쓰시나요? OS Binary 의존성 있는 라이브러리 혹시 하나라도 있나요? 그거 버전 다 맞출 자신이 있을까요?

그래서? Docker가 나왔습니다

매번 저러지 말고 그냥 OS째로 말아서 올려버리는건 어떨까요?

우분투 24.04에, Node v22.14.0 깔고, Node 라이브러리 다 깔아서 node_modules 폴더 있는 째로 저장하고, 이미지 처리하는데 쓰는 Binary 파일도 미리 받아놓은 이미지 란걸로 만들어서 딱 해당 이미지를 실행만 시키면 되게 만들면 어떨까요?

그리고 서버에는 Node도, node_modules도, Binary 파일도 다운받지 말고 딱 미리 만들어놓은 저 이미지를 실행만 시키면 어떨까요?

서버에는 저 이미지를 실행시키는데 필요한 Docker Engine이라는 프로그램만 설치해 두면, 고달픈 삶으로부터 벗어날 수 있습니다!

그게 바로 도커의 아이디어입니다.

Docker를 쓰면 뭐가 좋을까요?

대충 이해하셨죠?

그래서 도커를 쓰면, 다음이 달성 가능합니다.

  • 아무튼, 도커 이미지가 “돌기만” 하면 동작 자체는 같음을 보장합니다.
  • 서버에 직접 하나하나 깔 필요 없이, 도커 엔진을 깐다 -> 이미지를 땡긴다 -> 이미지를 돌린다. 로 프로그램 실행을 표준화 할 수 있습니다.

여기서 설명은 안 했지만 이런 장점들도 있습니다.

  • 신묘한 가상화 기술로, 각 컨테이너 (실행 중인 이미지를 컨테이너라고 합니다) 는 격리된 환경에서 실행됩니다. 쉽게 말하면, 환경 꼬일 걱정 없고 한 컨테이너가 털려도, 시스템상 격리되어 있어 다른 컨테이너까지 털어먹기 어렵다는 뜻입니다.
  • 이미지 용량이 작고 성능저하가 적습니다. 호스트 머신(= 서버) 의 성능의 거의 대부분을 성능 손실 없이 사용할 수 있습니다. 기존 VM 기술은 성능을 꽤 많이 깎아먹었거든요.

그래서? 이제 도커가 뭔지도 알고 왜 쓰는지도 알겠어. 까지 오셨으면? 어떻게 쓰는지는 인터넷에 찾으면 대충 나옵니다.

개인적으로는 생활코딩님의 Docker 입문 수업을 추천합니다. 설명 정말 잘 해주세요!

그리고, Docker 쓰는 법을 배우셨으면 Docker compose 를 이용해서 복잡한 도커 컨테이너를 제어하기 까지 배워보시는걸 강력하게 추천합니다. Docker를 알고 있다면 어렵지도 않고, Compose로 환경 구성하는 경우가 정말정말 자주 있습니다. 꼭 여기까지는 배워두는걸 추천드립니다!

감사합니다! 기존에 보시던 가이드에서 다시 봐요!