GDSC Sookmyung 활동/10 min Seminar

도커와 쿠버네티스 알아보기

윤태풍 2023. 4. 3. 17:53

도커란 무엇일까?

 

🐳 도커란 한마디로 데이터나 프로그램을 격리시키는 기능을 제공하는 소프트웨어
  • 도커를 주로 서버에서 이용
  • 개인 컴퓨터에도 한글, 엑셀, 등 여러 프로그램이 함께 동작하듯 서버에도 여러 프로그램이 동작
  • 도커는 다양한 프로그램과 데이터를 각각 독립된 환경에 격리하는 기능을 제공함

 

예로 서버나 개인 컴퓨터 상의 환경을 작은 방들로 분할하고 각각의 방들에 데이터나 프로그램을 둔다면,
이 작은 방들을 컨테이너, 이 방들을 다루는 기능을 제공하는 소프트웨어를 도커라고 합니다
  • 도커 엔진 : 도커 소프트웨어의 본체로 이를 설치해야만 컨테이너를 생성하고 구동시킬 수 있음
  • 이미지 : 컨테이너를 찍어내는 역할로 담고있는 소프트웨어 종류에 따라 각 이미지를 다양하게 씀
  • 제약사항 : 종류와 상관없이 리눅스 운영체제, 컨테이너 안에서 동작하는 프로그램도 리눅스용 프로그램

 

독립된 환경의 필요성

  • 프로그램은 대개 단독이 아니라 특정 실행 환경이나 라이브러리, 다른 프로그램을 이용해 동작
  • 대다수의 소프트웨어 역시 단일 프로그램이 아닌 여러 프로그램으로 구성
  • 따라서 하나의 프로그램을 업데이트 하게되면 다른 프로그램들에도 영향을 주는 경우가 많음
  • 문제 대다수의 원인은 프로그램간의 공유
  • 즉 도커는 컨테이너 안에 각 프로그램을 격리시켜 위의 문제들을 해결

 

서버와 도커

 

서버란?

  • 서버는 이름 그대로 어떤 서비스를 제공하는 것
  • 다른 의미로는 실물 서버를 말하는 것
  • 즉 물리적인 서버 한대에서 여러가지 기능을 가진 서버 여러개가 있을 수 있음

 

서버에서 도커의 장점

  • 하나의 물리적인 서버에서 실행하는 웹서버, 메일서버, DB서버 같은 여러 서버를 독립적인 환경에서 사용
  • 컨테이너가 격리된 환경에서 실행되는 동시에 쉽게 이동이 가능
  • 컨테이너는 자유롭게 옮길 수가 있으므로 팀 전원이 동일한 개발 환경을 사용 가능
  • 즉 도커를 이용해 운영서버와 개발 서버의 환경 차이로 인한 문제를 막을 수 있음

 

도커의 동작 원리

  • 물리서버 위에 여기에서 동작하는 리눅스 운영체제가 있으며 이 위에 도커엔진 - 컨테이너가 동작
  • 각 컨테이너 안에 리눅스 운영체제와 비슷한것들이 존재 (커널을 제외한 주변부만 존재)
  • 운영체제는 소프트웨어나 프로그램의 명령을 하드웨어로 전달
  • 운영체제는 보통 커널 - 주변부분 으로 구성
  • 주변부분이 프로그램의 연락 내용을 커널에 전달하고이 커널이 하드웨어를 다룸
  • 컨테이너 속의 운영체제의 주변부분이 프로그램의 명령을 전달받고 이를 커널로 전달
  • 즉 주변부만 컨테이너에 넣고 커널은 아래에 깔려있는것을 사용하므로 가벼움이란 장점을 얻음
  • 도커는 밑바탕에 리눅스 운영체제가 동작하는걸 전제로 하는 구조
  • 단, 윈도우나 macOS 컴퓨터에서도 도커를 사용 가능
    • Virtual Box나 VMWare 같은 가상 환경 위에 리눅스 운영체제를 설치해서 사용
    • 도커를 실행하는데 필요한 리눅스 운영체제를 포함하는 패키지를 설치해서 사용

 

