쿠버네티스 전문가 양성과정 8주차 2일(2/7)

최수환·2023년 2월 7일
0

Kubernetes

목록 보기
33/75
post-thumbnail

Docker

가상화

<가상화 배경>

  • 가상화는 1960년대에 처음 소개되었지만 2000년대에 이르러서야 주목받기 시작
  • 가상화가 주목받기 시작한 이유는 하드웨어 기술의 성장과 보급 증가로 성능이 우수한 하드웨어를 구하기 쉬워졌기 때문
  • 이로 인해 시스템의 리소스 활용률은 낮아졌고, 활용하지 않는 지원을 사용하려는 기술들이 개발되어 현재의 가상화를 이룸

<가상화 종류>

  • 서버 가상화
  • 네트워크 가상화
  • 스토리지 가상화 (EX. 원 드라이브, 구글 드라이브 , N 드라이브..)
  • 컨테이너 가상화

<서버 가상화>

  • 가장 일반적인 가상화, 가상 머신을 생성할 때 사용하는 기술
  • 가상 머신을 생성하려면 CPU나 메모리와 같은 시스템 자원을 나누어주는 파티셔닝 기술이 필요
  • 파티셔닝 기술은 하드웨어 파티셔닝과 소프트웨어 파티셔닝이 있다

<하이퍼바이저>

  • 호스트가 소프트웨어 파티셔닝을 할 수 있게 만들어주는 소프트웨어
  • 하이퍼바이저의 역할은 가상 머신의 리소스 관리뿐만 아니라 서로 독립적인 환경을 사용할 수 있도록 리소스간 접근 방지 기능도 가지고 있다.
  • 하이퍼바이저는 가상 머신이 어느 정도의 가상 리소스를 할당 받을지를 정하고 실제 물리적인 자원을 사용할 수 있도록 리소스를 관리
  • 가장 널리 알려져 있는 하이퍼바이저로 상용 제품으로는 VMware와 xen, 오픈 소스로는 VitualBox, KVM이 있다

<리눅스 컨테이너>

  • 리눅스 컨테이너는 컨테이너 가상화 기술을 사용

  • 리눅스 컨테이너에는 애플리케이션이나 이에 필요한 라이브러리 및 설정파일 등이 포함됨

  • 리눅스 컨테이너는 오래전부터 사용되었지만 극히 일부 기업에서만 사용되었고, 도커가 개발된 이후부터 활발하게 사용되고 있다

  • 도커는 리눅스 컨테이너를 다루는 도구이며, 컨테이너 런타임이라고 함

  • 앱을 돌리기 위해 필요한 리소스가 10이라고 했을 때, 가상머신에 필요한 10, GUEST OS에 필요한 50으로 앱 하나를 위해 사실상 100이 필요

  • 앱을 돌리기 위해 필요한 리소스가 10이라 했을 때, 컨테이너 엔진은 5정도 필요하다. 따라서 앱 하나를 위해 15정도가 필요하다. 즉, 컨테이너는 가상머신에 비해 매우 가볍다

📒 컨테이너의 역할은 앱을 돌리기 위한 것으로, 컨테이너 하나당 하나의 앱을 돌린다

<소프트웨어 컨테이너 란>

  1. 컨테이너는 외부 환경과 독립되어 있음
    ( ex. 물리적인 컨테이너의 격리)
  2. 사용하고자 하는 App에 맞는 환경을 구축할 수 있다
    ( ex. 물리적인 컨테이너의 용도에 따른 종류)
  3. 같은 컨테이너 엔진을 사용하고 있으면 외부요인에 상관없이 그대로 가져다 쓸 수 있음
    -> A컨테이너 엔진에서 개발된 컨테이너는 A컨테이너 엔진을 사용하는 모든 곳에 그냥 그대로 사용 가능
    = 개발환경과 실제환경을 구분할 필요가 없다

<리눅스 컨테이너에서 사용하는 기술>

cgroup

  • 프로세스 또는 쓰레드를 그룹화 하여 관리하는 기능과 시스템 리소스(CPU, 메모리, 디스크 입출력 등..)의 사용을 제한하는 기술
  • 리눅스 컨테이너는 호스트의 리소스를 공유하여 사용하는데, 이때 cgroup을 사용하여 컨테이너가 사용하는 리소스의 양을 제한할 수 있음

