본문 바로가기

클라우드/오픈스택

클라우드 개발을 위한 가상화 & Docker

클라우드 개념 및 종류⛅


  1. SPI 모델
    • 가장 일반적인 클라우드 구분법 
      • IasS(Infrastructure as a Service) → OS 이하 하드웨어 가상화
        • 서버자원(CPU/메모리/디스크/ 네트워크 등)
        • 아마존 AWS EC2
      • PaaS(Platform as a Service)
        • OS+ Runtime(Java)+Platform(Spring,Hadoop,DBMS 등)
        • 아마존 AWS EMR
      • SaaS(Software as a Service) → 서비스까지 일체 제공
        • Google Drive, MS Office 등
      • 클라우드를 구축하기 위한 요소기술에는 가상화 기술과 도커와 같은 컨테이너 기반 기술이 있다.
  2. 가상화
    • 기본 개념
      • 가상화
        • 컴퓨터 자원(CPU, 메모리, 저장장치,네트워크 등)의 추상화
      • 가상화의 레벨
        • API(Application Programming Interface)
          • 응용프로그램 레벨의 함수/메소드, 언어독립적인 경우도 있다
        • ABI(Application Binary Interface)
          • 플랫폼과 소프트웨어 사이의 인터페이스 정의
          • API보다 낮은 레벨
          • API는 유지되면서 ABI는 변경되는 경우
            • 코드는 유지하면서 재컴파일
        • ISA(Instruction Set Architecture)
          • 하드웨어와 소프트웨어 사이의 인터페이스 정의
      • 클라우드 개념
        • 하드웨어 → 하이퍼바이저 → 여러개의 Guest OS위에 Application을 설치 가능
        • Scale-Up
          • CPU, Memory 등을 교체(Upgrade)
        • Scale-Out*
          • 노드를 추가 (성능을 추가)
  3. 클라우드 /기가상화 적용사례
    • 클라우드 서비스
      • 아마존 AWS (Amazon Web Service)
        • EC2(IaaS)/EMR(빅데이터 처리)/S3/RDS
        • Elastic Computing Cloud/Elastic MapReduce
        • Simple Storage Service, Relation Database Service
      • MS Azure
      • 드랍박스,N드라이브, 다음클라우드, U클라우드
      • 구글드라이브
        • 클라우드 디스크+오피스+PDF viewer
      • OpenStack (클라우드 직접 구축)
        • IaaS스타일의 오픈소스 클라우드 구축 플랫폼
        • KVM(리눅스 커널VM)을 기본 하이퍼바이저로 사용
  4. AWS
    • OS가 설치된 인스턴스 선택
    • 하드웨어 스펙 선택(가격이 다름)
    • 추가 옵션 선택
    • 디스크 선택 (EBS, 용량에 따라 가격 차이)
    • 인스턴스 실행
    • 원격 접속을 하기 위해 SSH 사용 → 키를 발급받아야함 → Putty 등을 통해 접속 가능
    • Connect 버튼을 이용해 접속 ( 자바를 설치하면 웹브라우저 안에서 로그인 가능)

       

