Docker는 Go언어로 개발된 애플리케이션 개발, 배포 및 실행을 위한 오픈 플랫폼입니다.
Docker는 애플리케이션과 그 실행 환경을 '컨테이너'라고 하는 작은 패키지로 묶어 관리합니다.
이 컨테이너는 어디서나 동일하게 작동하여, 개발자가 소프트웨어를 더 빠르고 쉽게 배포할 수 있게 돕습니다.
컨테이너는 아주 가벼우며 애플리케이션을 실행하는 데 필요한 모든 것을 포함합니다. 애플리케이션을 실행하는 데 필요한 환경을 컴퓨터에 직접 설치할 필요가 없다는 의미입니다.
그 결과, 개발자들은 컴퓨터 환경에 구애받지 않고 자유롭게 애플리케이션을 개발하고 테스트할 수 있습니다.
Docker는 로컬 컨테이너를 통해 애플리케이션과 서비스를 제공하여 개발자가 표준화된 환경에서 작업할 수 있도록 도와줍니다.
즉, 모든 사용자가 동일한 환경에서 애플리케이션을 실행할 수 있습니다.
개발자들은 자신의 코드를 Docker 컨테이너에 담아 동료와 공유할 수 있습니다.
이렇게 하면 모든 개발자가 동일한 환경에서 작업할 수 있어, 협업이 용이해집니다.
애플리케이션을 컨테이너로 배포하면, 다양한 컴퓨터 환경에서도 문제 없이 실행됩니다.
컨테이너는 CI/CD 워크플로우에 매우 적합합니다.
Docker는 애플리케이션을 관리하는 방법으로 인프라를 관리할 수 있게 해주어, 인프라와 애플리케이션 관리가 통합되고 간소화됩니다.
이처럼 Docker는 개발부터 배포까지의 과정을 간소화하고 빠르게 할 수 있게 도와주는 도구입니다.
Docker는 경량이어서 서버 용량을 더 많이 활용할 수 있으며, 가상 머신에 비해 속도도 빠릅니다.
하이퍼바이저 기반의 가상 머신에 대한 비용 효율적인 대안책으로 Docker를 사용할 수 있습니다.
Docker는 클라이언트-서버 구조를 사용합니다.
Docker 클라이언트는 Docker 데몬과 통신하여 Docker 컨테이너의 구축, 실행 및 배포와 같은 중요 작업을 수행합니다.
여기서 클라이언트는 사용자가 Docker와 상호작용하는 인터페이스이며, 데몬은 실제로 컨테이너를 만들고 실행하는 무거운 작업을 담당합니다.
Docker 클라이언트와 데몬은 동일한 시스템에서 실행될 수도 있고, Docker 클라이언트를 원격 Docker 데몬에 연결할 수도 있습니다. Docker 클라이언트와 데몬은 REST API를 통해 통신하며, 이는 UNIX 소켓이나 네트워크 인터페이스를 통해 이루어집니다.
또 다른 Docker 클라이언트인 Docker Compose는 여러 컨테이너로 구성된 애플리케이션을 다룰 때 사용됩니다.
Docker 데몬은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크, 볼륨과 같은 Docker 객체를 관리합니다.
데몬은 다른 데몬과 통신하여 Docker 서비스를 관리할 수도 있습니다.
Docker 클라이언트는 많은 Docker 사용자가 Docker와 상호 작용하는 주요 방법입니다.
docker run
과 같은 명령어를 사용할 때, 클라이언트는 이러한 명령을 dockerd에 보내 실행하게 합니다.
Docker 클라이언트는 Docker API를 사용하며, 여러 데몬과 통신할 수 있습니다.
Docker Desktop은 Mac, Windows 또는 Linux 환경에서 설치하기 쉬운 애플리케이션으로, 컨테이너화된 애플리케이션 및 마이크로서비스를 구축하고 공유할 수 있게 해줍니다.
Docker Desktop에는 Docker 데몬(dockerd), Docker 클라이언트(docker), Docker Compose, Docker Content Trust, Kubernetes, Credential Helper가 포함되어 있습니다.
Docker 레지스트리는 Docker 이미지를 저장 및 공유할 수 있는 저장소라고 할 수 있습니다.
기본 Docker 레지스트리는 Docker Hub 인데, Docker Hub 말고도 Amazon Elastic Container Registry(ECR), Azure Container Registry (ACR), Google Container Registry (GCR) 등 다양한 레지스트리가 있습니다.
또한, 자신의 로컬 시스템이나 조직 내에서 개인 레지스트리를 운영할 수도 있습니다. 예로는 Harbor, JFrog Artifactory, GitLab Container registry 등이 있습니다.
docker pull
또는 docker run
명령을 사용할 때, Docker는 설정된 레지스트리에서 필요한 이미지를 가져옵니다.
docker push 명령을 사용할 때, Docker는 이미지를 설정된 레지스트리로 푸시합니다.
이 둘은 비슷해 보이지만 실제로는 조금 다릅니다.
레지스트리는 컨테이너 이미지를 저장하는 큰 저장소입니다. 이곳은 여러 다양한 이미지들을 안전하게 보관하고 관리하는 중앙 집중식 위치라고 생각할 수 있습니다. 예를 들어, 도서관이라고 생각하면 쉽습니다. 도서관에는 많은 책들이 있고, 방문자들은 필요한 책을 찾아 볼 수 있습니다.
리포지토리는 특정 종류의 이미지들을 모아 놓은 곳으로, 레지스트리 안에 위치합니다. 이는 하나의 주제나 프로젝트 관련 이미지들을 모아 둔 책장이라고 할 수 있습니다. 예를 들어, Python 이미지들만 모아둔 리포지토리, 또는 특정 애플리케이션을 위한 이미지들을 모아둔 리포지토리 등이 있을 수 있습니다.
즉, 레지스트리는 전체적인 저장 공간을 의미하며, 리포지토리는 그 안에서 관련된 이미지들을 그룹화하여 관리하는 세분화된 공간입니다. 이 구분을 이해하면 컨테이너 이미지를 더 체계적으로 다루고 관리할 수 있습니다.
도커 이미지는 컨테이너를 실행하기 위한 템플릿(모든 파일, 바이너리, 라이브러리, 그리고 설정을 포함한 표준화된 패키지)입니다.
예를 들어, PostgreSQL 이미지는 데이터베이스 바이너리, 설정 파일 및 기타 의존성을 패키지로 제공합니다.
이미지를 만들기 위해, 이미지를 생성하고 실행하는 단계를 정의하는 Dockerfile을 작성합니다.
Dockerfile의 각 명령어는 이미지에서 하나의 레이어를 생성합니다.
Dockerfile을 변경하고 이미지를 다시 빌드할 때 변경된 레이어만 재구축됩니다. 이는 다른 가상화 기술에 비해 이미지를 가볍고, 작고, 빠르게 만드는 요소 중 하나입니다.
실행 중인 컨테이너는 격리된 파일 시스템을 사용합니다.
이 격리된 파일 시스템은 이미지에 의해 제공되며, 이미지는 애플리케이션을 실행하는 데 필요한 모든 것(모든 의존성, 설정, 스크립트, 바이너리 등)을 포함해야 합니다.
이미지에는 또한 컨테이너에 대한 다른 구성들도 포함되어 있습니다. 예를 들어, 환경 변수, 기본 실행 명령, 기타 메타데이터 등이 있습니다.
컨테이너는 이미지의 실행 가능한 인스턴스입니다(이미지로부터 만든 인스턴스를 컨테이너라고 한다).
Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 정지, 이동 또는 삭제할 수 있습니다.
컨테이너를 하나 이상의 네트워크에 연결하거나, 저장소를 연결하거나, 현재 상태를 기반으로 새 이미지를 생성할 수도 있습니다.
컨테이너는 생성 또는 시작할 때 제공하는 이미지 및 모든 구성 옵션에 의해 정의됩니다.
각 컨테이너는 실행하는데 필요한 모든 것들을 포함하고 있습니다. 호스트 기계에 설치된 의존성에 의존하지 않습니다.
컨테이너는 호스트 기계에서 실행되는 다른 모든 프로세스로부터 격리된 환경에서 동작하며, 각각의 컨테이너 또한 서로 격리된 환경에서 동작합니다.
따라서 각각의 컨테이너에서 일어나는 변경사항들은 서로 다른 컨테이너, 그리고 호스트에 영향을 미치지 않습니다.
또한 각 컨테이너는 독립적이기 때문에 하나의 컨테이너를 삭제해도 다른 컨테이너에 영향을 미치지 않습니다.
컨테이너를 제거하면 영구 저장소에 저장되지 않은 상태의 변경 사항은 사라집니다.
컨테이너는 어디에서나 실행할 수 있습니다. 다양한 컴퓨터 환경(OS, 클라우드 등)에서 언제나 동일하게 동작합니다.
VM은 자체 커널, 하드웨어 드라이버, 프로그램, 애플리케이션을 갖춘 완전한 운영 시스템입니다. 단일 애플리케이션을 격리하기 위해 VM을 실행하는 것은 많은 오버헤드를 요구합니다.