Docker에 대해 알아보자
Docker의 등장배경
기존에 VMware 나 Virtualbox 와 같은 가상화 플랫폼이 존재했다. 하지만 이것은 OS자체를 가상화 하기 때문에 OS위에 새로운 OS를 구동하는 형태로 굉장히 무겁고 느리다는 문제점이 있었다. 이러한 문제를 해결하기 위한 CPU 가상화 기술이 등장했다. OS 전체를 가상화 방식보다는 성능이 향상 되었으나 OS 를 필요로 한다는 점에서 동일한 성능문제가 있었고. 이를 개선하기 위해 프로세스 격리 하는 방식이 등장하게 된다. 프로세스 격리 방식이 바로 도커의 작동 방식이다.
하나의 서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행할 수가 있게 된 것이다. CPU나 메모리 사용량을 제한할 수 있고, 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수도 있다.
더 상세한 내용과 기본 사용방법은 아래 Reference를 참고바란다. 아주 설명이 잘 되어 있다.
Architecture
Docker client
- Docker는 Clinet-Server 구조를 사용하고 있다. Client는 Container를 빌드, 실행, 배포하는 Daemon과 통신하는 역할을 담당한다.
-
사용자가 Docker와 상호작용하는 방법이다.
- Docker client는 동일한 시스템에서 Daemon과 연결될 수도 있지만, 원격에 있는 Daemon과도 연결될 수 있다.
- Client 와 Deamon은 UNIX 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신한다.
- 또 다른 Docker client는 Docker composer로, Container 세트로 구성된 애플리케이션으로 작업 할 수 있다.
- Clinet 는 둘 이상의 Daemon과 통신할 수 있다.
- ‘docker run’ 명령을 하면 client는 ‘dockerd’ 에 전송하여 실행한다.
Docker daemon
- Docker daemon은 Docker API 요청을 수신하고 image, contrainer, network, volume 과 같은 Docker 객체를 관리한다.
- Daemon은 다른 Daemon과 통신하여 Docker 서비스를 관리 할 수도 있다.
Docker registries
- Docker registry는 Docker image를 저장한다.
- Docker Hub는 누구나 사용할 수 있는 공용 registry이며, 기본적으로 Docker Hub에서 image를 찾도록 구성된다.
- 자신의 개인 registry를 실행할 수도 있다.
Docker objects
Images
- Docker container를 만들기 위한 지침을 가지고 있는 읽기 전용 탬플릿이다.
- 자신의 image를 만들거나 다른 사람이 공용 registry에 올려 놓은 이미지만 사용 가능하다.
- 자체 image를 빌드하려면 image를 생성하고 실행하는데 필요한 단계를 정의하는 Dockerfile 을 생성해야 한다.
- Dockerfile을 변경하고 image를 다시 빌드하면 변경된 레이어만 다시 빌드 된다. 이것은 이미지를 매우 가볍고 작고 빠르게 하는 요소 중 하나다.
Container
- Continer는 image의 실행 가능한 인스턴스이다.
- Docker의 API 또는 CLI를 사용하여 Container를 생성, 시작, 중지, 이동, 삭제 할 수 있다.
- Container를 하나 이상의 네트워크에 연결하거나 스토리지를 연결하거나 현재 상태를 기반으로 새 이미지를 만들 수 있다.
- Container는 다른 container 및 호스트 시스템과 비교적 잘 격리되어 있다.
- Container의 네트워크, 스토리지 또는 기본 하위 시스템이 다른 컨테이너 또는 호스트 시스템에서 분리되는 방식을 제어할 수 있다.
- Container는 image에 의해서 정의되고, Container를 시작하거나 생성할 때 설정하는 구성 옵션에 의해서 정의된다.
Example docker run command
docker run -i -t ubuntu /bin/bash
- 위 명령어는 ubuntu container를 실행하고 동시에 CLI session을 형성하는 명령어이다.
- 명령어가 실행되면 아래와 같은 처리가 순차적으로 발생한다.
- ubuntu 로컬에 image가 없는 경우 Docker는 docker pull ubuntu 를 실행하여, registry에서 이미지를 가져온다.
- 그리고 docker container create 를 실행하여 새로운 container를 만든다.
- 읽기-쓰기 파일 시스템을 최종(final) 레이어로 container에 할당한다. 이를 통해 실행 중인 컨테이너는 로컬 파일 시스템에서 파일과 디렉토리를 만들거나 수정할 수 있다.
- Docker는 네트워킹 옵션을 지정하지 않았으므로, container를 기본 네트워크에 연결하는 네트워크 인터페이스를 만든다. 여기에는 container에 IP 주소 할당이 포함된다. 기본적으로 container는 호스트 머신의 네트워크 연결을 사용하여 외부 네트워크에 연결할 수 있다.
- bin/bash 와 -i 와 -t 를 통해 터미널을 통해 입력 인터페이스를 구성할 수 있다.
- exit 명령어는 container가 중지(stop)되지만 제거(remove)되지는 않는다. 다시 시작하거나 제거가 가능하다.
The underlying technology
- Docker는 Go programming 언어로 작성 되었으며, 리눅스 커널의 여러 기능을 활용한다.
- namespace 라는 기술을 사용하는데, 이는 container라는 격리된 작업 공간을 제공한다.
- container를 실행하면 Docker는 해당 container에 대한 namespace set을 만든다.
- namespaces는 격리된 레이어를 제공한다. container의 각 요소는 separate namespace 에서 실행 되고 access는 해당 namespace로 제한된다.
Reference
- https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html
- https://docs.docker.com/