가상화기술의 개념(하이퍼바이저, 전가상화/반가상화)🌌


  1. 하이퍼바이저 기반 가상화의 특징
    • 가상화 관련 기본 개념
      • 하이퍼 바이저 (VMware, VirtualBox 제품)
        • 호스트 시스템에서 다수의 게스트 OS를 돌리기 위한 플랫폼
      • 호스트 OS
        • 물리시스템(컴퓨터)에 설치된 OS
      • 게스트 OS
        • 가상머신/컨테이너 위에 설치된 OS
    • 하이퍼바이저 유형
      • 타입1
        • 하이퍼바이저가 하드웨어 위에서 바로 실행(베어메탈)
      • 타입2
        • 호스트 OS 위에 하이퍼바이저를 실행시키는 방식
    • 하이퍼바이저기반 가상화의 특징
      • 시스템가상화로 인해 다양한 게스트OS를 실행할 수 있음
      • 물리 시스템과 게스트 OS간의 가상화 가능으로 인한 성능 저하
        • 약 10~15% 정도의 오버헤드
        • 호스트 OS와 게스트 OS간의 기능중복(스케쥴링 등)
  2. 전가상화와 반가상화
    • 전 가상화(Full Virtualization)
      • 하드웨어를 완전히 가상화
      • OS의 제약 없이 사용할 수 있음
      • 게스트 OS는 자신이 가상머신 위에서 동작하고 있다는 것을 인식하지 못함
      • 시스템에서 물리적인 가상화 지원기능 필요하다(인텔 VT-x, AMD-v)
      • 게스트 OS에서 물리자원에 직접 접근이 불가하다
        • 반드시 하이퍼바이저를 통해 접근해야하기 때문에 성능이 저하된다.
    • 반 가상화(Para Virtualization)
      • 게스트 OS가 자신이 가상머신 위에서 동작하고 있다는 것을 인식
      • 게스트OS에서 물리자원 직접 접근이 가능(Pass Through) → 성능이 개선
      • 하이퍼콜(OS명령어)을 통해 직접적으로 하드웨어에 접근
      • OS 제약이 있음
        • OS의 제약,커널을 수정해야함(주로 오픈소스인 리눅스만)
  3. 하이퍼바이저 종류
    • VMware
      • 대표적인 상용 하이퍼바이저
      • ESXi(타입1) → vSphere / WorkStation(타입2) / WorkStation Player
    • MS Hyper-V
      • 윈도우 서버에 통합
    • Ctrix Xen(오픈소스)
      • 최초의 반 가상화 하이퍼 바이저
      • 오픈소스
    • KVM(오픈소스) → OpenStack에서 사용
      • 하이퍼바이저를 커널의 '서브 모듈'로 제공
      • 메모리관리자/파일시스템/하이퍼바이저
    • Parallels(패러렐즈) → 맥 OS 에서 많이 사용, VM에서는 Fusion
      • OSX기반의 하이퍼 바이저
    • Oracle VirtualBox
      • 오라클(구 썬마이크로시스템즈)에서 만든 GPL(오픈소스) 기반의 하이퍼바이저
      • 단점은 그래픽 가속이 좋지 못하다 → 성능이 떨어짐

         

가상화기술 사례(VMWare ESXi, Oracle VirtualBox) - 설치 및 사용법😫


  • 하이퍼바이저 사용법1 (VMware ESXi)
    1. vmware.com 에서 다운로드
    2. NAT 으로 설정 시 외부 에서 직접 접근이 불가하다. 이때에는 포트포워딩이나 외부아이피를 직접 설정해야한다.
    3. 외부아이피를 직접 설정하려면 Bridge로 적용하면 된다. (shutdown 후 에 변경)
    4. 접근한 ESXi 홈페이지에서 vSphere Client 를 다운로드 → 설치
    5. 새 가상 시스템에서 시스템 지정
    6. VirtualBox와 다르게 호스트디바이스를 직접 지정하거나 데이터 스토어에서 ISO 파일 지정도 가능
    7. 데이터스토어 상으로 이미지를 업로드를 해줘야함 : 리소스 할당 - 데이터 스토어1 - 구성 - 데이터스토어1 선택 - 마우스 오른쪽 - 데이터 찾아보기에서 업로드, 다운로드 선택 (서버 이미지)
    8. 다시 설정으로 돌아가 CD롬에서 데이터스토어 ISO 파일 , 전원을 켤 때 연결 체크, 찾아보기에서 데이터스토어의 이미지 파일 선택
  • 하이퍼바이저 사용법2 (Oracle VirtualBox)

 

가상화기술 및 자동화(Automation)기술 : Vagrant🙄


  1. 하이퍼바이저 자동화기술(Vagrant)
    • Vagrant
    • 자동화된 VM 관리 툴
      • 스크립트 이용한 박스(BOX)설치
    • 다양한 하이퍼바이저/도커 지원
      • 버추얼박스버전은 무료
      • VMWare/Hyper-V 버전은 유료
    • Vagrant를 이용한 우분투서버 설치
      • Vagrant install
      • 박스 검색
        • https://app.vagrantup.com/boxes/search
        • 박스이름
          • ubuntu/trusty64
        • cmd 실행
          • vagrant init ubuntu/trusty64
          • Vagrantfile 생성확인
          • vagrant up (우분투 버전 다운)
        • 다운로드 완료 후 버추얼 박스에 VM 생성 확인 후 로그인
          • vagrant ssh
          • vagrant/vagrant
  2. Vagrantfile
    1.  config.vm.box
      • 어떤 박스를 다운 받을 것인지 정함
    2. config.vm.network
      • 네트워크 설정 (ip addr)
    3. 자동으로 명령어를 수행할 수 있음 apt-get updat
    4. Provision : 하드웨어, 소프트웨어의 설정을 미리 함
      1. VM 설치 / 실행
      2. vagrant up
      3. VM 접속
        • vagrant ssh web/ipconfig/exit
        • vagrant ssh db/ipconfig/exit
    5. 좀 더 자세한 정보는 vagrantup.com/docs 에서 확인 가능다중 VM 에서 Vagrantfile

 

