[배포] Docker

윤후·2022년 3월 29일
0

Section 3

목록 보기
41/41

컨테이너 기술과 Docker의 탄생


개발자들은 물자의 수송에 획기적인 단축을 가져다준 컨테이너 기술을 소프트웨어 수송, 즉 배포에 사용할 수는 없을까 생각을하기 시작하였다. 그 결과로 리눅스 컨테이너라는 것을 만들어내기에 이르렀다.

리눅스 컨테이너 기술은 그 자체로 훌륭하고 완성된 기술이었지만, 애플리케이션을 쉽게 컨테이너화할 수 있는 생태계 혹은 커뮤니티가 없었다. 2013년에 등장한 Docker는 바로 Docker Hub라는 소프트웨어 저장소와 함께 빠르게 성장했고 그 결과 개발자들은 쉽게 애플리케니션을 보장하고 컨테이너 방식으로 실행할 수 있게 되었다.

=> 컨테이너 기술의 장점은 한 마디로 얘기하자면 실행환경에 구애받지 않고 애플리케이션을 실행할 수 있다는 장점인 것이다.

왜 Docker인가?


컨테이너 방식의 장점

  1. 의존성 충돌문제를 해결해 준다.
  2. 개발과 배포환경을 일치시킨다.
  3. 수평적 확장을 쉽게 해준다.
  4. 각 서버에 새로운 내용을 배포하기 쉽게 만들어준다.

어떤 애플리케이션은 해당 애플리케이션을 실행하기 위해 반드시 어떤 환경이 구축되어야 있어야 한다. 쉽게는 윈도우용 프로그램을 실행하려면 윈도우 운영체제가 필요하듯이 말이다.
이와 같이 어떤 프로그램 실행에 다른 프로그램이 반드시 필요한 경우 프로그램 A는 프로그램 B에 의존관계를 가지고 있다고 한다.

이러한 관계에서 문제가 생기는 경우가 종종있다. 예를 들어 살펴보자.

wordpress라는 프로그램이 php라는 프로그램에 대해 의존 관계를 가질 때, 특정php 버전을 요구하는 경우가 생길 수 있다.

💻 wordpress 5.2 -> php 7

그런데 동일한 컴퓨터에 php를 반드시 필요로하는 drupal이라는 프로그램을 실행시켜야 하는데 만일 7버전이 아닌 6버전을 사용할 때에만 제대로 작동한다고 가정해보자.

💻 drupal 8.1 -> php 6

일반적으로 한 컴퓨터에 여러 버전의 동일한 애플리케이션이 설치되지 않으므로 이 경우에는 php의 의존관계를 가지고 있는 다른 두 애플리케이션중에 하나는 제대로된 실행을 보장할 수 없게 된다. 이러한 상황을 우리는 "의존성이 충돌한다."라고 말한다.

컨테이너 기술은 바로 이 문제를 해결해준다. 컨테이너 기술은 애플리케이션을 컨테이너 내에 구성한다. 즉, 컨테이너에서 실행중인 애플리케이션은 어떠한 의존성도 공유하지 않고 각자 고유의 의존성을 포함하고 있다는 이야기이다.

이는 각 컨테이너가 철저하게 실행 환경이 격리되어 있기 때문에 가능한 것이다.

컨테이너는 무엇을 격리하나?

컨테이너 기술을 바탕으로 한 컴퓨터 안에 여러 대의 컨테이너가 존재하고 이를 통해 애플리케이션 실행환경이 격리되어 있음을 앞에서 볼 수 있었다.

하나의 컴퓨터 내에 서로 다른 버전의 php가 설치될 수 있었던 것은 컨테이너 하나하나가 애플리케이션 실행과 관련해서 높은 수준의 격리를 제공하기 때문이다.
그렇다면 무엇을 격리하고 어떤 자원들을 독립적으로 소유할까?

  1. 프로세스

    • 특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스 할 수 있다.
    • 컨테이너 안에서 실행되는 프로레스는 다른 컨테이너의 프로레스에게 영향을 줄 수 없다.
  2. 네트워크

    • 기본으로 컨테이너 하나에 하나의 IP주소가 할당되어 있다.
  3. 파일 시스템

    • 컨테이너 안에서 사용되는 파일 시스템은 구획화 되어있다. 그래서 해당 컨테이너에서의 명령이나 파일등의 액세스를 제한할 수 있다.

개발팀의 문제

Node.js나 Python 등을 이용하여 웹 서비스를 개발하는 개발팀을 상상해보자. 여러 개발자가 하나의 애플리케이션을 만들기 위해 보통 비슷한 개발 환경을 구축하디 마련이다. 특정 버전 이상의 Node.js, 특정 버전의 MySQL 등을 개발자 각자가 본인의 운영체제에 설치하고 그 후에 개발을 진행한다. 하지만 보통의 경우 그 과정이 빠르게 진행되지 않는다.

애플리케이션을 실행시키기 위해 OS나 Node.js나 Python과 같은 런타임 환경의 버전을 얼추 비슷하게 맞춰야 하는 것은 물론이고 시스템 환경변수를 애플리케이션에 맞게 구성해야 제대로 작동하는 경우도 종종 볼 수 있다.

리눅스만 하더라도 배포판에 따라 전혀 다른 애플리케이션 설치과정이 진행된다.

