Search

What is Docker?

개발, 설치, 앱 실행 과정들을 위한 오픈소스 플랫폼
내 앱을 인프라와 분리시킴으로써 소프트웨어 개발을 더 수월하게 해줌 다른 사람들과 내 개발 환경을 동일하게 만들어줌으로써 인프라를 알아서 관리할 수 있게 해줌

The Docker platform

Container라고 불리는 느슨하게 독립된 환경(loosely isolated environment)에서 앱을 실행하고 패키지하는 능력을 제공. 독립성과 보완성은, 호스트에게 동시에 많은 컨테이너들을 실행할 수 있도록 해줌. 컨테이너는 가볍고 앱을 실행하기 위한 것들을 포함 → 호스트가 무엇을 설치했는지에 대해 의존할 필요X. 모든 사람들이 내가 일하는 환경과 동일한 환경에서 실행할 수 있음
도커는 컨테이너의 생애주기(lifecycle)를 관리하기 위한 플랫픔과 도구들을 제공
컨테이너를 사용해 앱과 구성요소들(supporting components)을 개발
컨테이너는, 앱을 분산시키고 테스트하기 위한 단위(unit)가 됨
개발이 완료되면, container나 orchestrated 서비스로서 배포 가능. 이로서 앱의 개발환경이 어디서든 동일할 수 있게됨
EX) 온-프레미스 환경(local data center), 클라우드 환경(cloud provider), 하이브리드 환경

What can I use Docker for?

1. Fast, consistent delivery of your applications

도커는 앱과 서비스에 제공하는 로컬 컨테이너를 사용해 표준화된 환경 내에서 개발자들이 일 할 수 있게끔 개발 lifecycle을 간소화할 수 있음. 컨테이너들은 CI/CD workflow에 좋음
다음과 같은 상황들:
도커 컨테이너를 사용해 작업물을 공유하고 코드를 로컬에서 작성할 때
도커를 통해 앱을 테스트 환경에 넣고 자동화(또는 수동) 환경에서 실행시킬 때
버그를 개발 환경에서 수정한 후, 테스트 & 검증을 위해 테스트 환경에 재배포할 때
테스트가 끝나고, 수정사항을 production 환경에 업데이트된 이미지를 넣음으로써 편하게 제공하고자 할 때

2. Responsive deployment and scaling

도커의 컨테이너 기반 플랫폼은, 높은 휴대성을 지닌 workflow를 가능하게끔 해줌. 도커 컨테이너는 개발자 로컬 컴퓨터, 데이터 센터 내 머신들(physical or virtual), 클라우드 환경 모두에서 실행 가능
도커의 휴대성과 가벼움은 동적으로 workload를 관리하고, 앱을 요구에 맞춰 실시간으로 scale-up, tear down할 수 있게끔 해줌

3. Running more workloads on the same hardware

도커는 가볍고 빠름. 이는 hypervisor-based virtual machine의 대안으로서 생존 가능하고 비용 효율성을 제공. 따라서 서버 용량을 더 많이 사용 가능. 도커는 더 적은 자원들로 조금이라도 더 많이 배포하고자 할 때고밀도 환경을 제공하고자 할 때 적합

Docker architecture

클라이언트-서버 아키텍쳐
Docker client는 무거운 빌드, 실행, 컨테이너 분산 작업들을 수행하는 Docker daemon에게 요청. Docker client와 daemon은 동일 시스템에서 실행하거나 Docker client를 remote Docker daemon에 연결 가능. Docker client와 daemon은 UNIX socket이나 network interface 위에서 REST API를 사용. 또다른 Docker client는 Docker Compose이며, 이는 컨테이너 묶음(set)으로 구성된 앱들을 작동할 수 있게끔 해줌

The Docker daemon

dockerd
Docker API 요청(API request)을 기다리고 있다가 이미지, 컨테이너, 네트워크, 볼륨과 같은 객체(Object)들을 관리. 또한 다른 daemon들과 통신하면서 Docker 서비스들을 관리

The Docker client

docker
많은 도커 유저들이 도커와 상호작용(interact)하기 위한 주된 방법. docker run 같은 명령어들을 실행하면, client가 명령어들을 dockerd에 전송. docker 명령어는 docker API를 사용. Docker client는 하나 이상의 daemon과 통신 가능

Docker Desktop

컨테이너화된 앱들과 마이크로서비스들을 빌드하고 공유할 수 있게끔 Mac, Windows, Linux 환경에 쉽게 설치하는 앱. 도커 데스크탑은 Docker daemon(dockerd), Docker client(docker), Docker compose, Docker Content Trust, Kubernetes, Credential Helper들을 포함함

Docker registries

도커 이미지들을 저장함. 누구나 사용가능한 public registry. Docker는 기본적으로 Docker hub에 있는 이미지들을 찾음. 물론 자신만의 private registry에서도 도커를 실행 가능
docker pull이나 docker run 명령어를 실행할 때, 도커는 registry로부터 필요한 이미지들을 받아옴. 또한 docker push 명령어를 실행할 때, registry에 이미지를 집어넣음

