Docker란 무엇인가요?

Docker란 무엇인가요?

Docker는 애플리케이션을 개발하고, 배포하고, 실행하기 위한 오픈 플랫폼이에요. 애플리케이션을 인프라와 분리해 소프트웨어를 빠르게 전달할 수 있게 해 줘요. 이 가이드에서 Docker 플랫폼, 아키텍처, 이미지와 컨테이너 같은 핵심 객체를 배워요.

출처: 문서

본문

Docker는 애플리케이션을 개발하고, 배포하고, 실행하기 위한 오픈 플랫폼이에요.

Docker는 애플리케이션을 인프라와 분리할 수 있게 해 주므로 소프트웨어를 빠르게 전달할 수 있어요. Docker로 애플리케이션을 관리하는 것과 같은 방식으로 인프라를 관리할 수 있어요. 코드를 배송·테스트·배포하는 Docker의 방법론을 활용하면 코드를 작성하고 프로덕션에서 실행하기까지의 지연을 크게 줄일 수 있어요.

Docker 플랫폼

Docker는 컨테이너라고 불리는 느슨하게 격리된 환경에서 애플리케이션을 패키징하고 실행하는 기능을 제공해요. 격리와 보안 덕분에 특정 호스트에서 여러 컨테이너를 동시에 실행할 수 있어요. 컨테이너는 가볍고 애플리케이션을 실행하는 데 필요한 모든 것을 담고 있어서, 호스트에 설치된 것에 의존할 필요가 없어요. 작업 중에 컨테이너를 공유할 수 있고, 공유받는 모든 사람이 동일하게 동작하는 같은 컨테이너를 받게 된다는 것을 확신할 수 있어요.

Docker는 컨테이너의 수명 주기를 관리하는 도구와 플랫폼을 제공해요.

  • 컨테이너를 사용해 애플리케이션과 그 지원 구성 요소를 개발해요.
  • 컨테이너가 애플리케이션을 배포하고 테스트하는 단위가 돼요.
  • 준비가 되면 컨테이너나 오케스트레이션된 서비스로 애플리케이션을 프로덕션 환경에 배포해요. 프로덕션 환경이 로컬 데이터 센터든, 클라우드 제공자든, 둘의 하이브리드든 동일하게 동작해요.

Docker로 무엇을 할 수 있나요?

빠르고 일관된 애플리케이션 전달

Docker는 개발자가 애플리케이션과 서비스를 제공하는 로컬 컨테이너를 사용해 표준화된 환경에서 작업할 수 있게 함으로써 개발 수명 주기를 간소화해요. 컨테이너는 지속적 통합과 지속적 배포(CI/CD) 워크플로에 훌륭해요.

다음 예시 시나리오를 생각해 보세요.

  • 개발자는 로컬에서 코드를 작성하고 Docker 컨테이너를 사용해 동료들과 작업을 공유해요.
  • Docker를 사용해 애플리케이션을 테스트 환경에 푸시하고 자동·수동 테스트를 실행해요.
  • 개발자가 버그를 찾으면 개발 환경에서 고치고, 테스트와 검증을 위해 테스트 환경에 재배포해요.
  • 테스트가 완료되면 업데이트된 이미지를 프로덕션 환경에 푸시하는 것만으로 고객에게 수정 사항을 제공할 수 있어요.

신속한 배포와 확장

Docker의 컨테이너 기반 플랫폼은 고도로 이식 가능한 워크로드를 허용해요. Docker 컨테이너는 개발자의 로컬 노트북, 데이터 센터의 물리적·가상 머신, 클라우드 제공자, 또는 여러 환경의 혼합에서 실행될 수 있어요.

Docker의 이식성과 가벼운 특성 덕분에 워크로드를 동적으로 관리하기도 쉬워요. 비즈니스 요구에 따라 거의 실시간으로 애플리케이션과 서비스를 확장하거나 축소할 수 있어요.

같은 하드웨어에서 더 많은 워크로드 실행

Docker는 가볍고 빠르며, 하이퍼바이저 기반 가상 머신에 대한 실용적이고 비용 효율적인 대안을 제공해요. 서버 용량을 더 많이 활용해 비즈니스 목표를 달성할 수 있어요. Docker는 고밀도 환경과 더 적은 리소스로 더 많은 것을 해내야 하는 중소 규모 배포에 완벽해요.

Docker 아키텍처

Docker는 클라이언트-서버 아키텍처를 사용해요. Docker 클라이언트가 Docker 데몬과 통신하며, 데몬이 Docker 컨테이너의 빌드, 실행, 배포라는 무거운 작업을 처리해요. Docker 클라이언트와 데몬은 같은 시스템에서 실행될 수도 있고, Docker 클라이언트를 원격 Docker 데몬에 연결할 수도 있어요. Docker 클라이언트와 데몬은 UNIX 소켓이나 네트워크 인터페이스를 통해 REST API로 통신해요. 또 다른 Docker 클라이언트인 Docker Compose는 컨테이너 집합으로 이루어진 애플리케이션 작업을 가능하게 해요.

Docker 데몬

Docker 데몬(dockerd)은 Docker API 요청을 수신 대기하고 이미지, 컨테이너, 네트워크, 볼륨 같은 Docker 객체를 관리해요. 데몬은 다른 데몬과 통신해 Docker 서비스를 관리할 수도 있어요.

Docker 클라이언트

Docker 클라이언트(docker)는 많은 Docker 사용자가 Docker와 상호작용하는 기본적인 방법이에요. docker run 같은 명령을 사용하면 클라이언트가 이 명령을 dockerd로 보내고 데몬이 실행해요. docker 명령은 Docker API를 사용해요. Docker 클라이언트는 둘 이상의 데몬과 통신할 수 있어요.

