04.22 Dockor, Kubernetes

이재빈·2022년 4월 22일
0
post-thumbnail

Container

각각의 코딩환경이 다르기 때문에
통합하게 될때 무조건 안되게 됨
=> 환경을 맞추기 위한 문지기 같은 직업도 있음
컨테이너로 만들어서 똑같은 방법으로 처리한다.
장점

  • 투명성 보장
  • 속도 빨라짐

PC 안에다가 container를 만들고 위에 자신의 환경을 담아서 넣고
실제로 운영하는 서버에는 컨테이너만 ship(보내기)
컨테이너를 돌릴수있는 환경만 갖춰어지면 환경은 컨테이너 안에서만 돌리면 됨

Docker

컨테이너를 이용해서 하나의 컴퓨터로 여러개를 돌리는 것
가상화 : window 위에 가상 pc가 들어있고 그 안에 가상os가 들어가고 그 위에서 실행되는 것
docker도 비슷한 개념이지만 가상화보다 가벼움
서버위에 도커를 올리고 도커위에 여러 애플리케이션을 사용

docker engine 도커를 사용할수있게 하는 소프트웨어
-ship: 컨테이너를 적재한다는 의미로 사용

    1. putty 실행할 때 기본적으로 해주는 것
      sudo apt-get update
      sudo apt-get upgrade
    1. 키를 설치
      curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    1. 사전에 필요한 패키지 다운로드 (패키지 간 , 없이 입력해야함)
      sudo apt-get install apt-transport-https \ #https로 바꾸는 패키지
      ca-certificates \ #인증서 관련 패키지
      curl \
      gnupg \
      lsb-release
    1. 소스리스트에 도커리스트를 업데이트 하는것 = 도커라는 단어가 들어왔을 때 주소로 가서 확인하게 됨
      echo \
      "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 도커 설치
    sudo apt-get update
    sudo apt-get install docker-ce docker-ce-cli containerd.io
    ce : core engine
  2. docker사이트에서 이미지를 찾아서 가져옴
    sudo docker run hello-world

sudo docker ps 도커가 어떤것을 실행중인지 표시

도커를 실행하기 위해서는 도커위에 이미지가 있음 = 도커 상의 이미지를 가지고 컨테이너를 올리는 것

1) docker pull ubuntu:18.04 : 특정버젼이 필요해서 우분트 18.04의 이미지를 잠깐 '가져'오는것
2) docker run --name demo1 ubuntu:18.04 : 우분트 18.04버젼의 demo1 이라는 이름의 컨테이너 '실행'해서 컨테이너를 올리기. 하지만 실행하고 빠져나감
3) docker run -it --name demo2 ubuntu 18.04 /bin/bash : (interactive)대화형으로(지속적으로 적용) 작업하기 때문에, bin 밑에 bash쉘이 있음, 결국 빠져나감
이 때 커서가 /# 로 바껴있음 = ubuntu 안에 들어와있기 때문, exit로 빠져나옴
4) docker run -it -d --name demo3 ubuntu:18.04 : 빠져나가지 않고 계속 실행
5) docker exec -it demo3 /bin/bash : 데모3번에 접속
6) docker logs 컨테이너 안의 값들을 확인하고 싶을 때
7) docker run --name demo4 -d busybox sh -c "while true; do $(echo date); sleep 1; done"
: busybox라는 이미지를 이용해서 demo4를 실행,
busybox은 쉘코딩을 간단하게 한것,
while true 조건이 만족하는 동안 계속 루프는 도는데, true니까 무한이 돌게 됨
do문 안에 있는 것을 실행
sllep 1 : 1초간 기다린다.
done : 마무리

컨테이너의 status가 exited라도 컨테이너는 살아있다.
run 한다면 언제든지 살아서 동작한다.
= rm (컨테이너 네임) 로 삭제함
rmi (이미지 이름) : 컨테이너를 삭제해도 이미지는 남아있어서 이미지도 삭제해줌

vi editor 내부 (vi Dockerfile의 과정)

1) mkdif docker-practice
2) cd docker-practice # 해당되는 디렉터로 들어가기
3) touch Dockerfile #빈 파일 생성, 대소문자 유의함
4) vi Dockerfile
5) i 눌러서 insert 모드로 변경
FROM ubuntu:18.04
RUN apt-get update #패키지들이 업데이트 하겠다.
RUN pip install numpy # 작동라이브러리도 설치할 수 있게 할수 있음
CMD ["echo","Hello Docker"] #echo라는 명령어를 실행하겠다. CMD=command
=> 업데이트가 완료되면 hello docker이라는 문구를 출력하겠다.
6) ESC 로 insert 모드 나가기
7) :wq : w 쓰기 q 나가기 =쓰고 나가겠다.
=> 이렇게 Docker파일을 만들었다.

Dockerfile을 참조해서 Docker 이미지를 만드는것