도커 허브와 이미지, 컨테이너

🐳 이미지는 컨테이너를 만드는 빵틀, 도커 허브는 인터넷상에서 도커 이미지를 모아둔 곳

 

이미지

  • 컨테이너를 생성하기 위해 먼저 만들어야 하는 것, 컨테이너의 설계도 역할
  • 이미지 자체로는 쓸모가 없어 그대로 쓰지는 않고 이를 이용해 컨테이너를 만들어서 이를 실사용
  • 하나의 이미지로 동일한 컨테이너를 여러 개 만들어서 배치 가능
  • 이미지로 컨테이너를 만들 수 있지만 컨테이너로도 이미지를 만들 수 있음.
  • 이미지를 익스포트해서 새 도커 엔진에 컨테이너를 생성하여 다른 물리서버로 컨테이너 이동 가능

도커허브

  • 이미지는 주로 도커 허브에서 구하며, 도커 허브는 공식적으로 운영되는 도커 레지스트리의 이름
  • 공개된 컨테이너 이미지가 모여있는 곳으로 원하는 컨테이너의 이미지를 내려받을 수 있음
  • 운영체제만 들어있는 이미지부터 여러 소프트웨어가 포함된것 까지 다양한 이미지가 제공
  • 안전한 이미지를 선택하는 방법
    • 도커에서 직접 배포하거나 해당 소프트웨어를 개발 및 관리하는 기업이 제공하는 이미지를 사용
    • 필요한 이미지를 직접 만들어서 사용

 

도커 컨테이너의 생애주기와 데이터 저장

🐳 컨테이너는 한마디로 물티슈. 그때그때 필요에 따라 쓰고 버리기 때문

 

쓰고 버리는 컨테이너

  • 컨테이너는 쉽게 만들 수 있으므로 새로운 버전이 나오면 새 컨테이너로 갈아타는 것이 좋음.
  • 좋다고 이야기 하는 이유는 일반적으로 컨테이너 여러개를 동시에 가동한다고 가정하기 때문
  • 간단한 초기 구축 후 유지 보수마다 여러개의 컨테이너를 하나하나 업데이트 시키는 것은 컨테이너의 장점⬇️
  • 컨테이너는 일회용품 같은 것이라 ‘컨테이너의 수명’, ‘컨테이너의 생애주기’ 라는 것이 나오게 됨.
  • 컨테이너의 생애 주기는 컨테이너를 만들고, 실행하고, 종료하고, 폐기하고, 컨테이너를 재생산 하는 과정

 

데이터 저장

  • 컨테이너를 폐기하게 되면, 그 안에서 편집했던 파일들은 사라지게 됨
  • 대부분 도커가 설치된 물리적 서버는 디스크를 마운트해 이 디스크를 데이터 저장
  • 즉 데이터는 컨테이너의 외부에 저장하게 되어 도커 엔진에 문제가 생겨도 보존 가능
  • 다른 컨테이너와도 데이터를 공유할 수 있다는 장점이 있음.

 

도커의 장단점

 

도커의 구조및 성질

  • 위에서 도커의 성질들을 이야기 했는데 이들중 핵심은 환경 격리
  • 덕분에 독립된 환경을 만들 수 있고, 이미지를 만들 수 있으며, 컨테이너에 커널을 포함시키지 않아도 됨

도커의 장단점

  • 물리서버 하나에 여러 서버 즉 여러가지의 기능을 안전한 상태로 띄울 수 있음
  • 서버 관리에 용이 : 각 소프트웨어를 독립된 환경에 격리하므로 서로 영향받지 않아 간단히 업데이트가 가능
  • 명령 한줄로 서버 구축이 끝나므로 명령어 만으로 컨테이너 사용이 가능
  • 단점 : 리눅스용 소프트웨어만 지원, 물리 서버 즉 호스트 서버에 문제가 생기면 모든 컨테이너에 영향