경량 컨테이너 기반 가상화 : 도커의 개념🚢


  1. 하이퍼바이저 기반 기술과의 비교
    1. 가상화의 단점
      • 불필요한 기능의 중복
        • 호스트OS와 게스트 OS 간의 기능 중복
          • 메모리 관리, 프로세스 스케쥴링
      • 상대적으로 무겁
        • 오버헤드(15~20%)
      • 배치(Deployment)의 어려움
  2. 컨테이너 기반 가상화
    1. 도커의 개념
      • Build-Ship-Run
        • 이미지를 만들고 배포를하고 수행하는 것이 쉬움
    2. 기존의 가상화와 다른 개념
      • 하드웨어 가상화가 아닌 실행환경의 분리(isolation)
      • 각 컨테이너간 영향을 분리
      • 호스트 OS ↔ 도커 엔진 ↔ 컨테이너 (필요한 라이브러리)
    3. 도커의 성능
      • 오버헤드가 3~5% 이내 → Native와 성능 차이가 거의 나지 않는다
    4. 도커의 특징
      • 모든 컨테이너들이 동일 OS 커널 공유(Linux)
        • 독립적인 스케쥴링이나 CPU/메모리/디스크/네트워크를 가상화하지 않음
      • 리눅스의 특수 기능(LXC)을 사용한 실행환경 격리를 응용
        • 리눅스에서만 사용 가능
          • 처음에는 우분투에만 되던 기능이였는데 지금은 리눅스 배포판에서 사용 가능
        • 다른 OS(윈도우/OSX) 에서는 일반 하이퍼바이저(경량)가 있어야 한다
        • 현재는 LXC → Libcontainer를 사용해 리눅스 의존도를 줄이려 하고 있음
      • 시스템의 분리에는 Linux Containers(LXC)
      • 파일 시스템은 Adanced multi layered unification filesystem(Aufs)를 사용
      • 그리고 Git과 같은 이미지 버전컨트롤 시스템 도입
      • 현재 사실상의 표준이 됨
      • 구글에서 만든 Go언어로 작성
      • Docker는 하나의 Linux 시스템에 여러 Linux 시스템 운영을 위한 소프트웨어
    5. LXC
      • 시스템레벨 가상화
      • cgroups(control groups)
        • CPU,메모리,디스크,네트워크를 프로비저닝 (할당받고 관리하는 기능)
      • Namespaces(Namespace Isolation)
        • 프로세스트리, 사용자 계정,파일시스템, IPC
        • 호스트와 별개의 공간설정
      • chroot(change root) 명령어에서 발전
        • chroot jail
        • chroot 상의 폴더에서 외부 디렉토리 접근 안됨
      • Libcontainer
        • 컨테이너 최적화 기술 LXC 외에 리브 컨테이너(libcontainer)란 별도의 실행 드라이버(exec driver)를 만들어, 특정 우분투 버전 외에 다양한 리눅스 지원
        • 맥 OS 나 윈도우에서도 사용할 수 있는 가능성이 생김
        • native(libcontainer), lxc(LXC)
      • 도커의 구조
        • LXC(cgroups + namespaces)
        • libcontainer
        • AUFS
        • 이미지, 컨테이너 생성관리
        • 각종 부가 기능
    6. LXD
      • 우분투를 만든 캐노니컬에서 만든 컨테이너 솔루션
      • 기존의 LXC에 보안 개념까지 추가
        • Secure by default
        • Unprivileged container
          • root가 아니어도 컨테이너 생성 가능
      • 도커는 Application Container, LXD는 Machine Container
      • LXD는 Container "Hypervisor"
      • 경쟁기술이라기 보다는 보완관계(도커와 병행 가능)
        • KVM(Kernel Virtual Machine)을 경쟁기술로 간주

 

 

