티스토리 뷰

가상화/Docker_K8s

Docker 강좌 - 1.Overview

청년정신 2019. 6. 21. 03:22
도커 개념

Docker는 개발자와 시스템 관리자가 컨테이너 기술을 사용하여 어플리케이션을 개발 , 배포 및 실행하기 위한 플랫폼이다.
일반적으로 리눅스에서 사용되는 컨테이너 기술을 사용하여 응용프로그램을 배포하는 것을 컨테이너화 시켰다고 이야기 한다.
컨테이너는 새로운 기술을 아니지만 도커를 통해서 과거 보다 편리하고, 간편하게 어플리케이션을 배포하는 데 사용된다.

이러한 컨테이너 기술은 아래와 같은 이유들로 주목을 받고 있으며, 가장 핫한 트렌드로 자리를 잡고 있다.

  • 유연성 (Flexible) : 복잡한 어플리케이션들도 모두 컨테이너화 할 수 있다.
  • 경량화(Lightweight) : 컨테이너는 호스트 커널을 활용하고 공유한다.
  • 변화관리 편의성 (InterChangeable) : 업데이트 및 업그레이드를 즉시 배포할 수 있다.
  • 포터블 (Portable) : 로컬로 구축하고, 클라우드와 가상화에 배치도 가능하며, 어디서나 실행이 가능하다.
  • 확장성 (Scalable) : 컨테이너 복제본을 늘리고 자동으로 배포할 수 있다.
  • 스택화(Stackable) : 서비스들에 대한 수직적 또는 수평적 디자인이 매우 용이하다.




이미지 및 컨테이너 개념

컨테이너는 이미지를 실행하여 시작이 된다.
이미지는 코드, 런타임, 라이브러리, 환경 변수 및 구성 파일, 어플리케이션 등을 실행하는 데 필요한 모든 것을 포함하는 실행가능한 패키지이다.
컨테이너는 이미지의 런타임 인스턴스 단위이며, 이미지가 컨테이너로 실행이 될 때 메모리로 로딩이 된다.
이러한 이미지의 개념은 컨테이너를 구성하는데 있어서 매우 중요한 컨셉이다.
조금 더 쉽게 풀어서 생각해 보면 도커에서 말하는 이미지는 컨테이너를 생성하게 하는 설계도 개념으로 보아도 무방하다.
안을 조금 더 들여다 보면 도커의 이미지는 기본 이미지라고 하는 베이스 이미지와 자신이 필요한 어플리케이션, 라이브러리를 포함 하는 이미지로 논리적으로 구분지을 수 있는데,
구분의 경계는 모호하다.
예를 들면 우분투 베이스 이미지에  nginx를 포함시켜 새롭게 베이스 이미지로 만들 수 있기 때문에 논리적으로만 이해하는 것이 편하다.



컨테이너 및 가상화 머신

컨테이너의 동작 방식은 여러개의 컨테이너들이 같은 호스트 시스템의 커널을 공유하는 방식이다.
이러한 방식은 가상화 기반의 방식에 비해서 메모리를 경량화 시킬 수 있고, 별도의 프로세스를 실행하는 방식을 사용한다.
이에 비해 많이 비교되는 가상화 방식은 하이퍼바이져를 통해 호스트 리소스에 대한 제어권을 소유하는 방식이다.
하이퍼바이저 방식에 따라 Type1, Type2 를 통해 구현하는 방식이 다르긴 하지만, 별도의 운영체제를 구현해야 하고, 대부분 별도의 가상머신과 운영체제에서 어플리케이션을 동작하는 방식으로 디자인이 된다.
이러한 방식은 컨테이너 방식보다 많은 메모리와 자원을 소모하게 된다.





도커 구성을 위한 환경 

Docker는 현재 상용 버전과 커뮤니티 버전 두가지를 모두 제공하고 있다.
여기에서는 Docker CE(Community Edition) 기반으로 Mac OS, CentOS, Ubuntu Linux등에서 설치 방식을 다룬다.