Docker Desktop

Docker Desktop은 Mac, Windows, Linux 환경을 위한 설치하기 쉬운 애플리케이션이에요. 컨테이너화된 애플리케이션과 마이크로서비스를 빌드하고 공유할 수 있게 해 줘요. Docker Desktop에는 Docker 데몬(dockerd), Docker 클라이언트(docker), Docker Compose, Docker Content Trust, Kubernetes, Credential Helper가 포함돼 있어요. 자세한 내용은 Docker Desktop을 참고하세요.

Docker 레지스트리

Docker 레지스트리는 Docker 이미지를 저장해요. Docker Hub는 누구나 사용할 수 있는 공개 레지스트리이며, Docker는 기본적으로 Docker Hub에서 이미지를 찾아요. 나만의 비공개 레지스트리를 운영할 수도 있어요.

docker pull이나 docker run 명령을 사용하면 Docker는 구성된 레지스트리에서 필요한 이미지를 풀해요. docker push 명령을 사용하면 Docker는 이미지를 구성된 레지스트리로 푸시해요.

Docker 객체

Docker를 사용할 때 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 객체를 만들고 사용하게 돼요. 이 섹션은 그중 일부 객체에 대한 간략한 개요예요.

이미지 (Images)

이미지는 Docker 컨테이너를 만들기 위한 지침을 담은 읽기 전용 템플릿이에요. 흔히 이미지는 다른 이미지를 기반으로 추가 커스터마이즈가 더해진 형태예요. 예를 들어 Ubuntu 이미지를 기반으로 하지만 Apache 웹 서버와 여러분의 애플리케이션, 그리고 애플리케이션 실행에 필요한 구성 세부 사항을 포함하는 이미지를 빌드할 수 있어요.

나만의 이미지를 만들 수도 있고, 다른 사람이 만들어 레지스트리에 게시한 이미지만 사용할 수도 있어요. 나만의 이미지를 빌드하려면 이미지를 만들고 실행하는 데 필요한 단계를 정의하는 간단한 문법으로 Dockerfile을 작성해요. Dockerfile의 각 지시문은 이미지에 레이어를 하나 만들어요. Dockerfile을 변경하고 이미지를 다시 빌드하면 변경된 레이어만 다시 빌드돼요. 이것이 다른 가상화 기술과 비교했을 때 이미지가 매우 가볍고, 작고, 빠른 이유 중 일부예요.

컨테이너 (Containers)

컨테이너는 이미지의 실행 가능한 인스턴스예요. Docker API나 CLI로 컨테이너를 만들고, 시작하고, 중지하고, 이동하거나 삭제할 수 있어요. 컨테이너를 하나 이상의 네트워크에 연결하고, 스토리지를 연결하고, 현재 상태를 기반으로 새 이미지를 만들 수도 있어요.

기본적으로 컨테이너는 다른 컨테이너와 호스트 머신으로부터 비교적 잘 격리돼 있어요. 컨테이너의 네트워크, 스토리지, 또는 기타 하위 시스템이 다른 컨테이너나 호스트 머신으로부터 얼마나 격리되는지 제어할 수 있어요.

컨테이너는 이미지와 생성·시작 시 제공하는 구성 옵션으로 정의돼요. 컨테이너가 제거되면 영구 저장소에 저장되지 않은 상태 변경은 사라져요.

예시: docker run 명령

다음 명령은 ubuntu 컨테이너를 실행하고, 로컬 명령줄 세션에 대화형으로 연결하며, /bin/bash를 실행해요.

$ docker run -i -t ubuntu /bin/bash

이 명령을 실행하면 다음이 일어나요. (기본 레지스트리 구성을 사용한다고 가정해요)

  • 로컬에 ubuntu 이미지가 없으면 Docker는 docker pull ubuntu를 수동으로 실행한 것처럼 구성된 레지스트리에서 이미지를 풀해요.
  • Docker는 docker container create 명령을 수동으로 실행한 것처럼 새 컨테이너를 만들어요.
  • Docker는 최종 레이어로 컨테이너에 읽기-쓰기 파일시스템을 할당해요. 이 덕분에 실행 중인 컨테이너가 로컬 파일시스템에서 파일과 디렉터리를 만들거나 수정할 수 있어요.
  • 네트워킹 옵션을 지정하지 않았으므로 Docker는 컨테이너를 기본 네트워크에 연결하는 네트워크 인터페이스를 만들어요. 여기에는 컨테이너에 IP 주소를 할당하는 것도 포함돼요. 기본적으로 컨테이너는 호스트 머신의 네트워크 연결을 사용해 외부 네트워크에 연결할 수 있어요.
  • Docker는 컨테이너를 시작하고 /bin/bash를 실행해요. 컨테이너가 대화형으로 실행되고 터미널에 연결되어 있으므로(-i-t 플래그 덕분에), 키보드로 입력을 제공하고 Docker는 출력을 터미널에 기록해요.
  • exit를 실행해 /bin/bash 명령을 종료하면 컨테이너는 중지되지만 제거되지는 않아요. 다시 시작하거나 제거할 수 있어요.

기반 기술

Docker는 Go 프로그래밍 언어로 작성됐으며, Linux 커널의 여러 기능을 활용해 기능을 제공해요. Docker는 namespaces라는 기술을 사용해 컨테이너라고 불리는 격리된 작업 공간을 제공해요. 컨테이너를 실행하면 Docker는 그 컨테이너를 위한 일련의 네임스페이스를 만들어요.

이 네임스페이스들은 격리 계층을 제공해요. 컨테이너의 각 측면은 별도의 네임스페이스에서 실행되며, 그 접근은 해당 네임스페이스로 제한돼요.

다음 단계

더 알아보기 (Learn more)