TIL-57, Docker
선박 운송을 할 때, 항만(Docker)에 정박한 배에
컨테이너들을 차곡차곡 실어 효율적인 운송이 가능하다.
이런 효율적인 방식을 소프트웨어의 배포에도 사용하기 위해
리눅스 컨테이너(lxc)라는 것을 만들어 냈는데, 쉽게 컨테이너화 할 수 있는
생태계 & 커뮤니티가 없었다.
이 때 2013년 등장한 도커(Docker)는 Docker Hub라는 소프트웨어 저장소와 함께 빠르게
성장하며 개발자들이 애플리케이션을 쉽게 포장하고 컨테이너 방식으로 실행할 수 있게 됐다.
컨테이너 방식의 장점
- 의존성 충돌 문제를 해결해 준다
어떤 애플리케이션을 실행하고자 할 때, 해당 애플리케이션을 실행하기 위한 어떠한 환경이 ‘반드시’ 구축되어 있어야 한다. 아이폰의 IOS용 애플리케이션을 실행하기 위해서는 IOS가 필요하듯이 말이다. 이처럼 어떤 프로그램 A의 실행에 프로그램 B가 반드시 필요한 경우 프로그램 A는 프로그램 B에 의존 관계를 가지고 있다고 말한다. 그런데, 아래와 같은 경우가 발생할 때도 있다.
A라는 프로그램을 실행하기 위해서는 B라는 프로그램의 0.0.5 버전이 필요 C라는 프로그램을 실행하기 위해서는 B라는 프로그램의 0.0.6 버전이 필요
위와 같은 경우에, 한 프로그램에 여러 버전이 설치되지 않으므로
A 또는 C 둘 중 한 프로그램의 실행은 보장받지 못한다.
이런 상황을 의존성이 충돌한다
고 말한다.
컨테이너 기술은 이런 문제를 해결한다. 애플리케이션을 컨테이너 내에 구성하고, 컨테이너에서 실행중인 애플리케이션은 어떠한 의존성도 공유하지 않고, 각자 고유의 의존성을 포함하고 있다. (각 컨테이너는 철저하게 실행 환경이 격리되어 있다)
- 컨테이너가 격리하며 독립적으로 소유하는 자원들
- 프로세스
- 특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스
- 컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에 영향을 줄 수 없다
- 네트워크
- 기본적으로 컨테이너 하나에 한개의 IP주소가 할당된다
- 파일 시스템
- 컨테이너 안에서 사용되는 파일 시스템은 구획화 되어 있기때문에 해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한할 수 있다.
- 프로세스
하나의 컴퓨터에서 가상으로 독립적인 컴퓨터를 작동시키는 가상머신, VM (Virtual Machine) 과는
차이점이 있지만, 비슷한 수준의 격리성을 제공한다.
차이점 docker는
- 컴퓨팅 자원 (cpu, ram 등)을 공유
- 격리성 제공
- OS의 커널(코어 프로그램)을 공유
- 개발과 배포 환경을 일치시킨다
- 각 OS마다 완전히 다른 애플리케이션 설치 명령어를 사용한다. 뿐만 아니라 길고 복잡한 명령어 입력 과정을 거치므로 사소한 실수 또는 사전 설치 부재는 문제 해결에 많은 시간을 소모하게 해 효율성이 떨어진다. docker는 애플리케이션 구성 자체가 컨테이너화 되어 YAML 파일 1개, 명령어 하나로 모든 어플리케이션 실행 환경 구성이 완료된다.
- OS에 상관없이 즉시 애플리케이션 실행 환경을 만들 수 있다.
- 개발을 컨테이너 위에서 진행할 경우, 모든 개발팀이 동일한 환경 하에 개발을 진행할 수 있다.
- 위에서 나온 실행 및 개발 환경 일치 문제는 서비스 배포 환경에서도 동일하게 발생할 수 있다. 때문에 AWS의 EC2상에 Docker를 설치하거나, Docker 컨테이너를 EC2 서버에서 실행할 수 있게 하는 서비스인 ECS를 이용해 보다 쉽게 애플리케이션 배포를 할 수 있다.
- 수평 확장을 쉽게 해준다, 4. 각 서버에 새로운 내용을 배포하기 쉽게 만들어준다
- 전세계 사람들이 사용하는 google.com의 트래픽은 어마어마 할 것이다.
이런 웹사이트는 트래픽 분산을 위해 프록시 서버를 운영하며, 프록시 서버는 여러 대의 동일한 검색 서버 중 한 군데를 이용할 수 있도록 돕는다 (로드 밸런서)
여러 대의 동일한 검색 서버를 이용한다 → Docker가 필요하다!
컨테이너 기술의 가장 큰 장점은
실행 환경의 일치
이고, 더 많은 트래픽으로 인한 서버 증설에 컨테이너 기술은 아주 활발하게 이용되고 있다.
- 전세계 사람들이 사용하는 google.com의 트래픽은 어마어마 할 것이다.
이런 웹사이트는 트래픽 분산을 위해 프록시 서버를 운영하며, 프록시 서버는 여러 대의 동일한 검색 서버 중 한 군데를 이용할 수 있도록 돕는다 (로드 밸런서)
여러 대의 동일한 검색 서버를 이용한다 → Docker가 필요하다!
컨테이너 기술의 가장 큰 장점은
Docker Key-word
-
컨테이너
애플리케이션이 의존성, 네트워크 환경, 파일 시스템에 구애받지 않고, 도커라는 기술 위에 실행될 수 있도록 만든 애플리케이션 상자
-
이미지
실행되는 모든 컨테이너는 이미지로부터 생성된다. 이미지는 애플리케이션 및 애플리케이션 구성을 함께 담아놓은 템플릿으로, 이를 이용해 즉시 컨테이너를 만들 수 있다. 이미지를 이용해 여러 개의 컨테이너를 생성할 수 있다. (수평 확장 가능) 이미지는 기본 이미지로부터 변경사항을 추가/커밋해서 또 다른 이미지를 만들 수도 있다.
-
레지스트리
이미지는 레지스트리에 저장된다. 대표적인 레지스트리 → Docker Hub, Amazon ECR 도커 CLI에서 이미지를 이용해 컨테이너를 생성할 때, 호스트 컴퓨터에 이미지가 존재하지 않는다면, 기본 레지스트리로부터 다운로드 받게 된다