docker build -t my-image:v1.0.0 . (마지막 . : 현재 디렉토리를 뜻함)
우분트가 기본 뼈대로 my-image 들을 추가 = 파일이 커지기 시작 = 주고받기 어렵다
하지만 docker가 한덩어리가 아닌 layer가 나뉘어짐, 이미 가지고있는 layer는 주고받지 않는다. =가볍게 사용함

docker images | grep my-image:v1.0.0 # my-image로 특정화 시키는것

Registry 로컬에서 이미지를 관리할수있게 해줌

웹서버처럼 운영하기 때문에 port 넘버가 있음
1) docker run -d -p 5000:5000 --name registry registry
: registry라는 이미지를 가져와서 registry라는 이름을 붙이고 데몬모드로 항상 떠있고 포트넘버 50번으로 동작 할 것이다. (내부적으로 5000 외부적으로도 5000 포트를 사용하겠다)
2) docker tag my-image:v1.0.0 localhost:5000/my-image:v1.0.0
: my-image:v1.0.0 을 localhost 5천번에 있는 registry에 my-image:v1.0.0 으로 저장한다.= 소속을 밝혀주는 것(tag)
3) docker push localhost:5000/my-image:v1.0.0
: 밀어넣기(업로드 작업 이루어짐)
여기까지 레지스트리에 이미지를 넣는 작업
4) curl -X GET http://localhost:5000/v2/_catalog
: 주소에 GET 방식으로 확인하는 작업 _catalog : 상위 주소(v2)의 목록을 보여줌
5) curl -X GET http://localhost:5000/v2/my-image/tags/list
: my-image의 태그들의 리스트를 확인

도커허브와 연결하기

docker login 도커 아이디로 로그인하기
docker tag my-image:v1.0.0 (도커 아이디)/my-image:v1.0.0
docker push (도커아이디)/my-image:v1.0.0

명령어들

sudo 관리자임을 명시하는 것
sudo usermod -a -G docker $USER 도커라는 프로그램을 모든 유저가 사용할 수 있도록 권한을 주는 것 = 이후에 sudo 안붙어도 명령 가능해짐 => 이 후에 사용자들 바로 사용 가능한것이 아니라 사용자도 재접속 후 사용 가능 하다.
sudo service docker restart 도커를 재시작 하는 명령어
--help : 자세한 옵션들을 볼 수 있음
cd: 불러오기 및 불러온파일에서 작업 시작
ps -a = process all : exit된것까지 모든 실행결과 보여줌
pull : 가져오기
bash : 리눅스에서 명령을 처리하는 쉘
/bin/bash : bin 밑에 있음
ls -all :
logs : 컨테이너 안의 내용(값) 확인
exit : 빠져나가기
-d : daemon 데몬 종료되지않고 계속 떠서 서비스를 함
exec : execute
-it : interative
sh : 쉘 명령
sh -eco : print하겠다
sh -c : 셀 코딩
-f : 지속적으로 메세지를 팔로우하겠다. ctrl c로 중단시킬수 있음
각각의 앱이 컨테이너 위에서 실행되고있을 때 계속 트래킹을 해야될 때 이상이 있을 때 상태를 감시하기 위해 사용함
& : 백그라운드에서 실행 시키겠다.
-f & : 계속 실행되서 중단을 못시킴. ctrl c 로 중단 못함 logout 해야함
rm : remove 컨테이너 삭제
rmi : 도커 안의 이미지 삭제 / 이미지위에 컨테이너가 올라감 이미지>컨테이너
pwd : 위치하고 있는 디렉토리 확인하는 명령어
mkdir : 디렉토리 만들기
touch : 아무것도 없는 빈 파일 만드는 명령어
vi : 에디터, 명령을 내릴수 있는 상태 -> i 눌러서 입력을 하기 위한 상태로 바꿔야함
cat : 해당되는 파일안의 텍스트를 보여줌
build : 이미지파일로 만들기
-t :
images | grep my-image : 이미지들 중에 my-image로 특정화 시키는 것
| : pipe처럼 사용 (shift + )
-p : port를 의미, 포트넘버할때 포트
tag : 태그를 달아준다
cd .. : 하위 디렉토리로 이동
curl : client for URL : 세부옵션을 조절하는 개발 웹 개발 툴

Kubernetes

  • docker들을 관리하는 기술
  • docker의 클라우드라고 봐도 무방함

모델을 저장하는
실험의 결과를 보고 모델을 배포,
모델 배포방법은 도커를 사용한다.
도커 전체를 관리해주는 'Kubernetes'가 필요하다.