Docker objects

도커를 사용하면, 이미지, 컨테이너, 네트워크, 볼륨, 플러그인, 다른 객체(object)들을 생성하고 이용 (다음은 몇몇 객체들에 대한 간단 개요 내용)

Images

도커 컨테이너를 생성하기 위해 지침들(introductions)을 작성한 읽기 전용(read-only) 템플릿. 종종 이미지들은 추가적인 커스터마이징이 진행된 또 다른 이미지들을 기반으로 만들어짐.
레지스트리에 올라가있는 다른 사람들의 이미지들을 사용하거나, 자신만의 이미지를 생성해도 됨. 자신만의 이미지를 생성하려면, 이미지를 생성하고 실행하기 위한 몇 가지 과정들을 정의하는 간단한 문법들을 Dockerfile에 작성해주면 됨. Dockerfile의 각 지침들(introuctions)은 하나의 층(layer)을 생성. 만약 Dockerfile을 수정하거나 이미지를 재빌드하면, 바뀐 층(layer)만 변경되거나 다시 만들어짐.
이런 점이 다른 가상화 기술들과 비교했을 때, 무엇이 이미지를 가볍고 작고 빠르게 만들어내는가에 대한 부분에 해당

Containers

이미지의 실행 가능한 예시(runnable instance)에 해당. Docker API나 CLI를 사용해 컨테이너를 생성하거나 실행하거나 정지하거나 이동하거나 삭제 가능. 컨테이너를 하나 이상의 네트워크에 연결하거나, 컨테이너를 스토리지에 연결하거나, 현재 상태(current state)를 기반으로 새 이미지를 생성할 수도 있음
기본적으로는, 컨테이너는 다른 컨테이너들과 호스트 머신과 상대적으로 잘 분리되어 있음. 다른 컨테이너들 및 호스트 머신들로부터 컨테이너의 네트워크, 스토리지, 기반 서브시스템(underlying subsystems)을 격리시킬 건지 제어할 수 있음
컨테이너 생성 당시 설정한 구성 옵션(configuration options)들 및 이미지로부터 컨테이너가 정의됨. 컨테이너가 삭제되고 나면, 영구 스토리지에 저장되지 않은 컨테이너 상태 변화들은 사라짐

Example docker run command

docker run -i -t ubuntu /bin/bash
Bash
복사
우분투 컨테이너를 실행하는 명령어 : 명령줄 세션과 상호작용하면서 /bin/bash를 실행
해당 명령어를 실행하면, 다음 내용들이 발생함(기본 설정을 사용한다는 가정하에):
1.
로컬에 ubuntu 이미지가 없으면, 도커가 설정되어있는 레지스트리로부터 ubuntu 이미지를 pull해옴(마치 docker pull ubuntu 명령어를 실행한 것처럼)
2.
도커가 새 컨테이너를 생성(마치 docker container create 명령어를 실행한 것처럼)
3.
도커가 컨테이너에게 읽기-쓰기 파일 시스템 권한을 할당해줌(final layer처럼). 이를 통해 실행중인 컨테이너가 로컬에 있는 파일 & 폴더를 수정 및 생성할 수 있음
4.
도커가 기본 네트워크(네트워크 옵션을 적지 않았기 때문)에 컨테이너를 연결할 네트워크 인터페이스를 생성. 이 과정은 컨테이너에 IP 주소를 할당하는 것도 포함. 기본적으로, 컨테이너는 호스트 머신의 네트워크 연결을 이용해 외부 네트워크에 연결 가능
5.
도커가 컨테이너를 시작하고 /bin/bash 파일을 실행. 컨테이너가 터미널에 부착된 채로 사용자와 상호작용하기 때문에(-i, -t 플래그로 인해), 사용자는 키보드를 통해 입력(input)이 가능하고 도커가 터미널에 로그를 출력(output) 가능
6.
/bin/bash 명령을 종료하기 위해 exit 명령을 실행하면, 컨테이너가 중단(stop)되지만 삭제(remove)되진 않음. 나중에 재실행하거나 삭제 가능
명령어 실행 결과 화면

The underlying technology

Go 프로그래밍 언어로 작성되었고 이러한 기능을 제공하기 위해 리눅스 커널의 몇몇 기능의 이점들을 활용함. 도커는 컨테이너라고 불리는 격리된 업무 환경(workspace) 제공하기 위해 namespace라 불리는 기술을 사용함. 컨테이너를 실행하면, 도커는 해당 컨테이너에 대한 namespace 집합(set)을 생성
이러한 namespace들은 격리 계층(layer of isolation)을 제공. 각 컨테이너는 분리된 namespace에서 실행되고, 이러한 접근은 해당 namespace에게만 제한됨