Docker CE 정보 소개 - 보통 Stable버전을 사용하는 것이 좋다.
  • Stable - 일반적으로 가장 최신의 릴리즈 버전을 이야기 한다.
  • Test - 일반적으로 가용성이 검증 되기 이전의 버전을 이야기 한다.
  • Nightly - 차기 주요 출시를 위한 진행 중인 최신 빌드 버전을 일컫는다.

아래와 같이 데스크 톱 버전과 서버 버전을 운영체제별 지원하고 있다.


버전 넘버링을 통해서 출시일자와 패치를 예측 할 수 있는데, YY.mm.<patch>와 같은 방식으로 구분짓는다.
18.09 버전이면, 2018년 09월에 릴리즈 된 버전이라고 할 수 있다.

❯ docker version
Client: Docker Engine - Community
Version:           18.09.2

# 위의 예를 보면 2018년 9월에 발표된 버전이고, 패치 2라는 것을 알 수 있다.


도커의 설치 전 도커의 아키텍쳐 이해


설치전 개괄적인 도커의 아키텍쳐를 이해하고 접근하면, 설치 과정이나 image를 가지고 컨테이너를 구동할 때 이해하기가 훨씬 쉽다.
먼저 베어메탈의 설치과정과 실치 후의 개괄적인 아키텍쳐와 관리방법을 살펴보자.


일반적으로 물리 서버에 운영체제를 설치할 때는 하드웨어 서버를 준비하고, 서버에 설치한 ISO를 준비한다.
이때 연결은 물리적으로 DVD를 통해서 할 수도 있고, Virtual KVM을 통해 Virtual DVD로 ISO파일을 마운팅 하기도 한다.
이 과정에서 NFS로 마운트하는 등 방법은 다양하다.
이 과정이 마무리 되면 설치가 완료가 된다.
완료 이후에는 물리서버의 관리는 KVM을 통해서 접속을 하고, 운영체제에 접속하기 위해 Telnet,SSH등의 패키지를 추가로 설치 한다.
이후에는 운영체제 위에 관리자가 원하는 서비스를 구동하기 위해 바이너리와 라이브러리를 설치하고 적절한 서비스를 제공한다.
이러한 방법은 전통적인 방법으로 서비스의 확장과 축소에 대한 탄력성이 예측이 가능한 범위에 주로 사용된다.
따라서 탄력적인 운영과 빠른 프로비져닝에 적합한 방법은 아니다.
이러한 이슈를 해결하고저 나온 것이 가상화 이다.


가상화는 앞서 소개한 베어메탈 구성 방식에서 처럼 물리적인 서버가 반드시 필요하다.
대신 서버의 자원 효율성과 탄력적인 운영을 위해 하이퍼바이저를 설치한다.
개인 노트북이 아닌 이상, 대부분은 Hypervisor 가상화 Type2를 기반으로 구성한다.
하이퍼바이저 (e.g VMware ESX, Linux KVM, MS HyperV)를 설치하고 , 여기에 운영체제를 설치하는 방식이다.
하이퍼바이져의 설치 방법은 앞서 소개된 베어메탈에서 운영체제 설치 방식과 동일하다.
하이퍼바이저 설치 이후에 운영체제를 설치하는 방법은, 가상화 클라이언트를 통해서 가상화 서버에 접속하여 가상으로 베어메탈 운영체제를 설치하는 방식을 에뮬레이팅 해서 설치하게 된다.
( e.g 가상화 클라이언트 - vSphere Client, 가상화 서버 - ESX)
설치 이후 관리는 베어메탈과 동일하며, 운영체제는 Telnet, SSH, Remote Console등이 주로 사용되고, 플랫폼의 관리는 하이퍼바이저 클라이언트를 통해 관리 된다.
베어메탈과 비교해서 성능을 이야기 하는 포스팅이나 기술 블로그가 많지만, 이것은 이미 10년 전에 인텔과 AMD에서 가상화를 위한 기술을 CPU에 하드웨어 처리하도록 내장이 되어 베어메탈의 서비스와 유사한 수준의 성능을 제공하고 있다.
따라서 100% 베어메탈의 성능을 가져올 수는 없겠지만 서비스 체감 속도를 성능에서는 느낄 수 없다.


