앱을 돌릴때 필요한 라이브러리, 어플리케이션 자체를 이미지와해서 만들것을 name space와 cgroup을 통해서 시작하는것을 컨테이너라고 생각하면됨
도커가 나오면서 컨테이너가 널리 사용됨
특히 구글에서 컨테이너 관리로 썻던 쿠버네티스가 그런 계기가있음
실행에 필요한것들을 이미지에 다 담고 (이미지는 어디든 갈 수 있음) 도커에 넣고 실행하면 컨테이너가 생성
컨테이너 안에 들어가면 로컬에서 쓰던 기분 (어? 쉘인가?)
도커 이미지 : 실행에 필요한것을 다 담음
컨테이너 : 그 이미지를 분리시킨다음 runC 상태로 돌아가서 그 안에 있던 (이미지) 에플리케이션이 독립된 단위로 실행됨
VM : 은 하이퍼바이져가 들어가 있음 (하이퍼바이저 : 가상화를 해주는 장치 또는 칩)
Container : VM에 필요하던 오버헤드가 없음
이것만 알아둬라
Container 는 Nacespace/Cgroup의 집합 그럼 나는 어떻게 네트워크를 그 안에서 조절할 것이냐 ? 또는 안에서 조절할 부분 or 밖에서 조절할 부분을 구분할 것인가?
• 가상화 기술이란
서버, 스토리지, 네트워크 등의 IT 리소스의 물리적인 성질이나 경계를 가리고, 논리적인 리소스
이용 단위로 변환해서 제공하는 기술
• 목적
인프라를 단순화 시킬 수 있다. (사용자 측면)
유휴장비의활용률을높일수있다.(불필요한장비증설방지)
서비스 장애에 대한 신속한 대응이 가능하다.
TCO(Total Cost of Ownership)를 절감할 수 있다.
신속한 확장이 가능하다. (Scale Out)
• 종류
서버가상화
스토리지 가상화
네트워크 가상화
• 가상화의 목적
– Isolation from other tenant(세입자 - 여러개의 자원을 하나에서 쓰는 형태) – because basically it’s shared resource. – try to be safe from other noisy neighborhood
• Application of virtualization technology
분류
설명
애플리케이션 가상화
특징
• 사용자의 PC에 개별적으로 설치되어 있는 애플리케이션을 가상화를 통해 제공 • 사용자는 필요한 애플리케이션을 자신의 PC에서 매번 설치하지 않고도 즉시 사용 가능
역할
클라우드의 SaaS(Software as a Service) 구현의 기반 기술 제공
데스크톱 가상화
특징
• 서버 측 데스크톱 가상화는 사용자의 데스크톱에서 Windows Vista, Windows 7 등의 이기종의 또 다 른 데스크톱을 가상으로 소유가 가능하게 함 • 클라이언트 측 데스크톱 가상화는 PC 안의 이기종의 가상 데스크톱을 운영 가능 하도록 함 • 데스크톱 가상화를 통한 개인 작업 공간과 회사 작업 공간의 분리가 가능해 짐
역할
클라우드의 DaaS(Desktop as a Service) 구현의 기반 기술 제공
서버 가상화
특징
• 데이터센터 내의 수십 대의 물리적인 서버 워크로드들을 몇 대의 가상 서버로 통합 집적 (Consolidation)하여 물리적인 상면 비용, 관리적인 측면의 비용, Green IT 측면의 전력량을 포함한 서버 자원 활용도를 증대시킬 수 있음
역할
클라우드의 IaaS(Infrastructure as a Service) 구현의 기반 기술 제공
스토리지 가상화
특징
• 필요로 하는 스토리지 공간 대신 Thin-Provisioning이라는 기술을 통해 최소 공간만을 가상으로 할당 하여 서비스 구현이 가능하도록 함 • 이기종의 스토리지 시스템 통합에 사용할 수 있는 환경을 제공
역할
클라우드의 IaaS(Infrastructure as a Service) 구현의 기반 기술 제공
네트워크 가상화
특징
• 하드웨어 어플라이언스 형태로 존재해 왔던 L2, L3, L7 스위치, 네트워크 방화벽, 보안 장비들을 가상 머신으로 구현하고, 네트위킹 자원들이 하나의 공유된 물리적인 환경에서도 내부적으로는 가상화를 통해 분리되어 동작하게 함
역할
멀티 테넌시(Multi-Tenancy)를 갖춘 IaaS 구현의 기반 기술 제공
• 서버가상화
시스템 자원을 공유(pool & share)함으로써 전체적인 시스템의 활용도를 증대시킬 수 있고, 자동화 기술과 함께 적용함으로써 시스템 사용자의 서비스 수준을 보다 향상시켜 줄 수 있다.
하이퍼바이저 : 가상화를 해주는 장치 또는 칩
<서버 가상화 기술>
• 하이퍼바이저(Hypervisor)
프로세서나 메모리와 같은 다양한 컴퓨터 자원에 서로 다른 각종 운영 체제(OS)의 접근 방법을 통제하는 얇은 계층의 소프트웨어
다수의 OS를 하나의 컴퓨터 시스템에서 가동할 수 있게 하는 소프트웨어로 중앙 처리 장치(CPU)와 OS 사이에 일종의 미들웨어로사용 됨
하나의 컴퓨터에서 서로 다른OS를 사용하는 가상 컴퓨터를 만들 수 있는 효과적인 가상화엔진
Bare-Metal(native) Hypervisor
Hosted Hypervisor
Host OS가 필요없다.
Host OS가 없어 오버헤드가 적다.
각 VM별 관리가 유연하다.
자체적인 관리 기능이 없어 별도의 관리 솔루션이 필요하다.
Host OS가 필요하다.(리눅스, 윈도우 등)
Host OS 상에 가상 머신을 배치하므로 오버헤드
가 발생한다.
VM 생성이 간단하다.
다양한 관리 솔루션이 있다.
• 호스트 OS 가상화 vs 하이퍼바이저 가상화
• 가상화유형
– 전 가상화 (full-virtualization)
시스템 전체를 완전히 가상화 하여 시스템의 Bios부터 CPU, Memory, I/O 등을 완전히 에뮬레이션 하여 가상화 하는 방법
장점
단점
• 하드웨어를 완전히 가상화 하기 때문에 Guest OS에 아무런 수정없이 Windows, Linux까지 다양 한 OS를 이용할 수 있다. • 가상머신의 유지보수가 쉽다.
• 전 가상화를 실현하기 위해 CPU의 VT(Virtualization Technology)를 이용하므로 성 능의 저하가 발생한다는 단점이 있다.
– 반 가상화 (para-virtualization)
하드웨어 전체를 가상화 하는 대신에 가상화가 적용된 리눅스 커널을 시스템 부팅 시 적용하는 것으로 모든 장치를 가상화 하는 것은 아님
장점
단점
• 가상머신이 직접 하드웨어를 제어하는 것이 아니 라 하이퍼바이저에게 의뢰, 하이퍼바이저가 제어 를 하기에 높은 성능을 유지할 수 있다.
• 반 가상화를 실현하기 위해서는 가상머신 OS의 커널 일부분을 수정해야 한다. • 가상머신 유지보수가 어렵다. (가상머신 비밀번 호 분실 시 복구 불가능)
# 그래프 그리기 : 사고건수 top10 # plt.figure(figsize=(10, 6)) # 사이즈 지정 # plt.title('전국 시도별 교통 사고 발생 top 10') # 제목 붙히기 # plt.bar(range(10), data_grby_city_sorted_acc['사고건수'][:10]) #막대 그래프 (x, y) # plt.xticks(range(10), data_grby_city_sorted_acc['시도'][:10]) # x축 단위 라벨 (x, 라벨값) # plt.savefig('전국시도별교통사고발생top10.png') # plt.show() # 막대그래프 그리기 : 사망자수 top10 # plt.figure(figsize=(10, 6)) # 사이즈 지정 # plt.title('전국 시도별 교통 사고 사망자수 top 10') # 제목 붙히기 # plt.bar(range(10), data_grby_city_sorted_death['사망자수'][:10]) #막대 그래프 (x, y) # plt.xticks(range(10), data_grby_city_sorted_death['시도'][:10]) # x축 단위 라벨 (x, 라벨값) # plt.savefig('전국시도별교통사고사망자수top10.png') # plt.show() # 파이그래프 그리기 : 사망자수 top10 # colors = ['red', 'yellow', 'purple', 'burlywood', 'lightcoral'] # plt.title('전국 시도별 교통 사고 사망자수 top 10') # plt.pie( data_grby_city_sorted_death['사망자수'][:10], # labels=data_grby_city_sorted_death['시도'][:10], # startangle=90, # counterclock=False, # autopct='%.1f%%', # colors=colors) # plt.savefig('전국시도별교통사고사망자수top10.png') # plt.show()
# 지도에 그리기 ''' - 라이브러리 : folium - 지도 데이터 파일 : .geojson 공간정보시스템연구소 : http://www.gisdeveloper.co.kr/?p=2332
지도 원천데이터는 SHP(Shape file) 이 필요 SHP파일은 직접핸들링하기 힘드러 GeoJSON이라는 지리정보표시를 위한 표준 JSON 포맷으로 변환 https://mapshaper.org/ : 해당 사이트에서 다운받은 지도 파일 4개 넣고 단순화시켜 변환가능 1. 맵쉐이퍼사이트에서 select 버튼을 누르고, 다운받아 압축해제한 4개 파일 선택 2. 팝업에 nap-verticles 체크, input란에 'encoding=euc-kr' 입력하고, import 누르기 3. 지도위 오른쪽 상단에 simplyfy 버튼 누르고, 팝업옵션에 apply 누르고 4. 상단 가운데에 settings 프로그래스바 움직여서 단순화 시키고 5. 오른쪽 상단에 export 누르고, GeoJson 선택하고 export하면 다운받아짐.
* folium * 시각화 패키지 중 하나로 지도를 그려주는 모듈. 경량.
''' import json import folium
# 전국 시도별 교통사고 지도 그래프 print(data[['시도', '사고건수']].groupby(by='시도').sum()) data_grby_city2 = data[['시도', '사고건수']].groupby(by='시도').sum()
json = json.load(open("TL_SCCO_CTPRVN_min.json", encoding="utf-8")) # print(json['features'][0]['id']) print(data_grby_city2['사고건수'].index[0]) for i in range(17): # 'id' : 사고건수값 json['features'][i]['id'] = data_grby_city2['사고건수'].index[i]
# map 객체 생성 : 대한민국 중심좌표를 센터로, 줌 레벨 7로 시작하는 맵 생성 map = folium.Map(location=[36.2002, 127.054], zoom_start=7) # Choropleth : 지도위에 띄워줄 그래프 레이어, 설정하여 맵에 추가 folium.Choropleth( geo_data=json, name='choropleth', data=data_grby_city2['사고건수'], key_on='feature.id', fill_color='YlGnBu', fill_opacity=0.8, line_opacity=0.2).add_to(map)
# 레이어 컨트롤러러에 지도 추가 folium.LayerControl().add_to(map) map.save('trafficMapResult.html') # 저장
# 대한민국 중심좌표 : 36.2002, 127.054 # 서울 중심좌표 : 37.541, 126.986
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2> hello down page</h2>
<h3> 다운을 받고 싶으면 아래 버튼을 누르세요 !!!</h3>
<button onclick="window.location='/upload/download'"> 다운로드 </button>
</body>
</html>
2-4 Controller에서 해당 요청 처리 매핑메서드 만들어 DownloadView의 기능 호출
// 다운로드 버튼 띄운 화면
@GetMapping("helloDown")
public void helloDown() {
}
// 다운 요청 처리
@GetMapping("download")
public ModelAndView down() {
// 다운 시킬 파일 준비
File f = new File("C:\\img\\ham.jpg");
// 생성자 매개변수
// String viewName : view 이름 -> xml 지정한 downloadView 빈의 id값
// String modelName : 파라미터명 지정 (이름)
// Object modelObject : 데이터 (다운 시킬 파일)
ModelAndView mv = new ModelAndView("fileDown", "downloadFile", f); //root에 bean으로 fileDown 만듦 그 다음 dowloadFile 키와 f라는 value를 줌
return mv;
}
}
* 주요 메서드 Iterator<String> getFileNames() : 업로드된 파일들의 파라미터 명 리턴 MultipartFile getFile(String name) : 파라미터명이 name인 파일 리턴 List<MultipartFile> getFiles(String name) : 파라미터명이 name인 업로드 파일 정보 목록 리턴
* 작업 순서 - 처리 매핑 메서드에 매개변수 MultipartHttpServletRequest 지정 - request에서 파일 정보 꺼내담기 - 파일 저장 경로 + 새파일명 만들어 File 객체 만들기 (파일 이름 중복 안되게) - .transferTo() 메서드로 파일 저장
package com.board.controller;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import lombok.extern.log4j.Log4j;
@Controller
@RequestMapping("/upload/*")
@Log4j
public class UploadController {
@GetMapping("uploadForm")
public void upload() {
log.info("upload form!!!!!!!!!!!!!!");
}
@PostMapping("uploadPro")
public void uploadPro(String msg, MultipartHttpServletRequest request) { // msg(text), img(file)
log.info("*********upload pro*************");
log.info("********* msg : " + msg );
//log.info("********* img content type : " + request.getContentType());
//log.info("********* img : " + request.getFile("img")); // 파일 정보 꺼내기
try {
// 전송한 파일 정보 꺼내기
MultipartFile mf = request.getFile("img");
log.info("****************** original file name : " + mf.getOriginalFilename());
log.info("****************** file size : " + mf.getSize());
log.info("****************** file contentType: " + mf.getContentType());
// 파일 저장 경로
String path = request.getRealPath("/resources/save");
log.info(" save path : "+ path);
// 새파일명 생성
String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase(); // 하이픈 다 빼버림 대문자로
log.info("***********uuid : " + uuid);
// 업로드한 파일 확장자만 가져오기
String orgName= mf.getOriginalFilename();
// beach.jpg -> .jpg만 두고 나머지는 지움
String ext = orgName.substring(orgName.lastIndexOf("."));
// 저장할 파일명
String newFileName = uuid + ext;
log.info("*****new fileName : " + newFileName);
//저장할 파일 전체 경로
String imgPath = path + "\\" + newFileName;
log.info("****imgPath : " + imgPath);
// 파일저장
File copyFile = new File(imgPath);
mf.transferTo(copyFile);
}catch(IOException e){
e.printStackTrace();
}
}
}