Docker is an open platform for developing, shipping, and running application
도커는 애플리케이션을 우리의 infrastructure에서 분리하여 소프트웨어를 빠르게 전달할 수 있다
도커를 사용하면 애플리케이션 관리를 위한 infrastructure을 동일하게 유지 가능
어플리케이션의 구동에는 Dependency, 환경설정 등 여러가지가 필요함
이러한 환경 설정들을 매번 설치하고 바꿔주는 것은 번거롭고 오류 발생 가능
또한 문제로 로컬과 서버의 환경이 달라 동작이 차이가 발생
이러한 문제를 해결하기 위해 도커에서는 컨테이너라는 소프트웨어 유닛에 어플리케이션의 동작에 필요한 여러가지 환경 설정과 라이브러리 등의 리소스들을 포함시킨다
이러한 컨테이너를 통해 어플리케이션을 어느 환경에서도 동일하게 수행이 가능
가상화 머신 vs 컨테이너
Guest OS를 설치하고 그 위에 어플리케이션을 올리는 가상화 머신과 달리, 컨테이너는 container engine이라는 소프트웨어 위에서 독립적으로 동작하는 컨테이너를 구성하여 별도의 운영체제를 설치하지 않고 Host OS를 공유한다
이러한 컨테이너 엔진 중 하나가 Docker이다
Docker provides the ability to package and run an application in a loosely isolated environment called a container.
이러한 특징들 덕분에 같은 컨테이너를 공유한다면 모두가 동일한 개발환경에서 작업이 가능하다
도커는 client-server
구조를 사용한다
docker cilent
가 docker daemon
에게 컨테이너의 빌드, 실행, 배포 등의 작업을 요청
docker client
와 docker daemon
은 REST API를 통해 통신
Docker Compose
는 docker client 중 하나로, 여러 컨테이너로 구성된 애플리케이션을 다룰 수 있게 해준다
Docker daemon(dockerd)는 Docker API request를 대기하고 Docker object들을 처리
daemon은 Docker service의 관리를 위해 다른 deamon과의 통신도 가능
Docker client는 Docker 사용자가 Docker와 상호작용하는 기본적인 방법
docker run
와 같은 커맨드 사용 시 client는 이 커맨드를 dockerd로 전달한다
docker 명령어는 Docker API를 사용한다
Docker client는 하나 이상의 daemon과 통신할 수 있다
Docker registry는 Docker image들을 저장한다
Docker Hub는 public registry
Docker는 기본적으로 Docker Hub에서 이미지들을 찾고, private registry를 활용할 수도 있다
docker pull
또는 docker run
커맨드 사용 시 설정된 registry로부터 이미지를 가져온다
docker push
커맨드 사용 시 설정된 registry로 이미지를 push 한다
Docker container를 만들기 위한 read-only 템플릿
image는 다른 image에 custumization를 더한 형태로 많이 사용된다
rigistry에서 가져오거나 Dockerfile을 이용하여 직접 image를 만들 수 있다
Dockerfile의 각 명령어는 이미지에 layer을 만들고 Dockerfile이 수정되어 이미지를 rebuild하면 수정된 부분만 rebuild한다
이러한 부분 덕분에 이미지들은 가상화 기술과 비교했을 때 더 lightweight, samll, fast 하다
컨테이너는 실행가능한 이미지의 인스턴스
Docker API 또는 CLI로 create, start, stop, move, delete 가능
기본적으로 컨테이너는 다른 컨테이너, host machine과 분리돼있음
컨테이너는 이미지와 생성하거나 시작할 때의 설정을 통해서 정의된다
컨테이너가 삭제되면 영속적이지 않은 곳에 저장한 변경 사항은 사라진다
컨테이너 실행 과정