namespace

  • namespace에 다수의 오브젝트를 격리할 수 있음
  • 동일한 호스트에서 동일한 PID를 가질 수 없지만 서로 다른 namespace에서는 동일한 PID를 가질 수 있음
  • namespace의 종류에는 PID, Network, UID, Mount, UTS, IPC namespace

Docker란

  • Docker는 2013년 Docker사에서 Go 언어로 개발한 오픈소스 플랫폼
  • Docker를 사용하면 리눅스 컨테이너를 더 쉽게 관리하고 실행할 수 있음
  • Docker의 가장 큰 특징은 이식성인데, 이는 개발 환경, 테스트 환경, 서비스 환경을 모두 동일하게 사용할 수 있기 때문

<Docker를 사용하는 이유>

  • 서버를 코드 형태로 정의
    • 도커는 이미지를 사용하여 컨테이너를 실행함
    • 컨테이너는 하나의 애플리케이션을 실행하는 서버처럼 동작
    • 도커는 이미지를 제작할 때 코드 형태로 정의하여 작성 가능
    • 따라서 서버를 코드 형태로 정의할 수 있어 일관성을 유지하는 것과 버전 관리 부분에서도 편리
  • 이식성
    • 애플리케이션 개발 단계는 크게 개발 단계, 테스트 단계, 서비스 단계로 나뉨
    • 이 때 각 단계의 환경을 통일하기는 쉽지 않지만 도커를 사용하면 컨테이너에 모든 환경을 구축하기 때문에 도커만 설치하면 된다
  • 상호 운용성
    • Docker는 Google, Amazon, IBM, MS, Red Hat 등 다양한 벤더에서 지원하기 때문에 다양한 벤더의 시스템 및 오픈 소스와 연계하여 사용할 수 있음

<도커의 구조>

  • 이미지

    • 도커로 리눅스 컨테이너를 생성하려면 미리 제작된 이미지가 있어야 함
    • 이미지는 여러 개의 레이어로 이루어져 있으며, 각 레이어는 Read Only 상태로 사용됨
    • 만약 이미지로 컨테이너를 실행하여 파일을 생성하거나 삭제한다면 새로운 레이어를 만들어 내용을 저장하는데 이 때 사용하는 방식이 COW(Copy on Write)와 유사함
  • 저장소

    • 컨테이너를 생성하려면 이미지가 있어야 하고, 이미지는 호스트가 아닌 외부에 저장되어 공유할 수 있어야 함
    • 이를 저장소라고 하며, 범위에 따라 퍼블릭 이미지 저장소와 프라이빗 이미지 저장소로 나눌 수 있음
    • 이미지 저장소는 대표적으로 도커 허브(Docker Hub)가 있으며, 도커 허브에는 퍼블릭과 프라이빗 이미지 저장소 둘 다 사용할 수 있음
      📒 Docker 허브
    • 또한 Habor와 도커 레지스트리 같은 프라이빗 이미지 저장소를 만들어 별도로 운영할 수도 있으며, 퍼블릭 클라우드 서비스는 자체 이미지 저장소 서비스가 있음
  • 컨테이너

    • 컨테이너는 이미지의 실행 형태
    • 쉽게 말해 이미지가 메모리에 올라가면 컨테이너, 컨테이너가 디스크에 저장되어 있으면 이미지
    • 하나의 컨테이너에는 하나의 애플리케이션만 실행되는 것이 권장되며, 추가로 실행할 수 있지만 유지하는 것은 권장하지 않음

<도커의 기능>

  • 이미지 생성

    • 도커는 다양한 방법으로 이미지를 생성할 수 있음
    • 가장 대표적이며 일반적으로 사용하는 것이 Dockerfile이며, 그 밖에 컨테이너를 이미지로 생성하는 docker commit명령과 컨테이너의 파일 시스템으로 이미지를 생성하는 docker export와 docker import 명령이 있다
  • 이미지 공유

    • 도커는 저장소를 사용하여 이미지를 공유함
    • 저장소에는 도커 허브뿐만 아니라 다른 프라이빗 이미지 저장소도 사용할 수 있음
  • 컨테이너 생성

    • 도커는 컨테이너를 생성하고 관리를 할 수 있는 컨테이너 런타임
    • 컨테이너를 생성하고 네트워크 또는 볼륨과 같은 도커 오브젝트를 생성한 뒤 컨테이너에 연결하여 사용할 수도 있음