도커의 설치와 구성 과정을 보면, 앞서 2개의 플랫폼 모두에서 적용이 가능하기 때문에 설치를 위한 선수 조건은 베어메탈의 설치와 관리, 가상화 서버의 설치와 관리를 포함하고 있다.
다만 가상화나 베어메탈과 다른 점은 서비스 구동을 위한 설치과정에서 도커는 Image를 사용한다는 것이다.
Image는 ISO와는 조금 다르다. 실제 가상화 서비스나 클라우드 서비스 과정에서 초기 이미지를 만든 이후, OVF나 이후 Snapshot과정으로 관리하는 경우가 많다.
이미 OVF나 Snapshot과정을 수행한다는 의미는 관리자가 필요한 패키지가 설치되어 있기 때문에 사실상 전원을 공급하거나, 가상화에 포팅만 시키면 곧바로 쓸 수 있다는 의미가 된다.
이와 유사한 개념으로 이미지는 코드, 런타임, 라이브러리, 환경 변수 및 구성 파일, 어플리케이션 등을 실행하는 데 필요한 모든 것을 포함하는 실행가능한 패키지를 미리 준비했다고 보면 된다.
이러한 이미지는 로컬과 퍼블릭 도커 허브에서 다운로드 해서 컨테이너에 직접 연결하여 서비스를 제공할 수 있다.
앞서 2개의 케이스와 다른 것은 추가적으로 Docker Client가 필요하다는 것이다.
Docker Client는 도커서비스를 관리하고 모니터링하기 위해 필요한 것으로, vSphere Client와 유사하다고 생각하면 쉽다.


Docker를 구성, 운영하는데 있어서 최종적인 아키텍쳐는 간락하게 위의 모습과 같다.
크게 세가지 구성요소가 필요하다.

1. 도커 클라이언트 
  • 도커를 구성하고 운영 관리하는 패키지로 주로 관리자가 가장 많이 사용한다.
  • 우리가 도커를 운영할 때 사용하는 docker cli 가 여기에 해당된다.

2. 도커 서버
  • 도커 서버는 따로 규정하지 않고, 도커를 실행하는 데몬이 동작하는 개인 랩탑, 서버, 가상화, 클라우드 모두 사용할 수 있다.
  • 내부에는 이미지를 담아 둘 수 있는 볼륨이 필요하고, 해당 이미지는 내부 또는 외부의 repository  사용한다. 
  • 서버는 운영체제가 동작하고, 운영체제에서는 컨테이너 서비스를 제공하고 있어야 한다.
  • 도커 데몬이 동작해야 한다.

3. 이미지
  • 이미지는 로컬 또는 Docker Hub등과 같은 퍼블릭 Repository를 사용할 수 있다.
  • 해당 이미지들은 레이어의 개념으로 효과적인 이미지와 크기 관리가 가능하며, Snapshot의 COW(Copy on Write) 개념과 유사하다.
    (엄청난 기술인 것 처럼 이야기 하지만, 스토리지 기술에서 COW 기술은 낙후된 기술 중 하나이다. 최근에는 워낙 새로운 개념들이 많아져서…)


도커의 설치

도커의 설치는 다양한 방법이 있으나 , 일반적으로 바이너리를 통해서 직접 설치하거나 저장소를 통해서 각 운영체제에서 제공되는 배포 방법을 통해서 구성할 수 있다.

맥에서의 설치 방법
Xhyve/bhyve를 기반으로 하는 HyperKit을 임베디드 하이퍼바이져로 사용한다. 
사용하면서 중요한 내용은 아니지만, 일반 가상화 서버나 베어메탈 서버 위에서의 도커 이미지를 바라보는 방식과는 조금 다르기 때문에 윈도우 PC나 MAC에서 바라보는 개념들이 다를 수 있으므로 이 부분은 인지하고 넘어가는 것이 좋다.
17.12.0-ce Edge 이상부터는 K8s도 지원하고 있다.

1.도커 클라이언트를 설치 받는다.
brew install docker

2.도커 서버 구동을 위해 어플리케이션을 다운로드 받는다.
https://hub.docker.com/editions/community/docker-ce-desktop-mac

