가상화와 도커에 대해서

이제 Docker는 인터넷 서비스 산언에서는 사실상 표준입니다. 간단한 개발 환경 구축에서 부터 시작해서, Docker swarm을 이용한 서비스 좀 더 나아가서 ECS와 Kubernetes와 같은 컨테이너 오케스트레이션 툴을 이용하여 컨테이너 기반의 인터넷 서비스 플랫폼을 구축/운영하기도 합니다. 몇 개의 챕터에 걸쳐서 가상화, docker에 대한 개념, 사용법을 살펴보려 합니다.

도커와 가상화

베어메탈(bare metal), 가상 머신 기반의 가상화(Virtualization) 과 비교해서 컨테이너 기술을 설명한다. 이들 기술과 비교해서 컨테이너 기술이 가진 특징이 무엇인지, 어떤 장점때문에 컨테이너 기술을 사용하는지 그리고 어떤 단점을 가지고 있는지 살펴 본다.하드웨어를 다루는 엔지니어가 아닌 소프트웨어 개발자에게 베어메탈이란 다소 생소한 용어일 것이다. 베어메탈은 "운영체제가 설치 돼 있지 않는 컴퓨터 하드웨어"를 의미한다. "깡통 컴퓨터"라고 하면 이해하기가 쉬울 것이다.

Mesos

Mesos는 분산 시스템 커널(distributed systems kernel)이다. 뭔가 굉장히 복잡해 보이지만, 기본 개념은 간단하다. 네트워크로 묶여 있는 여러 개의 컴퓨터의 자원 즉, CPU, 메모리, 디스크 등의 자원을 하나로 묶어서 resource pool로 만들어서 마치 하나의 컴퓨터 처럼 보이게 하겠다는 거다. 그리고 커널로서 작동하기 위한 기능인 스케쥴러와 애플리케이션 관리 기능을 더해서, 분산 커널을 만든다. 이제 유저가 애플리케이션 실행을 요청하면, 자원이 넉넉한 인스턴스를 할당하고 애플리케이션을 실행 하면 된다.

예제로 살펴보는 Go : Time formatting 와 Parsing

애플리케이션에서는 다양한 방식으로 시간정보를 출력하기 마련이다. Go의 time 패키지는 패턴을 파싱해서 시간을 출력하는 기능을 제공한다.RFC3339에서 정의하는 형식으로 출력했다. 시간 표기에 대한 국제 표준은 ISO8601 인데, RFC3339는 인터넷상에서 어떻게 다룰지를 규약하고 있다. ISO8601과 거의 비슷하다. time.Parse()메서드를 이용 하면, 입력된 데이이터(여기에서는 두번째 매개변수)를 주어진 형식에 따라서 파싱해서 시간 구조체로 변경할 수 있다. 여기에서는 RFC3339 형식으로 파싱했다.

예제로 살펴보는 Go : Random number

Go의 math/rand패키지로 의사난수(pseudorandom number)를 만들 수 있다.rand.Intn(n)은 0 <= n < 100 사이의 interger형 난수를 반환한다. rand.Float64는 0.0 <= f < 1.0 사이의 float형 난수를 반환한다. 난수의 범위를 변경하려면 사칙연산을 적절하게 사용해야 한다. 예제 코드의 경우 5.0 <= f < 10.0 사이의 난수를 반환 한다.math/rand는 고정된 난수 시퀀스를 반환한다. 다른 난수 시퀀스를 얻기 위해서는 rand.NewSource메서드로 새로운 랜덤시드(random seed)를 설정해야 한다. 랜덤시드가 같으면 난수 시퀀스가 같기 때문에, 안전한 난수를 얻기가 까다롭다. 보통 유닉스 시간을 랜덤시드로 사용한다. 안전한(예측하기 힘든) 난수를 얻고 싶다면 crypt/rand패키지를 사용해야 한다.

