어떠한 명령어의 입력 - 실행 - 결과 를 하나의 파이프라인처럼 흘러가도록 연결하는것 ( | ) 을 입력하여 실행 ex) cat test.sh | grep sh 이렇게 만든 명령은 cat명령의 결과를 grep의 명령어에 전달하는 것이다. 전달하면서 "test.sh 파일에서 sh라는 글자가 포함된 라인만 출력하라" 라는 의미로 전달된다
###cat test.sh
#!/bin/bash
INSTALLFILE="/home/src/install.sh"
if [ -e ${INSTALLFILE} ] ; then
echo " ${FILENAME} exists"
#결과
cat test.sh | grep sh
#!/bin/bash
INSTALLFILE="/home/src/install.sh"
Redirection ( > , >> , >& ..)
리눅스 쉘은 표준 입출력을 파일 형태로 열게되는데 stdin : 표준입력 (키보드) stdout : 표준출력 (모니터) stderr : 표준에러 (모니터) 기본적으로, 프로그램의 연산결과를 출력장치로 내보내는데, 이렇게 보내지는 데이터를 임의로 다른 장치로 보내는 것을 redirection이라고 함 (낚아채서 내가원하는 곳으로)
사용
리눅스에서 열려있는 파일은 (0,1,2 의 파일 디스크립터) File Discriptor를 할당받으며, 이를 이용하여 redirection한다
> file
표준출력을 파일로 redirection (없으면 만들고 있으면 덮어써)
# mkdir study
# cd study/
# vi test.txt
텍스트 라인 1
텍스트 라인 2
33333
~
~
##### :wq 로 저장
cat test.txt > 1stout
# ls
1stout test.txt
가상화는 단일한 물리 하드웨어 시스템에서 여러 시뮬레이션 환경이나 전용 리소스를 생성할 수 있는 기술
하이퍼바이저라고 불리는 소프트웨어가 하드웨어에 직접 연결되며, 1개의 시스템을 가상머신VM이라는 별도의 고유하고 독립된환경으로 분할할 수 있음
하이퍼바이저라는 소프트웨어가 물리 리소스를 필요로 하는 가상 환경으로부터 물리 리소스를 분리합니다.
하이퍼바이저가 설치된 물리 하드웨어를 호스트라고 하며, 그 리소스를 사용하는 여러 VM을 게스트라고함
APP과 종속성을 분리해 체계화 할 때, 기존의 VMware, VirtualBox 와 같은 OS가상화 방식에서 벗어나, CPU의 가상화기술 (HVM) 을 이용한 KVM (Kernel-based Virtual Machine) 과 반가상화 (Paravitualization) 방식의 Xen이 등장함. 게스트 OS가 필요하긴 하지만, 전체 OS를 가상화하는 방식이 아니었기에 성능이 향상.
리눅스에서는 이러한 방식을 개선하기위해 프로세스를 격리하는 리눅스컨테이너 방식이 등장
도커는 리눅스컨테이너에 여러 기능을 추가하여, APP을 컨테이너로서 좀더 쉽게 사용할 수 있도록 만들어진 오픈소스 프로젝트.
기존의 VMWare, Virtual_Machine가상 머신은 운영체제 인스턴스 하나를 구획화(Compartmentalizing)가 필요한 애플리케이션 각각에 할당하는 방식으로 '분리(Isolation)'를 제공한다. 거의 완전하게 분리시킬 수 있는 방법이지만, 상당한 비용이 수반된다. 각 운영 인스턴스가 앱 자체에 더 효과적으로 할당할 수 있는 메모리와 프로세싱 파워를 소비하기 때문이다.
리눅스 컨테이너를 이해하기 위한 출발점은 cgroups(control groups) 및 네임스페이스(namespaces)이다. 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널 기능들이다. IBM이 최초 개발한 리눅스 네임스페이스는 시스템 리소스들을 묶어, 프로세스에 전용 할당하는 방식으로 제공한다.
구글이 최초 개발한 리눅스 cgroups는 분리와 CPU, 메모리 등 프로세스 그룹의 시스템 리소스 사용량을 관리한다. 예를 들어, 과학용 컴퓨팅 애플리케이션 같이 많은 CPU 사이클과 메모리를 소비하는 애플리케이션을 운영하는 경우, 애플리케이션을 cgroup에 집어넣어 CPU와 메모리 사용량을 제한할 수 있다.
네임스페이스는 프로세스 하나의 리소스 분리를 처리하고, cgroups는 프로세스 그룹의 리소스를 관리한다. cgroups와 네임스페이스가 결합되면서 리눅스 컨테이너(Linux Containers, LXC)라는 컨테이너 기술이 탄생했다.
가상화종류
호스트 가상화
PC , Server에 OS를 설치하고, 그 위에 가상머신을 설치하여, Host OS 위에서 Guest OS 를 운영하는 방식 각 가상환경마다 가상머신을 생성하고, Guest OS를 설치하게됨 예시로 VirtualBox, VMWare, Parallels 등이 있습니다. 장점으로는 가상의 하드웨어를 운영하는것으로, 호스트운영체제에 큰 제약사항이 없습니다 단점으로는 OS위에 OS가 얹히는 방식이라, 오버헤드가 큽니다.
하이퍼바이저 가상화
Host OS 없이 하드웨어에 하이퍼바이저를 설치하여 사용하는 방식으로 Xen, MS Hyper-V, KVM등이 있고 아마존의 EC2가 Xen을 기반으로 구축되어 있습니다. 호스트OS없이 하드웨어를 직접 제어하기에 효율적으로 리소스를 사용할 수 있습니다. 하지만, 자체적으로 머신에 대한 관리기능이 없기에 관리를 위한 컴퓨터나 콘솔이 필요합니다. 하이퍼바이저에는 [전,반]가상화방식이 있는데, 전가상화는 하드웨어를 완전히 가상화하는방식으로,
전가상화 방식은 하이퍼바이저에서 어떤 OS든 각 OS들의 명령어를 번역해주고, 각 OS들에 자원까지 할당하는 역할까지 하기에 Guest OS 운영체제의 별다른 수정이 필요없지만, 약간 성능이 떨어집니다.
반가상화방식은 전가상화의 성능저하를 막기위해 Hyper Call이라는 인터페이스로 각 OS에 각기다른 번역기를 통해 작동합니다. 전가상화에 비해 성능이 좋지만, 각 Guest OS의 커널을 수정해줘야한다는 단점이있습니다.
컨테이너 가상화
호스트OS위에 컨테이너 관리 소프트웨어를 설치하여, 논리적으로 컨테이너를 나누어 사용 다른 가상화방식들보다 오버헤드가 적어 가볍고 빠르다는 장점이 있습니다. 호스트 운영체제의 커널을 공유하면서 격리된 컴퓨팅 자원을 제공하는 가상화기술입니다 하드웨어를 가상화하는 가상머신과 달리 커널을 공유하는 방식이기에, 실행속도가 빠르고 성능상의 손실이 거의 없습니다. 컨테이너로 실행된 프로세스는 커널을 공유하지만, 리눅스 namespaces, cgroup, chroot등의 커널기능을 활용해 격리되어 실행됩니다. 이러한 격리기술 덕분에 호스트머신에게는 프로세스로 인식되지만, 컨테이너 관점에서는 마치 독립적인 가상머신처럼 보이게 됩니다
CGROUPS
Control Group의 약자로 다수의 프로세스가 포함되어있는 프로세스그룹 단위로 자원사용(CPU,I/O,Memory,Network 등)을 재한하고 격리시키는 리눅스 커널 기능
namespace
프로세스를 실행할 때 시스템의 리소스를 분리해서 실행할 수 있도록 도와주는 기능
chroot
가상 루트 디렉터리 보안 등을 위해 새로운 가상의 루트디렉토리를 생성하여 원격 서비스로 접속할 경우 이 디렉토리의 상위로 이동이 불가능하게 하는 명령어 파일을 격리시켜 독립공간을 생성
리눅스 컨테이너 장점
운영체제 수준의 가상화: 컨테이너는 운영체제 수준의 가상화 기술입니다. 별도의 하드웨어 에뮬레이션 없이 리눅스 커널을 공유해 컨테이너를 실행하며, 게스트OS 관리가 필요하지 않습니다.
빠른 속도와 효율성: 하드웨어 에뮬레이션이 없기 때문에 컨테이너는 아주 빠르게 실행됩니다. 프로세스 격리를 위해 아주 약간의 오버헤드가 있지만 일반적인 프로세스를 실행하는 것과 거의 차이가 없습니다. 또한 하나의 머신에서 프로세스만큼 많이 실행하는 것이 가능합니다.
높은 이식성portability: 모든 컨테이너는 호스트의 환경이 아닌 독자적인 실행 환경을 가지고 있습니다. 이 환경은 파일들로 구성되며, 이미지 형식으로 공유될 수 있습니다. 리눅스 커널을 사용하고 같은 컨테이너 런타임을 사용할 경우 컨테이너의 실행 환경을 공유하고 손쉽게 재현할 수 있습니다.
상태를 가지지 않음stateless: 컨테이너가 실행되는 환경은 독립적이기 때문에, 다른 컨테이너에게 영향을 주지 않습니다. 도커와 같이 이미지 기반으로 컨테이너를 실행하는 경우 특정 실행 환경을 쉽게 재사용할 수 있습니다.
유니온 파일 시스템 Union File System
UFS에서는 기존 레이어(하위 레이어) 위에 새로운 레이어(상위 레이어)가 쌓일 경우, 하위 레이어는 읽기 전용 상태가 된다. 또한, 상위 레이어에서 하위 레이어에 쓰기 작업을 수행할 경우, 하위 레이어를 복사하여 사용(CoW)하기 때문에 상위 레이어에서는 하위 레이어에 아무런 영향을 주지 않는다.
도커에서는 레이어가 크게 컨테이너 레이어(상위)와 이미지 레이어(하위)로 구분된다. UFS 특성에 따라서 컨테이너가 파일 시스템에 쓰기 작업을 수행할 경우, 실질적으로는 하위 레이어의 복사본에 해당 작업을 수행하기 때문에 서로 다른 컨테이너가 하위 레이어를 공유하고 있어도 서로 독립적인 파일 시스템 운용이 가능해진다.