다운로드 완료 후에 패키지를 어플리케이션에 배포한다.
설치 완료가 되면 해당 어플리케이션이 맥에서 서버를 구동시키도록 한다.

docker version

Client: Docker Engine - Community
Version:           18.09.2
API version:       1.39
Go version:        go1.10.8
Git commit:        6247962
Built:             Sun Feb 10 04:12:39 2019
OS/Arch:           darwin/amd64
Experimental:      false


Server: Docker Engine - Community
Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     false


CentOS에서의 설치 방법


#docker repo 기반 설치를 위한 패키지 설치

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce repo

#특정버전 설치를 위한 확인

yum list docker-ce --showduplicates | sort -r
sudo yum install “docker특정버전”

# systemctl을 통해 서비스 구동 및 등록.

sudo systemctl start docker
sudo systemctl enable docker

# 도커그룹에 일반유저를 추가 / root에서 항상 실행한다면 필요없음.
sudo usermod -aG docker $USER


[whchoi@cent151 ~]$ docker version
Client:
Version:           18.09.6
API version:       1.39
Go version:        go1.10.8
Git commit:        481bc77156
Built:             Sat May  4 02:34:58 2019
OS/Arch:           linux/amd64
Experimental:      false


Server: Docker Engine - Community
Engine:
  Version:          18.09.6
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       481bc77
  Built:            Sat May  4 02:02:43 2019
  OS/Arch:          linux/amd64
  Experimental:     false

#docker run은 이미지가 없으면 Repo에서 Pull하고 실행까지 수행
#CentOS에서 ubuntu docker image 실행.
#image에 대한 tag를 설정하지 않으면, 항상 latest버전으로 다운로드한다.

docker run ubuntu

latest: Pulling from library/ubuntu
5b7339215d1d: Pull complete
14ca88e9f672: Pull complete
a31c3b1caad4: Pull complete
b054a26005b7: Pull complete
Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c
Status: Downloaded newer image for ubuntu:latest

# 정상적으로 이미지가 로컬에 다운로드 되었는지 확인

docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              4c108a37151f        43 hours ago        64.2MB

# docker 구동 상황을 볼 수 있음
# -a 옵션은 정지된 컨테이너까지 확인 가능.

docker run —name myubuntu -it ubuntu
root@2d415c3578f3:/# apt-get update




Ubuntu에서의 설치 방법


#docker repo 기반 설치를 위한 패키지 설치
sudo apt-get install -y curl apt-transport-https ca-certificates software-properties-common

#docker reap 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update

#docker ce 설치
sudo apt install -y docker-ce

#특정버전 설치를 위한 확인
sudo apt-cache policy docker-ce | sort -r
sudo apt-get install docker-ce=“특정버전”

# systemctl을 통해 서비스 구동 및 등록.

sudo systemctl start docker
sudo systemctl enable docker

# 도커그룹에 일반유저를 추가 / root에서 항상 실행한다면 필요없음.
sudo usermod -aG docker $USER

docker version
Client:
Version:           18.09.6
API version:       1.39
Go version:        go1.10.8
Git commit:        481bc77
Built:             Sat May  4 02:35:57 2019
OS/Arch:           linux/amd64
Experimental:      false


Server: Docker Engine - Community
Engine:
  Version:          18.09.6
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       481bc77
  Built:            Sat May  4 01:59:36 2019
  OS/Arch:          linux/amd64
  Experimental:     false

#docker run은 이미지가 없으면 Repo에서 Pull하고 실행까지 수행
#Ubuntu에서 Alpine linux docker image 실행.
#image에 대한 tag를 설정하지 않으면, 항상 latest버전으로 다운로드한다.

docker run --name myalpine -it alpine

latest: Pulling from library/alpine
921b31ab772b: Pull complete
Digest: sha256:ca1c944a4f8486a153024d9965aafbe24f5723c1d5c02f4964c045a16d19dc54
Status: Downloaded newer image for alpine:latest

# 정상적으로 이미지가 로컬에 다운로드 되었는지 확인

docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
alpine              latest              4d90542f0623        21 hours ago        5.58MB


공지사항