예제로 살펴보는 Go : Number parsing

문자열을 숫자로 변환하는 것은 기본적인 작업이지만, 많은 프로그래머들이 어려워하는 작업이기도 하다. Go를 이용해서 문자열을 숫자로 바꿔보자.strconv 패키지로 문자열을 숫자로 변환할 수 있다. ParseFloat는 문자열을 float타입으로 인식해서 변환한다. ParseInt는 integer 타입으로, ParseUint는 unsigned int로 변환한다. ParseInt는 Hex 타입도 인식한다. 각 메서드의 두번째 매개변수는 몇 비트를 변환할지를 결정한다.

예제로 살펴보는 Go : URL Parsing

웹 애플리케이션을 만들다 보면 문자열을 조작해야 하는 경우가 많다. Go net/url 패키지로 URL을 조작할 수 있다.테스트에 사용 할 URL은 "postgres 스키마 url.Parse 메서드로 URL을 파싱할 수 있다. 파싱하고 나면 url.URL 구조체를 반환한다. 주요한 메서드와 값들을 정리했다. URL.Scheme URL.User URL.Host URL.Path URL.Fragment URL.RawQuery URL.RawQuery는 key=value 스타일로 돼 있다. url.ParseQuery메서드로 RawQuery를 map으로 만들어서 사용 할 수 있다.

예제로 살펴보는 Go : SHA1 Hashes

종종 SHA1 hashes는 바이너리 파일이나 텍스트파일을 식별하기 위한 문자열을 만들기 위해서 사용한다. 예를들어서 git revision control system은 SHA1을 이용해서 파일과 디렉토리의 버전을 만든다. Go로 SHA1 해시를 만들어보자. Go의 crypto/패키지는 다양한 해시 함수 구현을 가지고 있다.sha1.New()메서드를 호출하면 hash.Hash를 반환한다. h.Write()메서드로 해시할 데이터를 입력 받고, h.Sum(byte{})로 입력받은 데이터에 대한 SHA1 값을 만든다. h.Sum 메서드는 매개변수로 해시할 데이터의 슬라이스를 설정 할 수 있다. 보통 전체 데이터를 해시하기 때문에, 매개변수는 nil로 설정하는 경우가 많다.

예제로 살펴보는 Go : Base64 Encoding

base64는 바이너리 데이터를 문자코드에 영향을 받지 않도록 ASCII 코드들로 인코딩하는 기술을 가리키는 개념이다. 이메일을 통한 데이터통신에 많이 사용하고 있다. encoding/base64패키지를 이용해서 데이터를 base64로 인코딩 혹은 디코딩 할 수 있다. base64를 모두 쓰기 귀찮아서 별칭인 b64를 쓰기로 했다. 예제코드는 string 데이터를 인코딩/디코딩 하고 있다. 먼저 데이터를 인코딩 한 다음, 그 결과를 다시 디코딩 해서 서로 일치하는지 확인한다.

NginX를 이용한 static 컨텐츠 서비스 와 캐시 설정

NginX를 리버스 프락시 서버로 사용하는 이유는 다음과 같다. 1. 로드밸런싱 1. 유저 요청에 대한 선 처리 1. 캐싱 이중 3번, Nginx를 이용해서 스태틱 페이지를 캐싱해서 서비스하는 방법을 테스트한다.웹 서비스의 성능을 높일 수 있는 가장 확실하고 손쉬운 방법은 컨텐츠 캐시다. 요즘 웹 서버는 매우 바쁘다. 유저의 요청을 받아서 데이터베이스를 조회해서 즉석에서 HTML 페이지를 만들고 이미지와 CSS, 자바스크립트 등 다양한 오브젝트들을 함께 응답해야 한다. 웹 서버가 해야 하는 일이 늘어나면서 리버스 프락시를 이용, 두 개 이상의 WAS(Web Application Server)가 요청을 분산해서 처리하도록 구성을 한다.