도커를 알아보기 이전에 가상화부터 알아보자.
사실 가상화는 AWS 정리를 하면서 이미 정리를 해놓았다.
가상화를 모른다면, 사실 가상화를 알아도, 도커를 알아보기 이전에 한번 보고 오자.
가상화 개념에 더해서, 도커를 쓰면 굳이 독립된 운영체제를 여러 개 띄울 필요 없이 리눅스 진영에서 쓰이는 것들을 하나로 퉁 치게 된다. 즉 최적화가 너무 잘 된 가상화 개념이 바로 컨테이너이다.
Docker Container
- 가상화된 공간을 생성할 때 리눅스 자체 기능을 사용하여 프로세스 단위의 격리 환경을 만듦
- 가상 머신과 달리 커널을 공유해서 사용하므로, 컨테이너에는 라이브러리 및 실행파일만 존재하여 용량이 비교적으로 작음
- 위의 이유로, 컨테이너를 만들 때 배포하는 시간이 가상머신에 비해 빠르며, 사용할 때의 성능 손실 또한 거의 없음
Docker Architecture
Docker Daemon
도커 데몬(
dockerd
)는 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크, 볼륨 등의 도커 오브젝트를 관리한다.Docker Client
도커 클라이언트(
docker
)는 도커 서버와 통신하기 위한 가장 주요한 기능을 수행한다. 예를 들어, docker run 명령어를 실행하면 도커 클라이언트는 해당 명령어를 REST API Call으로 변환하여 도커 데몬(dockerd
)로 전송한다.Docker Registries
도커 레지스트리는 도커 이미지를 저장하는 저장소 역할을 한다.
Docker Hub
는 퍼블릭 도커 레지스트리로, 도커는 레지스트리 기본 값으로 Docker Hub를 사용한다. 사용자는 프라이빗 레지스트리를 구축하여 사용할 수 있다. 사용자가 docker pull
혹은 docker run
과 같은 명령어를 실행하면, 도커는 사용자가 요청한 이미지를 도커 레지스트리에서 찾아서 가져온다. 사용자가 docker push
명령어를 실행하면 도커는 이미지를 레지스트리에 저장한다.⇒ 도커 레지스트리는 사실 깃헙과 같은 개념으로 생각해도 무방할 것…!
Docker Objects
Images
이미지는 read-only 템플릿으로 도커 컨테이너를 생성하기 위해 필요한 절차를 기록한 것이다. 도커의 이미지는 유니온 마운트 기반의 파일 시스템에서 레이어(layer)를 중첩하여 쌓는 방식으로 생성된다. 대개의 경우, 이미지는 기본 이미지 위에 추가로 명령어를 쌓는 방식으로 생성될 수 있다. 예를 들어, 사용자는
ubuntu
이미지 위에 다양한 어플리케이션을 얹어 새로운 이미지를 빌드할 수 있다.사용자는 자신이 빌드한 이미지를
docker push
명령어를 활용해 도커 레지스트리로 업로드 할 수 있다. 이미지를 직접 생성하기 위해서는 Dockerfile
에 이미지 생성을 위한 명령어를 추가하고 docker build
명령어를 활용할 수 있다. 도커의 이미지는 레이어(layer)를 중첩하는 방식으로 생성되기 때문에, 한번 빌드된 이미지의 중간 레이어는 캐싱되어 이후 다른 이미지를 빌드할 때 재활용 할 수 있다.Containers
컨테이너는 이미지를 실행한 결과로 생성되는 인스턴스를 의미한다. 사용자는 도커 클라이언트의 명령어를 호출함으로써, 컨테이너를 관리할 수 있다. 도커의 컨테이너는 네임스페이스와 컨트롤 그룹을 호스트 환경에서 격리시킨 하나의 프로세스로 컨테이너는 다양한 네트워크 네임스페이스와 연결될 수 있고, 새로운 볼륨을 해당 컨테이너 네임스페이스에 마운트 하는 것도 가능하다.
여기까지 정리!
dockerfile: Docker 이미지를 만들기 위한 설정 파일
docker 이미지: 컨테이너를 생성하는 데 필요한 모든 것을 포함한 일종의 템플릿
컨테이너: 이미지를 실행한 결과로, 애플리케이션이 실제로 구동되는 환경
Docker Compose
여러 개의 컨테이너를 정의하고 관리할 수 있도록 도와주는 도구.
보통 복잡한 애플리케이션은 여러 서비스(예: 웹 서버, 데이터베이스, 캐시 등)로 구성되며, 이 각각의 서비스는 별도의 컨테이너에서 실행된다.
Docker Compose를 사용하면 이러한 여러 컨테이너를 한 번에 정의하고 실행할 수 있다.
Container-Orchestration. 즉 컨테이너 오케스트레이션이란 여러 컨테이너들의 생명주기를 관리하는 도구이다. kubernetes까지 공부할 생각이지만, 지금 공부하는 docker-compose도 작은 컨테이너 오케스트레이션 도구라고 생각하자.
또한 docker-compose는 IaC(Infrastructure as Code), 즉 코드로서 인프라를 관리하고 제어하는 것이 가능하다. docker-compose를 쓴다면
docker-compose.yml
파일을 사용하게 되는데, 파일 형태로 컨테이너를 관리하게 될 수 있다.또한 docker network, volume, config 등의 자원을 함께 기술하여 사용할 수 있다.
→ docker compose를 사용하는 방법은 추후 새로운 포스팅을 올리도록 하겠당