Dev/Deployment

[Docker] Docker

隣席の開発者群 2023. 8. 2. 13:43
반응형

 

자 지난 글에 이어서 도커 가져왔다. 일단, 이 얘기를 시작하기 전에 도커를 사용한다는게 요즘은 되게 흔한 일인데, 뭐 얘기만 했다하면 도커 공부하고 있고, 도커 써봤고 배포까지 직접해봤고 (쿠버네티스도 포함임) 등등 개발자의 기본 소양처럼 이야기가 되고 있다. 

좋은 현상이라고 생각함. 애초에 코딩을 넘어서, 개발자가 기획단계에서 부터 실제로 배포되는 단계까지 전적으로 매니징을 할 수 있어야 의미가 있다고 생각하기 때문이다. 

그렇다고 해서 막 엄청나게 공부를 열심히 해야한다 이렇게 얘기하기도 뭐한게 늘 하는 말이지만 기술이라는건 불편을 해소하기 위해 만들어진거다. 처음에 뭣도 모르고 들여다보면 그냥 겁먹을 수밖에 없지만, 까고보면 아니 이렇게 불편했던걸 이렇게 편하게 만들어준다고?! 정도 밖에 안됨. 그래서 신입, 초급 개발자들도 겁먹지말고 무언가 해야만 하는 일을 더편하게 해주는구나~ 정도의 마음가짐으로 받아들이길 바란다. 

 

1. Docker는 왜, 뭐가 불편했길래 사용되는걸까?

1) 어떻게 좀 프로그램 구동환경 생각 안하면 안되나? (Image)

 

뜬금 없긴 하지만, 많은 개발자들이 개발환경 세팅이라는걸 당연하게도 접한다. 근데, 그걸 맨날하는거도 아니고, 개발들어가기 전에 딱 한번씩 해둔 뒤에 또 까먹고, 다음 프로젝트 들어갈 때 즈음 되면 어?! 어떻게 했더라..? 하면서 또 구글링 하는게 일반적인 관례임. 그리고 그 와중에 몇 번을 해도 제대로 못하는 사람들이 존재한다. 안된다고 그러면 "왜 안돼..?" 라고 하거나, 된다고 하더라도 "왜 돼..?" 라고 하는 경우가 무조건 있음. (실제로 겪어보면 전자보다 후자의 경우가 제일 무섭다. 귀신이 곡할 노릇이라는 말은 진짜 후자의 경우에 쓰는거임.)

 

이 환경 세팅이라는게 사실 개발할 때만 적용되는게 아니라, 개발 후에 배포되는 컴퓨터에서도 세팅이 되어야 정상적으로 실행이 가능하다. 뭐 Spring을 예로 들면, 필요한 라이브러리라던가,  JDK 라던가 등등 이런게 존재해야 내가 만든 코드도 멀쩡하게 잘 돌아가는데, 이거 매번 하면서 ㅇ? 왜 (안)돼..?를 매번 반복하자니 스트레스가 극에 달한다. 

이걸 해결하기 위한 솔루션으로 Docker를 적용가능하다. 

 

2) 한 큐에 쿨하게 내가 원하는 프로세스를 시작하거나 종료하거나 할 수 없나? (Container)

 

Docker를 사용하면 내가 만든 코드 하나 실행시켜보겠다고 IDE를 켜고, 빌드를 하고 실행을 시키고, 이 절차를 모두 스킵할 수 있다. 앞서 말한대로 환경 세팅은 다 되어있으니, 커맨드 한번 입력, 버튼 한번 클릭하는 정도로 내가 만들어둔 프로그램들 중 원하는 프로그램을 실행시켜서 사용할 수 있다는 점이 상당히 좋다. 

 

3) 컴퓨팅 자원을 프로세스마다 따로따로 명확히 나눠줘서 효율적으로 관리할 수는 없나?  (Container)


Docker를 사용하면 여러 개의 프로그램을 돌린다고 하더라도, 그 프로세스들이 사용하는 컴퓨팅 자원의 경계를 명확히 구분지어 놓을 수 있다. 이로 인해서 각 프로세스들이 독립된 환경 (서로 다른 컴퓨터) 에서 실행되는 것과 비슷한 효과를 누릴 수 있따는 장점이 생긴다. 

 

 

2. Docker를 사용하기 전에

위에 사용하는 이유를 쓰면서 옆에 괄호로 조그맣게  Image, Container를 써뒀는데 이게 바로 Docker사용에 있어서 가장 중요한 것들이자 저 불편들을 해소하기 위한 개념들이다. 이것들에 대해서 차근차근 이야기를 한번 해보자. 

 