Node안에 컴퍼넌트들이 있음
컴포넌트 하나가 하나의 도커라고 보면 된다.
docker 컨테이너를 만들고, 이 도커를 서버에 배포해달라고 위탁하는 것
알아서 node에 맞춰서 배포함(분산처리)
컴퍼넌트가 대량일 경우 주기적으로 컴퍼넌트를 체크하고, 문제가 있을때 강제로 정지후 다시 실행함으로 서버스가 멈추지 않게 유지해줌

참고영상
https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c

Microservices architecutre MSA

  • 어떤 기능들을 최소한의 조각들로 만들어서 각 조각들이 연계가 될 수 있도록 함
    각 조각들을 python, php, java 등 어떤식으로 만들든 상관없이 동작함
    = 각자 원하는 언어로 만들 수 있음
    요청을 받으면 서비스조각들을 불러오면서 작동하고 필요한 조각을 호출하게 됨
    각 조각들의 내부적인 환경들이 다르다는것은 운영하는 입장에서 부적합
    각 조각들을 컨테이너로서 사용하는 것으로 해결한다.
    특정 조각(컨퍼넌트)에 몰리게 되서 과부화가 되면 결과적으로 죽을 수 있음, 몰리게되는 양에 맞춰서 특정 컨퍼넌트도 늘어나야된다. 이 과정을 사람이 할 수 없기 때문에 Kubernetes가 필요하다.

minikube 미니큐베 kubenetes을 쓰기쉽게 만든것

  • 1) 구글사이트에서 미니큐베를 다운로드
    curl -LO https://storage.googleapis.com/minikube/releases/v1.22.0/minikube-linux-amd64
  • 2) 로컬에 설치
    sudo install minikube-linux-amd64 /usr/local/bin/minikube
  • 3) 인터넷에 있는 큐베명령어 도구 다운
    curl -LO https://dl.k8s.io/release/v1.22.1/bin/linux/amd64/kubectl
  • 4) 로컬에 설치 및 권한주기
    sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
    root 권한으로 kubectl에 실행권한 부여하는 것
  • 5) kube 서비스를 docker 드라이브로 시작하기
    minikube start --driver=docker
  • 6) pod 실행하기
    kubectl get pod -n kube-system
  • 7) pod 직접 생성 = yaml 파일로 만들어야 함
    vi pod.ymal
    apiVersion: v1 # kubernetes resource 의 API Version
    kind: Pod # kubernetes resource name
    metadata: # 메타데이터 : name, namespace, labels, annotations 등을 포함
    name: counter
    spec: # 메인 파트 : resource 의 desired state 를 명시
    containers:
    -name: count # container 의 이름
    image: busybox # container 의 image
    args: [/bin/sh, -c, 'i=0; while true; do echo "i: $(date)"; i=((i+1)); sleep 1; done'] # 해당 image 의 entrypoint 의 args 로 입력하고 싶은 부분
    : count라는 pod를 샐행시킬 것이다.
  • 8) 적용하기
    kubectl apply -f pod.yaml
    pod.yaml 이라는 파일의 내용을 가지고 적용할 것이다. =count라는 pod가 생성
  • 9) 접속하기
    kubectl exec -it counter sh
  • 10) 삭제하기
    kubectl delete pod counter

Tip

Devops : Development Operater
품질관리

심할경우 하루에 150번씩 돌아간다.
린스타트 : 일단 시작해서 devops를 한다.
CI CD

지속적인 통합을 해서 지속적인 배포를 하는 것
I : integration
D : Developmnet (deveops)
언제든지 리스크가 있다. 언제든지 배포한 단위를 기억했다 롤백을 하거나, 문제 발생시 즉시 수정을 함

MlOps : dev ops의 다음단계, 머신러닝이 들어간것
모델을 만들기 위해서는 데이터가 필요하다. 실행하기 위한 파이썬 코드도 있다.
데이터->모델생성->모델검증작업->적합한 모델 선별 -> 데이터
데이터가 발생하면 파이썬코드로 자동으로 수집
pipeline을 설계해서 데이터를 집계한다.
일련의 과정을 자동으로 진행
모델을 여러가지조건으로 가장 적합한 모델 선별, 모델을 저장하는 리스트 생김, 실험의 결과들을 보고 모델 선발, 이 모델을 가지고 배포하게 됨
모델을 배포할때 docker을 사용한다.
모델을 docker로 만듬= dockerize
웹 서버는 docker파일을 받아서 운영할수있도록 세팅되있음. docker을 push하면 바로 실행할수 있게 해줌. 여러 웹 서버를 운영해서 docker의 갯수와 상관없이 도커의 사이즈를 조절해서 실행한다.

Registry : 도커 이미지를 차곡차곡 쌓아짐,포트 넘버 가짐 = git과 같은 기능
도커 레지스트리 조차 도커안에 있다
dockhub : github와 같은 기능

virtualbox-우분트
가상pc를 조성함
https://www.youtube.com/watch?v=gj1sU2Qs9y4

profile
안뇽하세용

0개의 댓글

관련 채용 정보