컨테이너 기반 가상화 : 도커의 설치 및 활용🚤


  • 도커 설치
    • docker.com
    • 요구사항
      • 윈도우 64비트 버전이상
      • 도커 툴박스 ( Boot2Docker )/ 도커 머신 ( Docker Machine)
      • 도커 툴박스 vs 도커머신
        • 도커 툴박스(deprecated)
          • Tiny Core linux 기반의 경량 리눅스 배포판 사용
          • 내부적으로 버추얼박스 지원
        • 도커 머신(new)
          • 가상호스트에 도커엔진 설치를 위한 툴
          • 버추얼박스, vmware 지원
      • 도커 기반 우분투 설치(root 계정으로 설치)
        • 도커 이미지 검색
          • docker search ubuntu
        • 우분투 이미지 다운
          • docker pull ubuntu
        • 이미지 리스트 출력
          • docker images
        • 컨테이너 생성
          • docker run —name=ubuntu ubuntu
        • 컨테이너 접속
          • docker attach ubuntu
          • docker exec -it ubuntu bash (it 옵션은 바로 터미널로 접속)
        • 컨테이너 탈출
          • exit or 컨트롤-p-q(컨테이너 정지하지 않고 나옴)
  • 도커 사용법
    • 도커 기본 명령어
      • 도커 컨테이너 리스트
        • docker ps -a
      • 도커 컨테이너 정지
        • docker stop ubuntu
      • 도커 컨테이너 재시작
        • docker restart ubuntu
      • 도커 컨테이너 삭제
        • docker rm ubuntu ( stop 먼저 필요 ), docker rm -f ubuntu, docker kill ubuntu (프로세스가 죽은 경우)
      • 도커 이미지 삭제
        • docker rmi ubuntu , docker images
  • 도커 명령어***
    • 이미지 파일 생성
      • docker save -o ubuntu_img.tar ubuntu (aufs의 우분투 이미지를 ubuntu_img.tar로 로컬파일 시스템에 저장)
    • 이미지 압축/해제
      • gzip ubuntu_img.tar / bzip2 ubuntu_img.tar
    • 이미지 삭제
      • docker rmi ubuntu
    • 파일에서 이미지 로드
      • docker load -i ubuntu_img.tar
      • docker images (이미지 ID 확인)
    • 이미지 태그 지정 (alias 지정)
      • docker tag 이미지ID ubuntu
    • 컨테이너의 IP 주소 알아내기
      • docker inspect ubuntu | grep "IPAddress"
  • 도커 run 명령어 옵션 (두 글자 이상이면 -를 2개)
    • p(publish) : 포트 노출
    • d(detach) : 서버형 실행
    • e(env) : 환경변수 설정
    • i(interactive) : 표준입력 열어두기
    • t(tty) : 터미널 인터페이스
    • v(volume) : 호스트 디렉토리
    • w(workdir) : 작업디렉토리 설정
    • l(link) : 컨테이너 연결
  • 도커 명령어2
    • Search
    • pull
    • run
    • ps
    • stop/restart/kill/rm/pause/unpause
    • images / rmi
    • commit
    • history
    • diff
    • inspect
    • 컨테이너 attach 도 좋지만 exec -it '이름' bash 가 조금더 안정적임

 