1) Container

Container에 대한 이야기부터 먼저 한번 해볼건데, 이 Container라는 말이 Docker에서 부터 시작된 것은 아니다. 

개발관점에서 가장 도움이 되는 OS가 뭐냐고 묻는다면 당연히 Linux일건데, 이 Linux가 자체적으로 제공하는 프로세스 격리 기능이 있다. LXC라고 함. 이게 최초의 Container다. 하여튼, 여기서 부터 Container는 시작이 되었는데 뭐 이런 얘기는 머리만 복잡하니까 미뤄두고, 간단히 설명해서 여러 개의 프로그램이 실행이 되고 있다고하면, 그 실행되는 것들끼리 요만큼이 내가 쓸 메모리, CPU고 이만큼이 니가 쓸 메모리, CPU야. 라고 말하듯이, 철저히 격리시켜서 실행시키기 위한 개념이라고 보면 되겠다. 

설명이 부족한 것 같으니 그림을 통해 더 얹어보자.

요게 이제 좀 유명한 그림인데, 도커 얘기를 하면 절대로 빼놓을 수가 없는 이야기다. 

처음에는 그냥 컴퓨터에서 Application 갖다 돌리면 끝이었음. 그리고 다양한 Application을 실행시켜야하는 경우가 많아지면서, 각 경우에 따라 (뭐 같은 라이브러리를 쓰는데, 그 라이브러리를 버전이 다른걸로다가 쓰는 프로그램이 둘 있다거나 등등 ) 환경세팅을 다르게 해야하는 경우가 하나 둘 씩 발생했는데, 가장 단순한 방법은 이런 경우가 생길 때마다 PC의 수를 늘리는 거였다. 근데 그러자니 돈이 너무 많이 드는거다. 프로그램 하나 돌리는데 몇백만원짜리 컴퓨터를 덜컥덜컥 사자니 돈이 아깝지 않은가.. 

그에 대한 해결책으로 이제 가상 머신이라는게 등장했다. 말 그대로 하나의 컴퓨터 위에 여러 개의 가상 컴퓨터를 만들어 놓은건데, 그 가상 컴퓨터 마다 다른 환경을 설정해둘 수 있으니 컴퓨터를 여러 대 구입하지 않아도 여러 개의 환경을 구성할 수 있도록 한 것이다. 근데 이게 진짜 치명적인 단점이 있다. 각 머신마다 OS (Linux)를 일일히 하나씩 설치 해두다보니 우린 어플리케이션만 돌리면 되는데 쓸데 없는 자원소비가 많아지는거다. 당연히 그로 인해서 성능저하 이슈도 발생했고, 운영환경에서는 사용이 쉽지 않았던거다. 그래서 이제 또 새로운 대안을 찾아야하는 상황이 온거임. 

이제 Container라는 개념이 등장한다. 이제 여기선 그냥 실행 프로세스 자체만 격리시키는거다. 컴퓨터가 여러개 있는 듯한 환경이 아니라, 그냥 프로세스들을 격리하는 방식을 통해서 자원사용량을 최대한 가볍게 하고, 성능 역시 향상시킬 수 있는거임. 

 

그리고 이 Container의 형태로 프로세스 격리를 아주 쉽게 할 수 있게 해주는게, Docker다.  

 

2) Image

이미지를 이해하는 방법은 아주 쉽다. 앞에서 제시했던 불편한 점을 그대로 생각하면 되는데, 환경 세팅을 다 해둔 가상환경 템플릿이라고 생각하면 된다. Java로 치면 JDK 깔아서 Path잡을 필요 없고, 걍 DockerHub에서 Image만 딱 받아와서 실행만시켜주면 거긴 이미 JDK가 깔려있다 이 말임.

그래서 이 Image를 바탕으로 실행시키고 싶은 프로세스를 같이 담아서  실행만 딱 시켜주면 끝난다고 보면 되겠다. 

이런 Image의 성격을 바탕으로 개발한 프로그램을 PC로 이식한다거나 추가적으로 확장한다거나 하는게 상당히 용이해지기 때문에 (그냥 이 Image만 갖다 놓고 도커 실행시키면 끝남.) 요 근래 각광 받는 MSA 처럼 확장성을 중요하게 생각하는 개발의 경우에 사용하면 크게 도움이 된다고 볼 수 있다. 

 

 

기초적인 개념은 이 정도가 다고, 더 깊게 봐야할게 Layer나 Image를 생성한다거나 하는 등 실질적인 사용방법에 대해서 알아봐야하는데, 고거부터는 다음 글에서 작성하도록 하겠다.

 

LIST