Docker 실습

  • 설치 및 접속

    Virtualbox에 centos7 가상머신을 설치한다
    (runlevel 3, 호스트전용 어댑터, NAT Network, 메모리 4096)

    ssh root@localhost
    Password 입력 
    # 만약 key문제로 접속이 안된다면 c드라이브에 users폴더에 
    나의 user로 들어가 .ssh폴더가 있는지 확인 후 폴더 안에 파일을 지워준다
    
    yum install -y yum-utils 
    # yum 관리도구 설치
    
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    # 도커 관련 레포지토리 추가
    
    yum install docker-ce docker-ce-cli containerd.io
    # 도커 설치
    
    systemctl enable docker 
    systemctl start docker
    # 도커 시작 및 활성화
    
    systemctl status docker
    docker --version
    # 도커 설치 및 시작 확인
    
    ip addr
    # 연결된 네트워크의 ip주소 확인 = ifconfig
  • 이미지 검색

    docker search 이미지명
    # 도커허브에서 이미지 검색
    # 실제 docker hub 사이트에 검색하는 것과 동일 
  • 이미지 다운

    docker image
    # 이미지 관련 명령어 보기
    
    docker image pull hello-world:nanoserver
    # 실제 이미지 다운 
    # 계정명/이미지명:태그명 
    • 2d473b07cdd5: Pull complete
      -> 위 사진에서 이 코드는 layer를 추가했다는 것으로 이미지를 추가하게되면 기존의 layer에 layer를 추가한다
      -> /var/lib/docker/image/overlay2/layerdb 경로에 layer를 저장한다
  • 이미지 확인 / 지우기

    docker iamge ls / docker images
    # 이미지 목록 확인     
    
    docker image ls -q
    # 이미지 ID리스트 확인 
    
    docker image rm 계정명/이미지명:태그명   
    # 이미지 지우기 
    
    docker image rm id 
    # 아이디로 이미지 지우기 
    
    docker image rm $(docker image ls -q)
    # 전체 이미지 지우기 
    
    docker image rm -f 이미지명
    # 실행되고 있는 이미지 삭제
  • 이미지들의 CMD 항목 확인

    docker inspect httpd | grep -A 4 CMD


    -> httpd는 서비스이기 때문에 cmd가 shell이 아닌 foreground에서 실행되는 것을 알 수 있다

    docker inspect centos:7 | grep -A 4 CMD 


    -> centos는 cmd가 shell이기 때문에 bash 셸에서 실행되는 것을 알 수 있다

  • prune 명령어

    docker image prune --all
    • 실행되고 있지는 않지만 다운로드되어 용량을 차지하고 있는 이미지를 삭제하기 위해서 사용
    • 실행되고 있는 이미지는 삭제를 하지 못한다
  • 백업 명령어

    docker image save -o test.tar centos:7 centos:latest
    # image를 아카이브파일로 백업한다
    
    docker image load -i test.tar
    # 백업된 아카이브 파일을 다시 푼다
  • 컨테이너 및 이미지 스펙 확인

    docker image inspect 컨테이너명/이미지명
  • 컨네이너 관련 명령어 확인

    docker container
  • 컨테이너 생성 및 실행

    • create : 컨테이너 생성

      docker create -it --name os1 centos:7         
    • 실행중인 컨테이너 목록 확인

      docker container ps
      # 현재 실행 중인 컨테이너 
      
       docker container ps -a 
       # 실행중이지 않은 컨테이너까지 보기
       
       docker container ps -aq
       # 컨테이너 전체 아이디 보기 
    • start : 컨테이너 시작

      docker container start 컨테이너명
    • attach : 컨테이너 접속

       docker container attach 컨테이너명     
    • 접속중인 컨테이너에서 나오기

      ctrl+pq
      # 그냥 exit로 나오게 되면 container의 상태에 영향을 미친다
    • run : create + start + attach

      • 형식: docker run [option] --name 컨테이너명 이미지:태그

      • 옵션

        • i : interactive, shell 명령어 처럼 대화형으로 진행되는 경우
        • t : tty, shell 명령어는 대화형하는데 있어서 해당 제어터미널이 있어야 확인할 수 있음.
        • it : 입력값과 출력값이 필요로 하는 컨테이너 경우에 붙임
        • d : 입력값이나 출력값이 필요없고 실행만 시킬 경우에 붙임
          = run에서 attach를 실행 x
        docker run -it --name os2 centos:7
         docker run -itd --name os3 centos:7
         # cmd가 shell인 경우
        
         docker run -d --name web1 httpd:latest
         # cmd가 서비스인 경우
  • 컨테이너 삭제

  docker container prune
  # 실행중인 것은 삭제 x
  
  docker container rm -f 컨테이너명 or id
  # 실행중인 컨테이너 삭제
  
  docker container rm -f $(docker ps -aq)
  # 실행중인 컨테이너 포함 전체 삭제
  
  • 해당 컨테이너 내부에 명령어 실행