컨테이너기반 가상화와 자동화기술 : Dockerfile🕶


  1. 커밋을 통한 이미지 생성
    • apt-get update & install
      • 컨테이너에 접속한 상태에서
        • apt-get update 명령을 먼저 수행해야 apt-get install 명령어 사용 가능
        • 바로 apt-get install을 사용하면 에러 발생
      • 일반 우분투에서는 기본으로 설치되어 있는 nano가 도커 기반 이미지에서는 깔려 있지 않다
        • apt-get install nano
    • 새로운 이미지를 기반으로 컨테이너를 생성(update와 nano가 실행 된 상태)
      • 컨테이너에 새로운 내용을 추가/변경한 후 commit해 이미지 생성
      • docker diff ubuntu(컨테이너 변경사항 확인)
      • docker commit -m "test" -a"sjha" ubuntu(기존 이름) ubuntu_nano(새로운 이름)
        • a는 사용자 옵션
      • docker images
  2. 도커 파일을 기반으로한 이미지 생성
    • 도커 이미지 생성방법
      • Dockerfile을 수행시켜 새로운 이미지 생성
        • 우분투 이미지에 Dockerfile 입력 후 수행
          • FROM ubuntu:latest (Base 이미지 지정)
          • MAINTAINER 이름 <이메일>
          • RUN apt-get update
          • RUN apt-get install nano
          • ENV TERM=xterm (환경 변수 설정)
        • docker build —tag=ubuntu_nano .(현재 디렉토리 지정)
        • docker images
        • docker history ubuntu_nano(이미지 변경사항)
    • Dockerfile 기초
      • FROM
        • 도커 이미지 생성할 때 사용할 기본 이미지를 지정
        • 만약 해당 이미지가 없으면 서버 repository에서 다운로드
      • MAINTAINER
        • 이미지를 생성한 사람에 대한 기본 정보 표시
      • RUN
        • FROM에서 지정한 기본 이미지 위에 명령을 수행해 새로운 이미지를 생성한다
      • CMD
        • 컨테이너가 수행될 때 지정된 명령어/명령/스크립트 파일 실행
        • Dockerfile에서 한 번만 사용 가능
          • CMD ["echo $PATH"]
      • ENTRYPOINT
        • CMD와 거의 같으나 컨테이너 생성(run)이나 시작(start)될 때 실행
          • ENTRYPOINT["/sample.sh"]
    • Dockerfile 상세
      • 환경변수 설정
        • 일반적인 우분투의 경우
          • 홈디렉토리의 ~/.bashrc나 ~/.profile에
            • export sample=/sample과 같이 지정한 후
            • source ~/bashrc 나 source ~/.profile로 환경변수에 반영한다
        • 도커에서는
          • 환경변수를 지정하려면
            • docker run —env sample=/sample —name=ubuntu ubuntu (run 실행 시 환경 변수 설정)
            • Dockerfile
              • ENV sample=/sample (도커 파일에서 ENV을 이용하여 환경 변수 설정)
        • 환경변수 확인
          • echo $sample
      • 포트 노출
        • 컨테이너의 포트와 호스트의 포트를 연결
        • 컨테이너의 80번 포트와 호스트의 80번 포트를 연결
          • 외부에서 80번 포트로 접근하면 컨테이너의 80포트를 연결
          • docker run -p 80:80 —name=ubuntu ubuntu
            • host port:container port
        • Dockerfile
          • expose 80 (container port)
          • 컨테이너의 80번 포트를 외부에 노출한다
          • -p 옵션과 같이 사용
        • -p 옵션과 expose 둘 다 해줘야한다.
      • 파일을 이미지에 추가
        • 호스트의 파일을 이미지 생성 시 추가(복사)
        • Dockerfile
        • ADD ~/sample.txt /sample.txt
          • 호스트의 ~/saple.txt파일을 컨테이너의 /에 추가(복사)
        • 압축파일을 지정할 경우 알아서 압축을 풀어서 추가
        • URL을 지정할 경우에는 압축해제 없이 추가된다.
      • 명령 수행할 사용자/폴더 지정
        • RUN/CMD/ENTRYPOINT을 수행하기 전 사용자계정 지정
          • USER sample
            • sample 사용자로 변경
        • RUN/CMD/ENTRYPOINT 수행하기 전 폴더 지정
          • WORKDIR ~/sample~
            • ~/sample 폴더로 변경해 아래 명령을 수행하라
      • 볼륨연결
        • 컨테이너의 폴더와 호스트의 물리폴더 간의 연결
        • 물리폴더 ~[홈디렉토리]/Downloads를 컨테이너의 /download 폴더로 연결
          • docker run —name=ubuntu ubuntu -v ~/Downloads:/download
          • 물리디렉토리:컨테이너 디렉토리
        • Dockerfile
          • VOLUME /sample
          • VOLUME ["/data","/sample"] (여러개 사용시 배열형태로 사용)
          • 해당디렉토리는 컨테이너 폴더가 아닌 호스트의 물리폴더로 저장하고
          • -v 옵션과 같이 사용
      • 도커 컨테이너간 연결
        • 컨테이너간 상호연결 설정
        • mysql 다운로드
          • docker pull mysql
        • mysql 컨테이너 실행(서버모드)
          • docker run -d -e MYSQL_ROOT_PASSWORD=kltrl —name=mysql mysql
            • d옵션으로 서버모드 실행
            • e로 환경변수 설정
        • 우분투 컨테이너 실행(연결)
          • docker run —name ubuntu -d —link mysql:mysql ubuntu
            • mysql 컨테이너와 결합 → 우분투에서 mysql 사용 가능
            • mysql -uroot -p -h mysql 을 사용하려면 우분투 컨테이너에서 apt-get install mysql-client로 클라이언트를 설치해야한다.

 

