Docker
- 컨테이너
- 애플리케이션이 의존성, 네트워크 환경, 파일 시스템에 구애받지 않고, 도커라는 기술 위에 실행될 수 있도록 만든 애플리케이션 상자
- 이미지
- 실행되는 모든 컨테이너는 이미지로부터 생성됨
- 애플리케이션 및 구성을 함께 담아놓은 템플릿
- 이미지를 이용해 여러 개의 컨테이너를 생성할 수 있음, 수평 확장이 가능
- 기본 이미지(base image)에 변경 사항을 추가/커밋하여 다른 버전의 이미지를 만들 수도 있음
- 레지스트리
- 이미지는 레지스트리에 저장됨, Docker Hub, Amazon ECR가 대표적
- 도커 CLI에서 이미지를 이용해 컨테이너를 생성할 때, 호스트 컴퓨터에 이미지가 없다면 기본 레지스트리로부터 다운로드 받게 됨
컨테이너 방식의 장점
- 의존성 충돌 문제를 해결해준다
- 프로그램A 실행에 프로그램B가 반드시 필요한 경우, A는 B에 의존 관계를 가진다
- 프로그램A 실행에 프로그램B의 특정버전에서만 제대로 작동, 의존성이 충돌한다
- 컨테이너 내에 애플리케이션을 구성, 실행 환경이 격리되어 각자 고유의 의존성을 가짐
- 컨테이너의 격리 환경과 개별 자원
- 프로세스
- 특정 컨테이너의 프로세스는 그 컨테이너안에서만 엑세스 가능
- 컨테이너 안의 프로세스는 다른 컨테이너에 영향을 줄 수 없음
- 네트워크
- 기본적으로 컨테이너 하나에 하나의 IP 주소가 할당됨
- 파일 시스템
- 컨테이너 안에서 사용되는 파일 시스템은 구획화되어 있음
- 해당 컨테이너의 명령이나 파일 등의 엑세스를 제한할 수 있음
- 컨테이너가 공유하는 자원
- CPU 성능, 메모리, 리눅스 커널(linux OS 기반으로 작동함)
- 도커를 비롯한 리눅스 컨테이너 기술은 VM(Virtual Machine, 가상머신)의 접근 방법과는 다름
- 개발과 배포 환경을 일치시킨다
- 개발팀에서의 개발 환경을 맞추기가 어려움, 운영체제, 런타임 환경, 배포판에 따른 애플리케이션 등
- OS별 설치 방법, 설치 과정 등 초기 환경을 맞추는데 많은 시간이 소요됨
- OS에 상관없이 즉시 애플리케이션 실행 환경을 만들 수 있음
- 개발을 컨테이너 위에서 진행할 경우, 모든 개발팀이 동일한 환경하에 개발을 진행할 수 있음
- 배포도 마찬가지, 서버에 파일 하나하나를 업로드하는게 아닌, 컨테이너에 담긴 애플리케이션을 실행하는 방식으로 서비스를 제공함
- AWS EC2에 도커를 설치하거나, ECS를 이용하여 애플리케이션을 도커 컨테이너째로 배포할 수 있게 해줌
- 수평 확장을 쉽게 해준다, 각 서버에 새로운 내용을 배포하기 쉽게 만들어준다
- 아래 내용은 웹 서비스의 인프라스트럭처에 대한 이해가 필요함
- 트래픽 분산을 위한 리버스 프록시(그의 한 종류인 로드 밸런서라고도 함)
- 동일한 서비스를 제공하는 여러 서버에 분산 접속을 돕는다
- 서버 증설은 동일한 애플리케이션 구성(이미지)을 새로운 서버에 적용하고, 로드 밸런서에 추가만 해주면 됨
- 새로운 버전의 애플리케이션을 일부 서버에서만 운영하여 테스트를 진행하는 것도 컨테이너 기술로 가능
Docker CLI
docs.docker.com
hub.docker.com