Docker 공부 정리 (1. 도커란 무엇인가)

하윤·2023년 6월 17일
0

Docker

목록 보기
1/2
post-thumbnail

(아직 공부중인 과정이라, 틀린 내용이 있을 수 있습니다.)

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 최근 인프라 기술에서 가장 핫한 기술이기도 하며, 프론트엔드, 백엔드 가리지 않고 필수적으로 공부하고 사용할줄 알아야하는 스킬이라는 생각이 최근에 많이 들었고, 이렇게 짧은 시간이지만 Docker에 대한 공부를 시작하게 되었다.

기존 전통적인 서버 관리의 변화 과정

나 역시도, 서버 배포 과정을 많이 경험해본 만큼, 한땀한땀 서버를 관리해주고, 변경 사항을 적용해주는 사항은 굉장히 복잡하다.

package 파일의 변경이나 버전 업데이트가 이뤄지거나, 혹은 사용하고 있던 Java나 Python과 같이 Programming 언어의 버전 변경이 생기고, 실제 run이 되지 않는 오류가 발생하는등, 서버 관리는 굉장히 까다로운 친구다. 이러한 서버 관리를 해결하기 위해서는 여러가지 대안들이 제안되어 왔다.

1. 문서화..

말 그대로, 어떻게 OS를 설치하였는지 , 어떻게 프로그램을 실행시키는지 등등.. 말그대로 문서화 시켜서 이러한 기록들을 보관하는 방법이다.

  • 일단 대표적으로, 신뢰성이 떨어진다.
  • 버전 변경, 다른 OS, 다른 환경등에 굉장히 취약하다

2. 상태관리 도구 및 코드

상태관리 도구를 사용하거나, yml등의 파일에 실행 코드들을 저장하는 방식이 문서화의 대안으로 제시되었다. 이 경우, 협업도 가능하고, 버전관리도 쉽기에, 내가 Docker를 공부해보기 전까지 즐겨사용하던 방식이다.

  • 협업 및 버전 관리에 용이하다
  • 그러나, 한 서버에 다른 버전을 여러개 설치하는등, 확장성에 어려움이 있다.

3. 가상 머신(VM)

Jenkins은 이 머신에~ 어떤 자바 서버는 이 머신에~ 리액트 서버는 이 머신에 각각 Virtual Machine에 분리하여 저장하는 방식이다.

  • 이 경우, 한 서버에 여러개 설치가 가능하다!
  • 현재 상태를 저장함으로서, restore 등의 복구와 되돌리기가 아주 용이하다 (용량 이슈 있지만..)
  • 하지만, 초기 세팅 및 서버들끼리의 파일 및 이미지 공유가 어렵다
  • 더럽게 느리다.

4. 자원 격리

프로세스 ,파일, 디렉토리를 모두 가상으로 분리하는 방식이다. 이러한 복잡한 기술을 사용하기 쉽게 나온 오픈소스 소프트웨어가 바로 Docker다!

Docker란?

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 어떠한 프로그램도 컨테이너로 만들 수 있고, 어떠한 환경에서든 도커가 깔려있기만 하다면, 돌아간다는 특징을 가지고 있는 소프트웨어이다. 가상 머신과 비교하여 훨씬 빠르고, 쉽고, 효율적이라는 장점을 가지고 있다.

도커의 확장성

  • 도커가 설치되어 있다면 어디서든 컨테이너 실행 가능!
  • 그렇기에 이거는 AWS에서.. 이거는 Azure에서.. 등등이 아닌 특정 회사 및 서비스에 종속되지 않는다

도커의 표준성

  • djagno, nodejs, spring등등 서비스들의 배포 방식은 모두 다르게 된다.
  • 하지만 Docker에서는 컨테이너라는 표준 방식으로 서버 배포 과정을 진행하기에, 배포과정이 동일하다!

도커의 이미지

  • 이미지에서 컨테이너를 생성하는 구조이기에, 반드시 이미지는 필요하다!
  • Dockerfile을 사용하여 이미지를 만드는 구조이다.
  • 빌드 서버에서 이미지를 만들고, 이를 이미지 저장소에 저장 -> 사용할때 운영서버에서 이미지를 불러오는 방식이다.
  • 도커에서 설정은 또한 환경 변수로 제어한다. (Vercel과 같은 SaaS 시스템과 유사하다!) (환경변수에 따른 동적 설정이 가능하다)

도커의 자원관리

  • 컨테이너 삭제후 재 생성한다면, 데이터가 초기화 된다.
  • 따라서, 업로드 파일은 S3같은 별도 저장소가 필요하다
  • 캐시 역시 Redis와 같이 별도로 관리해줘야한다!

이외의 Docker는

  • 클라우드 이미지보다 관리 쉽고, 성능저하가 거의 없다.
  • 이미지 빌드 기록이 남기에, github등에서 공유가 가능하다
  • 코드와 설정으로 관리하며, 오픈소스 소프트웨어이기에 특정 서비스에 종속되지 않는다.

Kubernetes?

최근 또다른 인프라 기술중 하나인, 쿠버네티스에 대해서도 공부할 수 있었다. 쿠버네티스는 간단하게
여러대의 서버와 여러개의 서비스를 관리하기 쉽게 만들어주는 기능이다. 쿠버네티스는 대표적으로 3가지 기능, 스케줄링, 클러스터링, 서비스 디스커버리 3개를 제공한다.

스케줄링

  • 컨테이너를 가장 알맞은 서버에 배포한다.
  • 가장 여유로운 서버에 컨테이너를 배포해주고, 그 서버가 죽을 경우 실행 중인 컨테이너를
    다른 서버에 띄워주는 특징을 가지고 있다.

클러스터링

  • 여러 개의 서버를 하나의 서버처럼 사용하게 만들어준다.
  • 이로 인해, 흩어져 있는 컨테이너도 가상 네트워크 및 클러스터링을 통해서, 마치 같은 서버에 있는 것처럼 서로 통신이 가능하다!

서비스 디스커버리

  • 컨테이너가 어느 서버에 생성될지 모르고, 어디로 갈지 모른다!
  • 컨테이너와 컨테이너, 혹은 컨테이너와 외부가 통신 하기 위해서는 어떤 서버에 실행중인지 알아야하고, 어딘가에 IP와 Port 같은 배포 정보가 저장되어야한다.
  • 따라서, 내부 DNS 서버를 이용해서 키-밸류 스토리지에 정보를 저장할 수 있게 해준다.
profile
넓은 시야를 가진 개발자를 꿈꾸는

0개의 댓글