Docker
컨테이너 기반 오픈소스 가상화 플랫폼
컨테이너 환경에서 독립적으로 응용 프로그램을 실행할 수 있도록 도와주는 도구
서버 PC 마다 환경이 다르고, 매번 환경변수와 dependencies를 설명해줘야 하는데...
=> 실행 결과가 달라지는 문제 발생
응용프로그램을 서로 다른 환경에서도 일관되게 실행할 수 있고, 개발 환경과 운영 환경 사이의 차이로 인한 문제를 줄일 수 있음
VM vs Docker

Virtual Machines
호스트 운영체제 위에 가상화된 하드웨어 계층(Guest OS)을 생성하고 독립된 운영체제, 커널, 드라이버를 사용
=> 완전히 독립된 공간과 시스템 자원을 할당받아 사용, 독립된 PC
- 운영체제 부팅 과정에서 오랜 시간 소모
- 독립된 운영체제가 메모리, 디스크 공간 등 많은 자원을 소비
Docker
호스트 운영체제의 커널을 공유 => 비교적 가볍게 격리된 환경
- 실행 속도가 매우 빠르고, 컨테이너는 호스트 운영체제의 커널을 공유하므로 가볍고 효율적인 자원 활용
- 컨테이너 기술이 애플리케이션 배포와 관리를 효율적으로 처리할 수 있는 방법 제공
Building Containers
dockerfile 만들기 => build해서 image 만들기 => container 구동하기
Dockerfile
컨테이너를 어떻게 만들어야 하는지 알려주는 가이드라인
=> 필요한 파일, dependencies, 환경변수, 실행 스크립트 등을 포함
=> Docker Specific Language를 사용해 이미지 생성 가능
Image

컨테이너를 생성할 때 필요한 요소
=> 컨테이너를 실행할 수 있는 실행파일, 설정 값 등을 포함
dockerfile을 build하면 이미지가 생성
상태 값을 가지지 않고 해당 값이 변하지 않음
같은 이미지로 여러개의 컨테이너 생성 가능, 컨테이너가 수정 삭제되더라도 이미지 원본은 그대로 존재
Container
컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일을 포함한 독립된 공간 생성
수정하고 싶은 사항이 있으면 컨테이너에서 수정 => 수정해도 이미지에는 영향을 미치지 않음
Docker Compose
여러 개의 도커 컨테이너를 정의하고 실행하기 위한 도구로, 하나의 설정 파일로 여러 개의 컨테이너를 묶음단위로 관리하고, 컨테이너 간의 네트워크 및 종속성을 설정하는데 사용
복잡한 응용 프로그램이 여러 컴포넌트로 구성되어 있을 때 사용
Container 가상화 기술을 이용하여 어플리케이션과 개발 환경을 격리된 공간에서 실행하는 단위
Docker hub 공개 이미지를 무료로 저장하고 관리해주는 원격 저장소
Distribution 도커에서 배포하는 사설 이미지 저장소 소스
Hypervisor 하나의 시스템 상에서 가상 컴퓨터를 여러 개 구동할 수 있도록 해주는 중간계층