본문 바로가기

개발인생다반사/TIL(Today i learned)

TIL - 211203 [배포] Docker

Achievement Goals

  • 컨테이너 기술이 무엇인지, 도커가 왜 필요한지 알 수 있다.
  • 컨테이너와 이미지, 레지스트리가 무엇인지 이해할 수 있다.
  • 대표적인 레지스트리인 Docker Hub에서 이미지를 검색하고, 사용할 수 있다.
  • 한 개의 이미지를 이용해서 컨테이너를 구축할 수 있다.
  • 두 개 이상의 이미지를 이용해서 컨테이너를 구축하고 서로가 어떻게 연결되는 지 알 수 있다.
  • Docker CLI에서 명령어를 사용해서 이미지를 생성/수정/배포하고, 컨테이너를 생성/삭제할 수 있다.

CHAPTER - 왜 Docker인가?

1. 컨테이너 기술과 Docker의 탄생 배경

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

 

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

 

2. Docker인가?

컨테이너 방식의 장점

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

어떤 프로그램(A)을 실행할 때 다른 프로그램(B)이 반드시 필요한 경우 '프로그램 A는 프로그램 B에 의존 관계를 가지고 있다'라고 말을 한다. 프로그램 마다 의존하는 프로그램의 버전이 다르거나 하는 경우 의존성 충돌의 문제가 발생할 수 있다.

 

컨테이너에서 실행 중인 애플리케이션은 어떠한 의존성도 공유하지 않고, 각자 고유의 의존성을 포함하고 있다. 이는 각 컨테이너가 철저하게 실행환경이 격리되어 있기 때문이다.

 

컨테이너가 격리하는 것들

컨테이너는 아래의 자원들을 독립적으로 소유한다.

 

1. 프로세스 : 컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에게 영향을 줄 수 없다.

2. 네트워크: 기본적으로 컨테이너 하나에 하나의 IP주소가 할당되어 있다.

3. 파일시스템 : 컨테이너 안에서 사용되는 파일 시스템은 구획화 되어 있다. 명령이나 파일 등의 엑세를 제한할 수 있다.

 

컨테이너는 가상머신 수준의 격리성을 가지고 있다.

 

(2) 개발과 배포 환경을 일치시킨다

docker를 활용하면 개발자는 아래와 같은 명령어로 버전이나 호환에 상관없이 프로그램을 즉시 실행할 수 있다.

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

애플리케이션 구성이 컨테이너화 되면 명령어 하나로 실행 환경 구성이 완료된다.

docker-compose up

웹 서비스의 배포란 '어떤 애플리케이션이 특정 런타임 환경 위에서 실행되고, 사용자에게 제공한다'는 의미다

따라서 AWS EC2 상에 도커를 설치하거나 또는 좀 더 편리하게 도커 컨테이너를 EC2 서버에서 실행할 수 있게 하는 서비스인 ECS를 이용하면 된다.

 

(3) 수평확장을 쉽게 해준다/각 서버에 새로운 내용을 배포하기 쉽게 만들어준다.

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

 

동일한 서비스 여러 컴퓨터에서 작동할 때 실행환경의 일치가 중요한데 이때 도커를 사용한다. 

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

 

3. 도커 핵심 키워드

컨테이너: 애플리케이션 상자

이미지: 애플리케이션 및 앱 구성을 함께 담아놓은 템플릿. 이미지는 기본 이미지로 부터 변경사항을 추가/커밋해서 또 다른 이미지를 만들 수 있다.(도커 라이징 참고)

레지스트리: 이미지는 레지스트리에 저장. Doker Hub, Amazon ECR