해당 포스팅은 Docker, 더 나아가 micro service architecture에 대해 배우기 위해 전반적인 학습의 틀을 형성하는 포스트입니다. 3편부터 직접적으로 Docker를 사용하고 이전까지는 앞으로 배울 것에 대해 알아야하는 개념에 대해 포스팅하는 것이니 참조하세요!
들어가기 전에_
기존 process management 카테고리는 application management로 변경되었으며 포스팅 목표가 MSA(micro service architecture)로 변경되었습니다.
지금은 디스코드 봇은 잠시 멈췄다. 그 이유는 디스코드 봇을 배포하는 방식을 Docker로 바꾸고 있으며 추후에 봇 서비스뿐만 아닌 "activity" 및 타 서비스로 확장하기 위해이다. 뭔가 거창하고 벌여놓는 거 같은 기분이 들면서도 때론 이렇게 많은 것을 배울 수 있다는 것에 행복감을 느낀다😊
1. Docker와 Container를 만나기전에 _
여러분은 개발 공부 또는 간단한 프로그램 개발을 하면서 간단히 코드를 테스트하거나 추가적으로 동일한 환경을 만들어야 했었던 적이 있었나요? 저는 개발을 처음 배웠을 때 디스코드 봇을 만들면서 간단한 api 테스트를 하거나 아니면 웹서버 테스트를 위해 nodejs 환경과 추가적인 라이브러리를 설치해야 했었습니다. 이러한 환경을 몇번 반복하며 생성하다 보니 때론 버전문제나 알 수 없는 오류로 인해 결국 배치 파일을 이용해서 자동으로 환경세팅과 파일 생성, 라이브러리를 설치를 하도록 만들었어요.
그때보다 성장한 지금 예전에 했었던 고민은 서비스 배포때 똑같이 하게 되었습니다. 분명 똑같이 했는데 버전 문제가 생기고..., 어디선가 누락된 것이 생기면 다시 찾아보고.., 테스트 환경에서는 잘 됐는데 클라우드에서는 안 되는... 이러한 문제를 겪게 되었고 이것을 해결하기 위해 찾아본 결과 Docker와 Container를 알게 되었습니다.
2. Docker란?
2-1. 애플리케이션의 developing, shipping 그리고 running 하기 위한 오픈 플랫폼
쉽게 풀어 설명하자면 Docker는 애플리케이션을 개발 및 테스트, 릴리즈, 배포와 운영을 모두 할 수 있도록 개발된 프로그램입니다. 도커는 컨테이너를 관리하며 모든 컨테이너에게 동일한 host를 제공하고 통일된 환경을 보장합니다.
2-2. 동일한 host? 통일된 환경?
챕터 1에 언급한 것처럼 개발과 테스트, 운영 서버의 환경은 모두 동일해야 개발한 것을 정확하게 테스트하고, 해당 결과를 통해서 운영 서버에 배포해야 테스트 결과를 보장받을 수 있습니다. ( 당연한 말처럼 들리죠? )
하지만 적은 인원이 모든 환경조건이나 애플리케이션을 담당한다면 비교적 덜 하지만 실제로는 여러 사람이 관여하기에 개발 -> 테스트, 테스트 -> 운영(ex. cloud)으로 넘어갈 때 환경설정이나 조건, 버전의 불일치로 인해 시간을 많이 허비하거나 예상치 못한 오류가 발생할 수 있습니다.
2-3. Docker가 문제를 해결하는 방법
1. 개발 컨테이너
2. 컨테이너 패키징
3. 컨테이너 공유
4. 패키징 된 컨테이너 실행 [ 동일한 환경 구성 ]
2-2와 같은 문제를 해결하기 위해서 작은 os와 비슷한 컨테이너를 애플리케이션 배포단위로 지정한 다음 컨테이너를 통째로 압축(일반적으로 패키징이라 부릅니다. 따지자면 압축은 틀린 표현이지만 쉬운 이해를 위해 사용하였습니다.)과 비슷한 과정을 거쳐 개발 서버에서 테스트로, 테스트 서버에서 운영 서버로 동일한 컨테이너를 배포할 수 있습니다.
3. 이쯤 되면 궁금해지는 Docker의 배포단위 " Container "
⁕ 짚고 넘어가야 할 것
-> 왜 유사 OS라 칭할까요?
컨테이너는 독자적인 파일시스템, 네트워크 체계등 OS와 비슷하지만 host와 동일한 kernel을 사용하기에 가상의 os를 생성한 것과는 다릅니다. 그러기에 쉽게 이해하기 위하여 "os와 유사하다"라고 표현한 것입니다. 실제로는 해당 명칭을 사용하지 않는다는 것을 주의하세요.
도커의 기능의 핵심인 Container와 이것을 공유할 수 있도록 하는 기능 Image
컨테이너는 쉽게 말해 유사한 작은 os와 같으며 도커 아래에 격리된 환경을 제공합니다. 즉 다른 컨테이너와 도커(host)에 의존하지 않습니다. 또한 해당 컨테이너를 작업하면서 똑같은 컨테이너를 생성할 수 있는 정보가 들어있는 파일인 "image"를 생성하여 해당 컨테이너의 환경과 어플리케이션을 복사 할 수 있으며 복사된 모든 컨테이너는 image에 의해 동일성을 보장 받습니다.
4. 찾아보니까 Virtual machine도 비슷한 거 같은데 Docker를 왜 더 선호하는 걸까?
Vm은 컨테이너와 유사하지만 vm은 host와 분리되어 있는 가상화된 커널을 사용하는 반면 컨테이너는 host와 커널은 공유하나 격리된 환경을 제공한다는 큰 다른점이 있으며 이는 실행속도 및 사용되는 리소스에 큰 차이를 보입니다. 즉 vm과 컨테이너를 사용한 도커는 애플리케이션 단위에서는 큰 차이는 없어 보이지만 도커는 더 효율적인 리소스를 사용하기에 특수한 경우가 아닌 이상 VM보다 Docker를 더 선호하는 경향이 있습니다.
요약
도커
애플리케이션을개발 및 테스트, 릴리즈, 배포와 운영을 모두 할 수 있도록 개발된 프로그램
컨테이너
host에 의존하지 않는 애플리케이션 배포 단위이며 패키징이 가능해 컨테이너 자체를 공유할 수 있으며 공유된 모든 컨테이너는 Image에 의해 동일성을 보장받음
이미지
컨테이너를 생성할 때 사용되는 템플릿으로 이미지는 환경셋팅, 라이브러리, 설치된 프로그램부터 어플리케이션까지의 모든 정보를 저장할 수 있다.
마지막 말
도커, 컨테이너의 개념을 짚고 넘어가는 것이 앞으로 나올 docker - client / server (client - server architecture)와 같이 개념을 심화적으로 배우거나 실제로 docker를 사용하면서 kubernetes와 같이 응용된 버전을 사용하기위해서는 필수적으로 배워야 했기에 한번 집고 넘어가 보았습니다. 기반을 탄탄하게 다진다면 그 위에 무엇을 올려놓아도, 설령 그것이 아주 낯설고 복잡하더라도 충분히 소화해 낼 수 있다는 것을 믿어 의심치 않기에 앞으로 몇 번 개념 요약 후 여러 가지 테스트를 포스팅할 예정입니다.
고쳐야 할 부분이나 추가적인 내용, 궁금한 내용이 있다면 질문해 주세요!
'cloud > docker' 카테고리의 다른 글
MSA 공부 <4-1 편> | Container 생성해보기 (0) | 2024.11.11 |
---|---|
MSA 공부 <3편> | Docker engine 설치하기 (0) | 2024.11.09 |
MSA 공부 <2편> | Docker architecture 파해 쳐 보자 (0) | 2024.09.20 |