DevOps

Docker 정복 하기 이론 편

devdubu 2023. 2. 27. 08:49

Docker에 대한 이야기는 매우 많이들 있다.
하지만, 제대로 그 개념을 아는 사람들은 거의 없죠

저도 Container를 다루는 개발자이지만, 이 Docker를 다른 사람들에게 설명하려면 정말 혀를 내두를 정도로 범위가 방대하다.

이유인 즉, 대부분의 이제 개발자가 되고 싶으신 분들 혹은 갓 개발자가 된 분들은 프론트, 백엔드 정도까지만 들어보셨을 것이다.
인프라 라는 용어가 어디서인가 들어는 봤는데 뭘 하는지 구체적으로 알진 못합니다.


그리고 인프라를 하려면 우선 CS 지식을 엄청 나게 잘 알아야해! 하면서 겁을 먹고 잘 안하십니다.

매우 복잡한 학문이라면서 기피대상 1순위 느낌이 나죠.


저부터도 기피 했으니까요 ㅎ

 

그런데 Container가 나오고 나서 이상하게 프론트, 백엔드 개발자 분들이 Docker를 사용하시려고 합니다.
제가 왜 여기서 이상하게 라는 말을 사용했을까요?

Docker는 인프라 기술 입니다.

네 맞습니다. 여러분들이 회피하는 그 분야 인프라,, Docker는 사실 인프라입니다.
Application Level이라고 누군가가 알려준건지..는 잘 모르겠지만, Container라는 기술은 인프라입니다.


그러니 인프라에 대한 지식이 부족하면 다룰 수가 없는 분야가 Container라는 기술입니다.

즉, Container라는 기술을 다루려면 Infra를 알아야하는 얘기랑 똑같습니다.

 

그러면 어플리케이션 개발자들은 컨테이너 신경 안써도 되겠네요?
라고 물으신다면, 솔직히 그건 아니라고 생각합니다.

 

기본적으로 본인의 회사에서 컨테이너라는 기술을 쓴다면, 그걸 가지고 활용하진 못하더라도 기술에 대해서 이해를 해야지
테스트도 하고, 구동 자체를 할 수 있습니다.

하지만 이해하지 못한다면, 구동하는 것부터 에러를 확인하는 것까지 처음부터 끝까지가 도움이 없으면 일이 진행이 되지 않겠죠.

 

저도 많은 지식을 아는 것은 아닙니다.
Docker를 다루기 위해서 최소한의 infra지식만을 가지고 있습니다.

 

다른 분들이 저와 같진 않겠지만, 최소한 제가 소개시켜드리는 지식만으로 Docker를 조금이라도 더 이해하는데 도움이 될거라고 생각이 듭니다.

가상화

기본적으로 컨테이너는 가상화 기술의 발전형이라고 생각하면 된다.
가상화 시스템이 무엇이고, 가상화가 왜 필요한지를 알게 되면, Docker도 왜 탄생했는지를 알 수 있다.

가상화가 왜 필요할까?

http://redhat.com/ko/topics/virtualization/what-is-virtualization
RedHat에서 잘 설명하는게 이 부분이다.
가상화가 왜 필요한지

 

가상화를 쓰지 않고, 우리가 쓰는 노트북처럼 1컴퓨터(하드웨어)에 1운영체제(서버)를 사용한다면, 안그래도 개인용 pc도 200만원이 넘어가는 시대에


회사 입장에서는 그 비싸다는 서버컴을 사놓고, 1개의 프로젝트 때만 사용할 수 있게 된 것이다.

만약 그 플젝이 망하면?


그렇게 된다면, 위험부담이 크기 때문에 애초에 투자를 안하겠죠.

소위 말해 가성비가 매우 떨어지죠

 

그렇지만 그럴 순 없기 때문에, 있는 자원(컴퓨터)를 효율적으로 사용하기 위해서 해당 기술을 이용하는 것이다.
그런 배경에서 가상화가 나왔다.

컨테이너 기술 발전

 

  • 컨테이너의 기술의 발전을 알기 위해서는 기업들이 어떻게 서비스를 효율적으로 운영할 것인가에 대한 고민을 해보면 됩니다.
    • 비용효율성
    • 어떻게 하면 컴퓨팅 자원을 잘 활용할까

Traditional Deployment

  • 하나의 서버에서 모든 App을 구동하는 방식

문제점

    • 하나의 서버에서 모든 서비스를 돌리게 된다면, 공유하는 라이브러리 때문에, 충돌을 일으킬 수 있다.
    • 어플리케이션이 서로 버전이 맞지 않아서 생기는 이슈 등
