[배포] Docker

윤태영 | Taeyoung Yoon·2022년 6월 7일
0

TIL (Today I Learned)

목록 보기
52/53
post-thumbnail

Docker 설치

MacOS 유저용 Docker Desktop 설치로 들어가 Docker를 다운로드한다.

설치 후 앱을 실행해 보조프로그램들을 추가로 설치한다.

설치가 완료되면 터미널에 docker --version 명령어를 입력해 확인할 수 있다.

Docker의 탄생 배경

컨테이너 기술

  • 물자를 싣고 내릴 때에, 선박이 입항해 있는 시간을 획기적으로 단축시켜준다.
  • 물자를 싣고 내릴 때 필요한 인력(분류하는 사람, 짐 옮기는 사람, 감독하는 사람)을 대폭 감소시킨다.

리눅스 컨테이너

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

Docker

리눅스 컨테이너 기술은 그 자체로 완성된 기술이었지만, 애플리케이션을 쉽게 컨테이너화할 수 있는 생태계 혹은 커뮤니티가 없었다.

2013년에 등장한 도커(Docker)는 바로 Docker Hub라는 소프트웨어 저장소와 함께 빠르게 성장했고, 그 결과 개발자들은 쉽게 애플리케이션을 포장하고, 컨테이너 방식으로 실행할 수 있게 되었다.

Docker의 장점

의존성 충돌 문제를 해결해 준다.

어떤 애플리케이션은, 해당 애플리케이션을 실행하기 위해 반드시 어떤 환경이 구축되어 있어야 한다.
이와 같이 어떤 프로그램(A) 실행에 다른 프로그램(B)이 반드시 필요한 경우, "프로그램 A는 프로그램 B에 의존 관계를 가지고 있다"고 말한다.

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

💻 PC
	wordpress 5.2 -> php 7

그런데 동일한 컴퓨터에 drupal이라는 프로그램도 php에 의존 관계를 가지고
특정 버전 php 6를 요구한다.

💻 PC
	drupal 8.1 -> php 6

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

💻 PC
	wordpress 5.2 -> php ?
	drupal 8.1 -> php ?

이런 상황을 "의존성이 충돌한다"라고 말한다.

컨테이너 기술은 바로 이 문제를 해결한다.

컨테이너 기술은 애플리케이션을 컨테이너 내에 구성해 실행 환경을 격리시킨다.
컨테이너에서 실행 중인 애플리케이션은 어떠한 의존성도 공유하지 않고, 각자 고유의 의존성을 포함한다.

🐳 Docker Server
	📦 wordpress 5.2 -> php 7
	📦 drupal 8.1 -> php 6

컨테이너가 격리하는 것들과 독립적으로 소유하는 자원들

프로세스

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

네트워크

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

파일 시스템

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

개발과 배포 환경을 일치시킨다.

개발팀의 여려운 점

여러 개발자가 하나의 애플리케이션을 만들기 위해, 보통 비슷한 개발 환경을 구축하기 마련이다.

특정 버전 이상의 Node.js 등을 개발자 각자가 본인의 운영체제에 설치하고, 그 후에 개발을 진행한다. 하지만 보통의 경우 그 과정이 빠르게 진행되지 않는다.

애플리케이션을 실행시키기 위해 런타임 환경의 버전을 비슷하게 맞춰야 하고 시스템 환경 변수를 맞게 구성해야 제대로 작동하는 경우가 많다.

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

이러한 과정 중에 발생하는 실수나 사전 설치 항목의 부재는 문제 해결에 많은 시간을 소모하게 한다. 특히 새로운 프로젝트에 투입되는 개발자의 경우 과정이 매우 험난하다.

개발 환경

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

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

단일 소프트웨어 패키지 하나의 사례이지만, 애플리케이션 구성 자체가 컨테이너화되면 YAML 파일 하나 + 명령어 하나로 모든 애플리케이션 실행 환경 구성이 완료된다.

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

배포 환경

개발 환경의 일치 이슈는 서비스 배포 환경에서도 동일하게 적용될 수 있다.
서버도 이제는 컨테이너에 담긴 애플리케이션을 실행하는 방식으로 서비스를 제공한다.
따라서 Amazon Web Service의 EC2 상에 도커를 설치하거나 좀 더 편리하게 도커 컨테이너를 EC2 서버에서 실행할 수 있게 하는 서비스인 ECS를 이용하여 보다 쉽게 애플리케이션을 배포할 수 있다.

AWS ECS라는 서비스는 애플리케이션을 도커 컨테이너째로 배포할 수 있게 해준다.

수평 확장을 쉽게 해준다.

글로벌 웹 서비스는 전 세계인들이 사용하므로 그 트래픽이 어마어마하다.
서비스 제공자들은 이러한 트래픽 분산을 위해 프록시 서버를 운영하며, 프록시 서버는 여러 대의 동일한 검색 서버 중 한 군데를 이용할 수 있도록 돕는다.

동일한 서비스를 여러 컴퓨터에서 작동한다는 이야기인데 Docker가 이를 도운다.

컨테이너 기술의 가장 큰 장점은 실행 환경의 일치이다.
더 많은 트래픽으로 인한 서버 증설에 컨테이너 기술은 아주 활발하게 이용되고 있다.

각 서버에 새로운 내용을 배포하기 쉽게 만들어준다.

동일한 애플리케이션 구성(이미지)을 바탕으로 새로운 서버에 해당 애플리케이션을 컨테이너로 실행하고, 로드 밸런서에 이 서버를 추가하기만 하면 된다.

이러한 기술을 응용하여, 새로운 버전의 애플리케이션을 여러 서버 중 몇 대에만 운영하여 테스트하는 방법도 가능하다.

Docker의 핵심 키워드

이미지

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

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

이미지는 기본 이미지(base image)로부터 (마치 git을 사용하는 것처럼) 변경 사항을 추가/커밋해서 또 다른 이미지를 만들 수도 있다.

컨테이너

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

레지스트리

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

비유하자면...

바닷가의 어느 항만Docker
물품애플리케이션
물품을 어떤 방법으로 실을 지에 대한 도면이미지
물품들이 잘 쌓여 있는 컨테이너컨테이너
도면들을 가지고 있는 아저씨레지스트리

0개의 댓글