실전 도커 적용사례(OpenJava, Oracle Java, SSH, MySQL)🎈


  1. 오픈자바 설치
    • 일반적인 우분투 환경변수 설정
      • ~/.profile 이나 ~/.bashrc에 설정하고 source 명령어로 반영
    • 도커에서는
      • Dockerfile에 RUN/ENV 명령어로 설정
      • RUN apt-get install -y openjdk-8-jdk
        • apt-cache search 로 애매한 패키지명 찾기 가능
      • apt-get clean 을 동해 원래 .deb 파일 삭제가능
      • 환경 변수
        • ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
        • ENV CLASSPATH=$JAVA_HOME/ ib/*: .
        • ENV PATH=$PATH:$JAVA_HOME/bin
  2. 오라클자바 설치
    • 서드파트에서 repository를 이용하여 오라클 자바 설치
    • apt-get install -y software-properties-common
    • add-opt-repository ppc:webupd8team/java
    • apt-get update -y
    • apt-get install -y oracle-java8-installer
    • apt-get clean
    • 환경변수는 오픈자바와 거의 동일 JAVA_HOME 부분만 바뀜
    • docker build —tag=oracle_java . (도커파일이 있는 곳에서 수행)
    • run을 이용해 컨테이너 수행
  3. ssh 설치
    • 일반적인 우분투에서 SSH 설정
      • openssh-server 설치
        • sudo apt-get install openssh-server
        • putty 접속
    • 서버 실행, 종료
      • sudo service ssh start/restart/stop
      • /etc/init.d/ssh start/restart/stop
    • 도커에서는 서비스 자체가 제대로 지원되지 않음
      • root계정으로 원격접속하려면
        • /etc/ssh/sshd_config 파일의
          • PermitRootLogin 설정을 prohibit-password/without-password에서 yes로 수정
      • chpasswd를 통해서 root의 비밀번호 지정
    • Dockerfile
      • RUN apt-get install -y openssh-server
      • RUN mkdir /var/run/sshd
      • RUN echo 'root:패스워드' | chpasswd
      • RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
      • RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
      • EXPOSE 22
      • CMD ["/usr/sbin/sshd", "-D"] (서버모드로 실행)
    • ssh 비밀번호 지정(root / 패스워드)
    • EXPOSE 명령어를 사용해 컨테이너 포트 22번 노출
      • 외부로 노출하기 위해서는 run에서 -p 옵션을 사용해서 노출
    • cmd명령을 사용해서 sshd 프로그램을 서버로 노출
      • 리눅스의 서비스(service 수행)대체
  4. Mysql
    • 다운로드
      • docker pull mysql (이미지 다운)
    • 실행
      • docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=패스워드 -d —name=db mysql
    • 컨테이너 접속
      • docker exec -it db bash
    • MYSQL 접속
      • mysql -uroot -p
    • MySQL 컨테이너에 접속할 시
      • 다운로드
        • docker pull mysql
      • 실행
        • docker run -e MYSQL_ROOT_PASSWORD=패스워드 -d —name=db mysql
        • docker run -it —name=ubuntu —link db:db ubuntu
      • 컨테이너 접속
        • docker exec -it ubuntu bash
      • MySQL 접속
        • apt-get install mysql-client
        • mysql -h db -uroot -p