본문 바로가기

Docker

도커가 정확하게 무엇이며 왜 사용해야하나요?

도커는 컨테이너를 생성하고 관리하기 위한 도구이다. 

소프트웨어 개발에서 컨테이너란 무엇이며 왜 사용해야 하는가? 
소프트웨어 개발에서의 컨테이너는 '표준화된 소프트웨어 유닛' 을 의미한다.   표준화된 유닛은 기본적으로 코드 패키지이며 코드를 실행하는데에 필요한 종속성과 도구를 모두 포함하고 있다.

말이 참 어려운데, 어떠한 애플리케이션을 실행/개발하기 위한 모든 도구들을 컨테이너에 모아놓고, 필요에 따라 꺼내쓰면서 항상 동일한 환경을 만들어준다는 의미이다. 

 

실 생활을 예를 들어 설명해 보자. 

나는 평소에 공원으로 피크닉을 자주가는 사람이다.  피크닉을 가기 위해서는 사전에 준비를 해야 할 것들이 있다. (접시,  컵,  포크, 나이프, 등등등)

매번 피크닉을 갈 때마다 이것들을 하나씩 준비한다면 시간도 많이 걸릴 것이고 놓치는 부품도 분명히 발생할 것이다. 

사전에 [피크닉 바구니] 를 만들어서 미리 필요한 것들을 모아놓는다면? 피크닉을 갈 때 간단하게 바구니만 쓱 들고 가면 끝이지 않겠는가

이 바구니에는 필요한 모든 것이 있기 때문에 내가 가고자 하는 곳을 마음껏 갈 수 있고

심지어 피크닉을 좋아하는 다른 친구에게 내 바구니를 공유해서 나와 동일한 환경을 만들어줄 수도 있다. 

 

이 피크닉 바구니가 컨테이너라고 보면 된다.  그리고 이 바구니를 관리하고 생성해주는 친구를 도커라고 한다. 

 

도커를 사용하면  소프트웨어 유닛 , 코드가 포함된 패키지 및 코드를 실행하는 종속성을 컨테이너에 보관할 수 있으며 도커가 실행되는 모든 곳에서 이를 가져올 수 있다.  그러면 동일한 환경에서  정확히 동일한 애플리케이션을 실행할 수 있게 된다. 

모든 것이 컨테이너에 있기 때문에 애플리케이션을 실행하려는 위치에 추가도구를 설치하는 것에 대해 걱정할 필요가 없다.  (바구니에 나이프가 없는데 나이프를 집어넣으면, 다음 바구니에서는 손쉽게 사용할 수 있으므로)

 

ㅇ_ㅇ 대박

 

그래서 결국  왜 ! 소프트웨어 개발에서 독립적인 표준화된 애플리케이션 패키지를 원하는 걸까? 

개발을 하다보면 하나의 개발 환경이 아닌 다른 여러가지의 개발환경에서 코드를 작성하는 경우가 발생될 수 있다. 

예를 들어,  내가 어떤 노드JS 서버를 구동하는 애플리케이션을 생성했다고 가정해보자 

내 로컬 PC는 노드JS 버전이 14.3이기 때문에 await 문법이 문제없이 잘 동작이 된다. 

(await  는 노드버전 14.3 이상부터 사용할 수 있다.)

이 애플리케이션을 호스트하기 위해 원격 시스템에 배포를 하는 과정에서 만약에 노드 버전을 14.3 미만을 설치한다면?

로컬에서 작동이 가능했던 이 앱은 원격에서는 제대로 동작하지 못하게 되고, 원인을 파악하는데 상당한 시간이 소요될 수 있다. 
따라서 특정 노드버전을 도커 컨데이너에 고정해 항상 정확한 버전으로 실행하여 개발 환경을 맞추는 것이 좋고 

이러한 환경 설정으로 인해 버전충돌과 같은 잠재적인 문제를 사전에 없앨 수 있다. 

 

다른 예시로는 팀이나 회사 내에서 개발자들이 사용하는 개발 환경이 전부 달라 충돌이 발생될 수 있다는 점이다. 

위와 비슷한 사례로, 나는 노드JS 14.3 버전 이상을 사용해서 await 문에 문제가 없는데 

내 동료는 14.3 미만의 버전을 사용한다면 앱이 정상적으로 구동되지 않을 것이다. 

 

혼자 작업할 때도 매우 유용하다.  작업중인 프로젝트가 여러개일 때 충돌하는 버전이 분명히 발생될거다.

따라서 프로젝트마다 컨테이너를 만들어서  해당 프로젝트 수정이 필요할때만 컨테이너에 접근해서 작업을 한다면

로컬에 있는 환경을 매번 바꿀 필요가 없어진다. 

 

'Docker' 카테고리의 다른 글

버츄얼 머신으로 해결할 수 있지 않나요?  (0) 2023.08.13