이러한 과정중에 발생하는 사소한 실수나 사전 설치 항목의 부재는 문제해결에 많은 시간을 소모하게 한다. 특히 새로운 프로젝트에 투입되는 개발자의 경우 그저 애플리케이션을 돌리고 싶었을 뿐인데 그 길까지 가는 과정이 매우 험난하다.

도커는 이러한 문제를 해결해준다. 도커가 실행중이라면 어떠한 운영체제든 상관없이 다음 명령어로 즉시 PostgreSQL을 설피하고 실행할 수 있다.

docker run --name postgres -e  POSTGRES_PASSWORD=mysecret -d postgres

지금이야 단일 소프트웨어 패키지 하나의 사례를 들었지만, 애플리케이션 구성 자체가 컨테이너화되면 YAML 파일하나 + 명령어 하나로 모든 애플리케이션 실행환경 구성이 완료되는 기적을 볼 수 있다.

따라서 Docker는 다음의 문제를 해결할 수 있다.

  • OS에 상관없이 즉시 애플리케이션 실행 환결을 만들 수 있다.
  • 개발 컨테이너 위에서 진행할 경우 모든 개발팀이 동일한 환경하에 개발을 진행할 수 있다

배포시의 문제

앞서 설명한 실행 및 개발 환경의 일치 이슈는 서비스 배포환경에서도 동일하게 적용될 수 있다. 웹 서비스의 배포란 "어떤 어플리케이션이 특정 런타임 환경 위에서 실행되고, 사용자에게 이를 제공한다."라는 것인데 이는 앞서 말한 실행환경 구성과 본질적으로 다를 것이 없기 때문이다. 그저 서비스를 인터넷 상에 공개적으로 노출하느냐, 내 컴퓨터 상에서 프라이빗하게 작동하느냐의 차이일 뿐이다.

그래서 이제는 배포의 패러다임이 달라지게 되었다. 서버에 파일 하나하나를 업로드하는 방식은 마치 물자를 하나하나 배에 옮기는 이전의 방식이라고 볼 수 있다. 서버도 이제는 컨테이너에 담긴 애플리케이션을 실행하는 방식으로 서비스를 제공한다.

수평적 확장과 배포

우리가 매일같이 사용하는 글로벌 웹 서비스는 전 세계인들이 사용하므로 그 트래픽이 어마어마하다. 예를 들어 지금 이 시간에도 전세계의 수 많은 사람들이 google에 접속할 텐데 과연 수 많은 사람들이 검색서버라는 간 하나의 컴퓨터에 접속하고 있는 것일까?

그렇지 않다. 서비스 제공자들은 이러한 트래픽 분산을 위해 프록시 서버를 운영하며 프록시 서버는 여러대의 동일한 검색 서버중 한 군데를 이용할 수 있도록 돕는다.(이러한 서버를 리버스 프록시의 한 종류인 "로드 밸런서"라고 부른다.)

컨테이너 기술의 가장 큰 장점은 실행환경의 일치이다. 더 많은 트래픽으로 인산 서버 증설에 컨테이너 기술은 아주 활발하게 이용되고 있다. 동일한 애플리케이션 구성을 바탕으로 새로운 서버에 해당 애플리케이션을 컨테이너로 실행하고 로드밸런서에 이 서버를 추가하기만 하면 된다.

이러한 기술을 응용하여 새로운 버전의 애플리케이션을 여러 서버중 몇 대에만 운영하여 테스트 하는 방법도 가능하다. 이를 통해 새 버전으 애플리케이션에 발생할 수 있는 문제들을 미리 확인하고 이러한 문제가 사용자 전체에게 영향을 끼치지 않도록 만들 수도 있다.

Docker 핵심 키워드


컨테이너

컨테이너는 앞서 설명한대로 애플리케이션의 의존성, 네트워크 환경, 파일 시스템에 구애받지 않고 도커라는 기술위에 실행될 수 있도록 만든 애플리케이션 상자이다.

이미지

실행되는 모든 컨테이너는 이미지로부터 생성된다. 이미지는 애플리케이션 및 애플리케이션 구성을 함께 담아놓은 템플릿으로 이를 이용해 즉시 컨테이너를 만들 수 있다.

이미지를 이용해 여러 개의 컨테이너를 생성할 수 있다. 이를 이용해 앞서 설명한 애플리케이션의 수평 확장이 가능하다.

이미지는 기본 이미지로 부터 변경하상을 추가/커밋 해서 또 다른 이미지를 만들 수도 있다. 예를들어 node.js로 작성된 애플리케이션을 이미지로 만들고 싶은 경우, node.js 이미지를 기본 이미지로 삼고 내가 만든 애플리케이션을 추가해 넣고 이미지화 할 수 있다.

레지스트리

이미지는 레지스트리에 저장된다. 대표적인 이미지 레지스트리로는 Docker hub, Amazon ECR이 있다. 도커 CLI에서 이미지를 이용해 컨테이너를 생성할 때, 호스트 컴퓨터에 이미지가 존재하지 않는다면 기본 레지스트리로부터 다운로드 받게 된다.

profile
궁금한걸 찾아보고 공부해 정리해두는 블로그입니다.

0개의 댓글

관련 채용 정보