어떻게 하면, APP을 격리 할 수 있을까?

Virtualized Deployment

  • 가상머신을 이용한 가상화 방법
  • OS 위에, Hypervisor라는 가상 머신을 관리하는 툴이 올라가게 된다.
  • 그 위에는 이제 각각의 Virtual Machine이 올라가게 됩니다.

Hypervisor

  • 해당 컴퓨팅 자원들을 애뮬레이팅 하여 Guest OS에 할당 해준다.
  • 컴퓨팅 자원들을 각각의 Virtual Machine에 할당을 해준다.

문제점

  • 하드웨어를 애뮬레이션을 거쳐서 들어가기 때문에, 성능의 효율성이 떨어진다.
  • Hypervisor를 띄우기위한 컴퓨팅 자원(RAM)에 대한 공수가 꽤 들기 때문에, 해당 자원의 오버헤드가 늘어납니다.

Container Deployment

  • 위의 성능 문제, 자원 문제, 격리 문제 등등을 모두 해결하기 위한 기술이 Container라는 기술입니다.
  • Docker 라고 그림에 나와있지만, 실제로는 Docker Engine이며, hypervisor랑 비슷한 개념이라고 생각하면 됩니다.
  • Docker = Contaier는 아닙니다.
    • Docker는 Container 기술 중 한개에 불과하지만, 업계애서 Container 기술의 표준이기 때문에 Docker를 Container라고 표기 한 것입니다.
    • Container Engine이 Docker Engine일 경우 Docker라고 부릅니다.
  • 추가로 격리 기술이 들어갑니다.
    • chroot를 이용한 파일 격리
    • namespace를 이용한 Network, Process Id를 격리
  • 여러가지 Docker를 격리하기 위한 툴인 것이다.
  • 자원의 효율도 CPU를 애뮬레이션하는 것이 아니기 때문에 효율성이 매우 높습니다.

Kubernetes Deployment

  • Container orchestration system
    • -> 여러 서버에서 클러스터 환경에서 어떻게 하면 Container를 잘 관리 할 수 있을까에 대한 목적으로 만들어졌습니다.

Network

인프라 기술에서 가장 중요한 부분인 Network 파트이다.

 

Network는 보안, 서비스 품질 등 가장 중요한 요소를 차지하고 있는 부분이기에, 알아둬서 나쁠게 하나도 없다.

우선 Network에서 필 수적으로 알아야할 몇가지를 소개하자면,

IP

보통은 ip address 즉, ip 주소 라고 표현을 많이 한다.
위키 백과에서 보게 된다면,

컴퓨터 네트워크에서 장치들이 서로를 인식하고 통신을 하기 위해서 사용하는 특수한 번호라고 합니다.
말 그대로 주소 입니다.

 

보통 예시를 들 때는 택배의 예시를 듭니다.
만약 저희가 택배를 시킨다고 가정을 합니다.

 

만약 택배를 시킬때 제가 사는 지역이 서울 이라고 한다면, 주소란에 서울만 작성하면 택배가 올바르게 올까요?

당연히 아닐겁니다.

 

그러면 어떻게 해야할까요?

뭐 다들 아시다 싶이 도로명 주소까지 자세히 동, 호수까지 적어주고 해야지 택배가 오겠죠?
IP도 그러한 경우 입니다.

 

 

왜 이런 복잡한 수가 탄생이 됐을까 생각을 해보면 주소를 생각하면 됩니다.
정확한 주소를 알기위해서는 최대한 자세하게 쓰는 것이 원칙입니다.


그렇기에 숫자가 많은 것이고, 인간은 문자를 쓰지만, 컴퓨터는 그냥 이진수를 이용해서 쓰는거에 불과합니다.

동적 IP, 고정 IP

고정 IP

말 그대로 IP주소가 고정되어있다는 얘기 입니다.
음,,예를 들어보자면, 다들 잘 아시는 롯데타워로 예를 들다면, 롯데타워가 부서지지 않는 이상, 도로명 주소에 롯데 타워를 검색하면
주소가 똑같이 나옵니다.

즉, 정말 특별한 일이 아닌 이상 건물은 그 자리에서 이동하지 않습니다.

이동하지 않는 대신 자리세를 내야하죠, 그 대가로 땅 값을 지불하고 건물을 짓는거죠

고정 IP도 이와 같은 개념입니다.
고정된 주소자리세를 내고 사용을 하는 거죠.

동적 IP

