Docker
컨테이너 가상화 한경에서 애플리케이션을 관리하고 실행하기 위한 오픈 소스 플랫폼
Linux 위에서 동작하며, Go 언어로 개발
OS 가상화 기술(Host 가상화) : 전 가상화
우리에게 익숙한 VMware나 VirtualBox같은 가상머신은 호스트 OS위에 게스트 OS 전체를 가상화하여 사용하는 방식
이 방식은 여러가지 OS를 가상화(리눅스에서 윈도우를 돌린다 던가) 할 수 있고 비교적 사용법이 간단하지만, 무겁고 느려서 운영환경에선 사용할 수 없다.
CPU 가상화 기술 : 반 가상화
KVM(Kernel-based Virtual Machine)과 반가상화( Paravirtualization)방식의 Xen이 등장
이러한 방식은 게스트 OS가 필요하긴 하지만, 전체 OS를 가상화하는 방식이 아니었기 때문에 호스트형 가상화 방식에 비해 성능이 향상됨
이러한 기술들은 OpenStack이나 AWS, Rackspace같은 클라우드 서비스에서 가상 컴퓨팅 기술의 기반
============================>
전가상화든 반가상화든 추가적인 OS를 설치하여 가상화하는 방법은 어쨋든 성 능문제가 있었고, 이를 개선하기 위해 프로세스를 격리(컨테이너) 하는 방식이 등장함
============================>
리눅스에서는 이 방식을 리눅스 컨테이너라고 하고, 단순히 프로세스를 격리시 키기 때문에 가볍고 빠르게 동작합니다. CPU나 메모리는 딱 프로세스가 필요한 만큼만 추가로 사용하고 성능적으로도 거의 손실이 없다.
============================>
하나의 서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행됨
새로운 컨테이너를 만드는데 걸리는 시간은 겨우 1-2초(체감 0.001초)로 가상 머신과 비교도 할 수 없이 빠르다
Process를 격리시키는 방법
리눅스
cgroups(control groups)와 namespace를 이용한 LXC(Linux container) 기술
도커
LXC를 기반으로 시작해서 0.9버전에서는 자체적인 libcontainer 기술을 사용하였고 추후 runC기술에 합쳐 짐
컨테이너, 오버레이 네트워크(overlay network), 유니온 파일 시스템(union file systems) 등 이미 존재하는 기술을 잘 조합하고 사용하기 쉽게 만듦
도커 이미지
컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것으로, 상태 값을 가지지 않고 변하지 않음
컨테이너는 이미지를 실행한 상태라고 볼 수 있고, 추가되거나 변하는 값은 컨테이너에 저장됨
이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에, 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없음
한 서버에 여러 개의 컨테이너를 실행할 수 있음
용량 문제 상황
도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에, 보통 용량이 수백 MB 정도가 됨
도커의 레이어(layer) 개념과 유니온 파일 시스템
여러 개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해 줌
이미지는 여러 개의 읽기 전용(read only) 레이어로 구성되고, 파일이 추가되거나 수정되면 새로운 레이어가 생성됨
ubuntu 이미지가 A + B + C의 집합이라면, ubuntu 이미지를 베이스로 하여 만든 nginx 이미지는 A + B + C + nginx
도커 이미지 관리
url 방식으로 관리하며 태그를 붙일 수 있음
이러한 방식은 이해하기 쉽고 편리하게 사용할 수 있으며, 태그 기능을 잘 이용하면 테스트나 롤백도 쉽게 할 수 있음
도커 이미지 생성
도커는 이미지를 만들기 위해 Dockerfile이라는 파일에, 자체 DSL(Domain-specific language)언어를 이용하여,
이미지 생성 과정을 적음
일반적인 시스템 개발 흐름
개발 환경과 테스트 환경에서 제대로 동작하더라도 운영 환경에서 동작하지 않는 상항 자주 발생
도커를 이용한 시스템 개발 흐름
인프라 환경을 컨테이너로 관리
애플리케이션 실행에 필수적인 모든 파일과 디렉토리를 통째로 컨테이너에 담고, 이 컨테이너의 기반이 되는 Docker 이미지를 Docker Hub에 공유
이미지는 Docker를 설치할 수 있는 환경이라면(단, CPU 의존성), 어디에서나 동작할 수 있기 때문에, “개발 및 테스트 환경에서는 동작하지만, 운영 환경에서는 동작하지 않는"위험을 줄임
Docker의 기능
□ Build: Docker 이미지를 만드는 기능
Docker는 애플리케이션의 실행에 필요한 프로그램 본체, 라이브러리, 미들웨어, OS나 네트워크 설정 등을 하나로 모아서 Docker 이미지를 만듦
□ Ship: Docker 이미지를 공유하는 기능
Docker 이미지는 Docker 레지스트리(Docker Hub)에서 공유 가능
□ Run: Docker 이미지를 작동시키는 기능
Docker는 Linux상에서 컨테이너 단위로 서버 기능을 작동시킴.
Docker가 설치된 환경에서 Docker 이미지를 가지고 어디서든 컨테이너를 작동 가능
Docker 컨테이너 간 통신
동일한 호스트 상의 Docker 컨테이너는 구동 시 private address로 자동으로 할당되므로, 컨테이너끼리 통신을 하기 위해 “링크(link) 기능“을 사용
Docker 컨테이너와 외부 네트워크 통신
가상 bridge docker0와 호스트 OS의 물리 NIC에서 패킷을 전송해야 함
이때 Docker에서는 NAPT(Network Address Port Translation)을 이용하여 접속
NAPT란 하나의 IP address를 여러 개의 컴퓨터에서 공유하는 기술로서, IP Address와 포트 번호를 변환하는 기능
2020년도 3학년 2학기 임베디드시스템 및 실습(동의대학교 최병윤 교수님)
'수업정리 > Linux' 카테고리의 다른 글
GCC, G++, make 설치 (0) | 2020.09.28 |
---|---|
Docker의 설치 방법과 기본 command (0) | 2020.09.15 |
vi (vim)편집기 기본 사용법 및 주요 명령어 (0) | 2020.09.15 |
GNU Nano Editor의 기본 사용법 (2) | 2020.09.15 |
기본 리눅스 명령(Part 1) (0) | 2020.09.10 |