docker exec 컨네이너명 명령어
docker exec os1 ls -a /root
  • 해당 컨테이너 내부에 접속 / 컨테이너 분리모드로 실행
docker exec -it 컨테이너명 shell
docker exec -it os1 bash # exit로 나와도 된다

📒 prune,rm을 제외하고는 명령어앞에 image나 container는 생략해도 된다

  • cmd가 서비스인 컨테이너에 shell로 접속 / 컨테이너 분리모드로 실행
docker exec -it web1 bash
#bash 셸로 접속

cd htdocs
#htdocs디렉터리 접속
#index.html파일이 존재하는 것을 확인 

cat > index.html
text입력

docker inspect web1 | grep IPA
#해당 컨테이너 IP 확인 	

exit후 curl 컨테이너 IP
#입력한 text가 나타남

docker exec -it web1 cat htdocs/index.html
  • 컨테이너 리소스 확인

    docker stats --no-stream
  • 컨테이너 리소스 제한

    docker run -it --name os2 --cpus 0.5 --memory 1G centos:7 # 제한된 리소스로 생성
    docker update --cpus 0.4 --memory 2G os2 # 리소스 수정
  • 컨테이너 PID 확인

    docker top 컨테이너명
  • 컨테이너에 파일 복사 및 확인

    • 컨테이너는 기본적으로 메모리에 이미지가 올라가서 실행된 상태 = 컨테이너는 메모리에 있는 것

    • 컨테이너에 일어난 변화가 이미지에 영향을 주지 않는다

    • 컨테이너에 아무리 파일을 생성해도 컨테이너를 중지하게 되면 해당 내용은 모두 삭제

    • 컨테이너에 있는 파일을 외부로 가져오거나 외부에 있는 파일을 컨테이너에 복사해서 넣는 것이 가능

    • host에서 컨테이너에게 파일 복사

       touch hostfile # 파일 생성
       echo docker cp test > hostfile
       docker run -itd --name os1 centos:7 # 컨테이너 생성
       docker cp hostfile os1:/root/ # 파일 복사
       docker exec os1 ls /root/
       #실제로 컨테이너 해당 경로에 파일이 생성된 것을 확인 
    • 컨테이너에서 host에게 파일 복사

       docker exec -it os1 bash 
       touch os1file
       exit
       docker cp os1:/root/os1file ./
       #ls로 호스트 현재 디렉터리에 파일이 생성된 것을 확인 
    • host에서 컨테이너에게 디렉터리 복사

       mkdir hostdir
       docker cp hostdir os1:/root/
       docker exec os1 ls /root/
    • 컨테이너에서 host에게 디렉터리 복사

       docker exec -it os1 bash 
       mkdir os1dir 
       exit
       docker cp os1:/root/os1dir ./
  • diff 명령어

    • diff = 차이점 (기본 이미지와의 차이점)

    • docker diff 컨테이너명

      C : change
      A : add
      D : delete

    • 처음 컨테이너 생성후 docker diff os1해보면 아무것도 안뜨는 것을 확인

    • 호스트가 컨테이너에게 파일을 복사한 후 diff로 확인하면 기본 이미지와 차이가 생긴 경로에 C와 A가 나타난 것을 확인

    • 컨테이너에서 파일을 삭제한 후 diff를 해보면 해당 경로에 D가 나타난 것을 확인

profile
성실하게 열심히!

0개의 댓글