동적 IP는 그러면 무엇이될까요?
비유를 들면 우리 같은 사람들 입니다

사람들 중에서는 한 자리에 오래 머무르는 사람이 있을 수 있고, 어떤 사람들은 매년마다 이사를 나아가는 사람들이 있습니다.


즉, 내부적 요인, 외부적 요인에 의해서 사람들이 사는 주소는 지속적으로 변경이 되거나 변경 될 가능성이 있죠.

그래서 저희는 집을 구할 때 매매, 전세, 월세 라는 걸로 집을 구합니다.


매매(동적IP)처럼 처음에 거금을 구하고 사는 것도 있지만, 보통은 이사할 것을 생각하여 전세, 월세(동적 IP)를 생각합니다.

 

일정기간 동안 계약을 하고 계약이 끝나면 계속 살지, 아니면, 이사를 갈지를 결정하죠.

이처럼 동적 IP도 마찬가지로, 매매보다 저렴하기 때문에, 일반 서민들에게 랜선을 할당할 때 이러한 동작 IP를 제공하게 됩니다.

Docker의 기본 지식

위의 Network와 서버에 대한 기본적인 지식이 생기게 된다면, Docker에 대한 기본적인 지식을 습득할 준비가 된 겁니다.

우선 Docker의 특징을 설명하면서, Docker에 대해서 대략적으로 설명 드리겠습니다.

(지극히 개인적으로 느낀 특징입니다.)

휘발성

우선 가장 큰 특징은 휘발성입니다.
Container는 끄고 키기 정말 간편한 장치 입니다. 굳이 비유를 하자면, 컴퓨터 전원 On/Off가 순식간에 일어난다고 보면 됩니다.
그 중에서도 Docker는 휘발성 이라는 특징을 가지고 있습니다.

해당 특징은, 데이터와 IP 등등의 컴퓨터를 구성하는 모든 부분에서 재시작하면 그 값이 변동될 수도 있다는 것입니다.

즉, Network는 유동 IP이며, Container의 데이터는 끄게 된다면 날아가게 됩니다, Network도 CIDR를 통해서 각 범위 안에 ip를 할당할 수 있지만,
그렇게 설정을 해도 유동 IP로 작동하기 때문에, 고정하는 건 의미가 없다.
(물론 데이터는 날아가지 않게 설정 할 수 있습니다.)

 

위의 사진이 Docker에 대한 구조를 명확하게 해주는 사진 입니다.

자원 효율성

Container는 반복적인 종료, 재시작 등을 버티고, 자원에 대한 유연성을 가지기 위해서 유동 IP와 자원에 대한 분배를 하게 됩니다.

즉, Docker에서는 트래픽에 따라서 자원을 끌고 가기도 하며, 다시 내어주기도 합니다.

인프라 기술이라며, 난 다른 직무인데 해야 돼?

사실 굳이에 가깝긴 합니다만, 알아서 나쁠건 없습니다.
이유인 즉, 이때부터는 인프라가 아닌 DevOps와 소통하기 위해서는 대략적인 이론과 개념 정도는 알아야지 원하는 프로젝트에 원하는 Container의 갯수와 사이즈요청 할 수 있습니다.

 

타 부서간의 소통은 매우 중요합니다. 개발은 협력으로 이루어지기 때문이죠, 그렇기 때문에, 다른 팀의 자세한 기술은 모르더라도 본인의 프로젝트를 하는데 기본적으로 타 팀에서 하는 것은 아는게 중요합니다.

 

 

다음 편..

Docker의 정말 기초적인 개념이고, 사용하는 이유에 대해서만 알아봤습니다.

 

위 말처럼 다른 직무(프론트, 백엔드)도 알면 좋습니다

몰라도 상관 없지만, 안다고 독이되는 지식은 없습니다.

 

다음 편에는 실습을 할 예정입니다.

 

Docker에 대한 설치는 다른 블로그나 강의에 많이 있기 때문에 진행하지 않겠습니다.

Docker Desktop으로 하셔도 되고, 저의 운영체제는 MacOS이지만, docker 를 사용하면 거의 비슷하기 때문에, 설치에만 유의 해주시면 됩니다.

 

저는 거의 CLI를 많이 사용하기 때문에,,,CLI에 익숙 하지 않으신 분들은 이참에 CLI에 익숙해지셨으면 좋겠습니다.

GUI로 구축을 해도 상관은 없지만, 개발자라면 CLI에 익숙해지시는 것을 적극 권장 드립니다.

 

잘못된 부분이 있다면 댓글로 지적 부탁드립니다