도커의 용도

  • 개발 환경에서 팀원 모두에게 동일한 개발환경을 제공할 때 사용
  • 새 버전을 먼저 개발환경에서 테스트한 뒤 운영환경에서 적용할때 혹은 변경된 환경에 대한 테스트에 사용
  • 동일 서버가 여러대 필요할 때에도 컨테이너로 하나의 물리 서버에 같은 서버를 여러개 만들 수 있음
  • 스케일링에 유리하여 웹서버나 API 서버로 활용할 수 있음 (?챗지피티에 물어보자)

 

쿠버네티스란 무엇일까?

 

🐳 쿠버네티스는 컨테이너 오케스트레이션 도구의 일종
  • 컨테이너 오케스트레이션 : 시스템 전체를 통괄하고 여러 컨테이너(즉 서버)를 관리하는 일
  • 일반적으로 프로그래머가 쿠버네티스를 많이 사용할 일은 드뭄
  • 대규모 시스템을 개발하는 프로그래머라도 대규모 서버군을 직접 관리할 일이 드물듯 쿠버네티스 사용도 드뭄
  • 다만, 쿠버네티스로 어떤 일을 할 수 있는가에 대한 지식에 초점을 맞춰 알아보면 좋을 것
  • 쿠버네티스는 여러대의 물리적 서버가 존재하는 것을 전재로 하며, 각 서버마다 여러대의 컨테이너를 실행함
  • 여러대의 서버에서 일일이 컨테이너를 실행하고 관리하기는 쉬운 일이 아닌데 이를 위한 도구가 쿠버네티스
  • 번거로운 컨테이너 생성이나 관리를 덜어주는 것이 컨테이너

 

기억할 것은 쿠버네티스는 항상 바람직한 상태를 유지하려고 한다는 것
  • 바람직한 상태를YAML 파일에 정의하고 자동으로 컨테이너를 생성하거나 삭제하면서 이 상태를 유지
  • 사람의 개입 없이 파일에 정의된 바람직한 상태를 유지하려고 함

 

개발자로서 도커와 쿠버네티스 이용 방법

 

도커와 쿠버네티스는 개발자들이 프로그램을 더 쉽게 개발하고, 배포하고, 관리할 수 있도록 도와주는 기술

 

1. 로컬 개발 환경 구성

예로, 로컬에서 Node.js 애플리케이션을 개발하고 테스트하는 경우,
도커 이미지를 만들어 로컬에서 애플리케이션을 실행할 수 있음. 개발자들은 해당 이미지를 공유하여
개발 환경의 일관성을 가질 수 있고, 이식성을 유지할 수 있음

2. 테스트 환경 구축에 활용

예로 스프링 기반 웹 어플리케이션이라고 가정한다면, 해당하는 웹 어플리케이션을 도커 이미지로 빌드하고
잘 만들어진 이미지를 쿠버네티스 클러스터에 배포합니다. YAML 파일에서 서비스와 배포를 정의하고
여기서 배포한 어플리케이션을 테스트 하면 됨

3. 배포 자동화 구성에 활용

예로 지속적 통합(Continuous Integration, CI)과 지속적 배포(Continuous Delivery, CD)를 위한 도구인
젠킨스와 함께 활용할 수 있음 도커 이미지 빌드, 쿠버네티스 오브젝트 배포, 테스트등을 자동화하는 파이프
라인을 구축한 후, 젠킨스 도구를 이용하면 어플리케이션 배포 자동화를 구성할 수도 있음

4. 클라우드 인프라 구성에 활용

예로 테라폼(Terraform)을 사용하여 클라우드 인프라를 코드로 관리할 수도 있음
테라폼은 인프라스트럭처 자동화 툴로 클라우드 환경의 인프라를 쉽게 구축하고 변경할 수 있도록 하는 도구인데
테라폼 코드를 사용하여 AWS에서 쿠버네티스 클러스터를 생성하고 관리할 수 있음.