가상화
하이퍼바이저 형 가상화 방식은 Vmware 처럼 가상머신에 Guest OS, 가상 CPU, 가상 메모리 등을 제공하여 마치 물리서버처럼 실행되는 것 처럼 보인다. 하지만, 이 방식은 가상머신 이미지마다 결국 OS가 필요하게 되고, 가상머신마다 운영체제가 달라질 수 있어 운영관리의 어려움이 발생할 수 있다.
이와 달리 컨테이너 형 가상화 방식은 여러 개의 컨테이너를 호스트 OS 커널에서 직접 실행하게 된다. 따라서 컨테이너는 기존 가상화 기술보다 가볍게 동작한다.
컨테이너 기술은 갑자기 등장한 것이 아니고, 기존 리눅스 기반 시스템에서 프로세스 간 격리를 위해 사용하던 기술들을 조합하여 발전시켜 만들졌다고 볼 수 있다. chroot와 네임 스페이스, cgroup을 조합한 형태인 LXC(Linux Container)에서 부터 컨테이너 기술이 본격적으로 발전했다.
- chroot: 특정 디렉토리를 루트로 인식하게끔 하는 명령어
- 네임 스페이스: 리눅스 시스템 자원을 묶어 프로세스 할당하는 방식, 하나의 프로세스 자원을 관리하는 기능
- cgroup: CPU, 메모리 등 프로세스 그룹의 시스템 자원 사용량을 관리하여 특정 애플리케이션이 자원을 과도하게 사용하는 것을 제한.
자세한 내용은 아래 블로그를 참조하자.
Docker
Docker는 컨테이너 가상화 기술의 대표적인 플랫폼이다.
도커 이미지는 컨테이너를 만드는 데 필요한 읽기 전용 템플릿이다.
컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 도커파일을 만든 후 Dockerfile을 빌드하여 이미지를 만든다.
이미지로 컨테이너를 실행하면 이미지의 목적에 맞는 파일이 들어있는 파일 시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성된다. 이를 도커 컨테이너라고 한다.
하나의 도커 이미지로 여러 개의 컨테이너를 만들 수 있기 때문에 다중화에도 유용하게 사용할 수 있다.
기본 도커 명령어
$docker [대상] [액션]
- [대상]: image, volume, network 등
- [액션]: ls, inspect, start, run 등
컨테이너의 라이프 사이클은 다음과 같다.
컨테이너 생성
$docker create --name testos centos
--name
옵션을 추가하지 않으면 임의로 이름이 붙는다.
로컬 Repository에 이미지가 없으면 기본으로 docker hub에서 이미지를 pull한다.
한 번 pull한 이미지는 재사용이 가능하다.
생성 시 옵션 지정도 가능하다.
$docker create -it --name testos centos
- -i (--interactive) : 표준 입력(STDIN)을 활성화한다.
- -t (--tty) : 컨테이너에 pseudo-terminal을 할당한다.
컨테이너 이름 변경
$docker rename [현재이름] [바꿀 이름]
실행 중인 컨테이너 확인
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adb6732a399d centos "/bin/bash" 51 seconds ago Up 50 seconds testos
- COMMAND : 컨테이너 시작 시 실행될 명령어. create나 run 맨 끝에 새로운 명령어를 입력해 대체 가능
- STATUS : 컨테이너 상태. Up / Exited / Pause
- PORTS : 컨테이너가 개방한 포트와 호스트에 연결된 포트 (포트 포워딩 역할)
--no-trunc 옵션을 주면 컨테이너의 전체 ID를 보여준다.
$docker ps --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adb6732a399de1d9d4d2d8e2b74d6a4c6829652c8e950c77daebe32afdc25430 centos "/bin/bash" 5 minutes ago Up 5 minutes testos
컨테이너 실행
$docker start
-ai
옵션을 통해 컨테이너 내부로 접근하여 표준 입력을 받을 수 있다.
$docker start -ai testos
해당 컨테이너에 접근한 상태로 exit
명령어를 사용하면, /bin/bash
가 종료되면서 컨테이너도 함께 종료된다.
따라서, Ctrl + P
와 Ctrl + Q
를 눌러 실행 상태를 유지한 채로 빠져나올 수 있다.
컨테이너 종료
$docker stop [컨테이너 명 | 컨테이너 ID]
모든 컨테이너 상태 확인
$docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
151f3b70b5a4 centos "/bin/bash" 8 minutes ago Exited (0) 19 seconds ago testos
컨테이너 시작 및 COMMAND 실행
$docker run -dit --name test centos
-d
옵션을 사용해 COMMAND를 백그라운드에서 실행할 수 있다.
명령어 맨 뒤에 원하는 COMMAND를 정의할 수 있다.
컨테이너 재시작
$docker run -it --name test --restart always centos
> exit
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8dfcdfd3c5c6 centos "/bin/bash" 16 seconds ago Up 3 seconds test
재시작 옵션을 always로 설정했기 때문에 컨테이너를 종료시켜도 다시 실행된다. (STATUS 확인)
--restart 옵션은 다음과 같다.
- no : 재시작하지 않음
- on-failure : 종료 상태가 0이 아닌 경우 재시작
- on-failure:횟수(n) : 종료 상태가 0이 아닌 경우 n회만 재시작
- always : 재시작
컨테이너 리소스 제한
--cpus
: 최대 사용 가능한 cpu의 수를 지정 (CPU 사용 비율 지정)
-c (--cpu-share)
: 프로세스들 간의 CPU 자원 경합이 발생했을 때 해당 만큼 할당 가능. Default 1024
-m (--memory)
: 메모리 사용량을 제한 (b, k, m, g 단위)
컨테이너 내부 접근
$docker attach [컨테이너 명]
컨테이너 내부에 접근하여 STDIN/STDOUT/STDERR를 사용
컨테이너에서 새로운 프로세스 실행
COMMAND 말고 별도의 명령어를 실행할 수 있다.
웹 서버의 경우 COMMAND(PID=1)가 httpd로 정의되고, 쉘이 실행되지 않기 때문에 docker attach
로 명령 입력이 불가능하다. 따라서, 개별적으로 실행해준다.
$docker run -d --name web httpd
$docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e02c31135d3 httpd "httpd-foreground" 2 seconds ago Up 1 second 80/tcp web
$docker exec -it web /bin/bash
root@4e02c31135d3:/usr/local/apache2#
컨테이너 상태 및 리소스 양 확인
$docker stats
컨테이너 일시 중지
$docker pause
일시 중지된 컨테이너를 재시작 할 때는 docker unpause를 이용한다.
컨테이너 삭제
$docker rm [컨테이너 명]
-f
옵션을 통해 실행 중일 때 삭제할 수 있다.
컨테이너 이미지 삭제
$docker rmi [이미지 명]
종료된 컨테이너 일괄 삭제
$docker [대상] prune
[대상] 으로는 container, image, network, volume, system 등이 들어갈 수 있다.
컨테이너와 호스트 간의 파일 복사
$docker cp [복사할 대상] [복사시킬 대상]
컨테이너 안의 디렉토리를 지정하려면 [컨테이너 명:경로] 구조로 사용해야 한다.
Reference.
'Computer Science > etc' 카테고리의 다른 글
[정보처리기사] 실기 핵심 내용 요약 (0) | 2022.07.23 |
---|---|
[빅데이터 분석기사] 실기 요약본 (5) - 작업형 함수 정리(with. R) (0) | 2022.06.24 |
[빅데이터 분석기사] 실기 요약본 (4) - 빅데이터 결과 해석 (0) | 2022.06.24 |
[빅데이터 분석기사] 실기 요약본 (3) - 빅데이터 모델링 (0) | 2022.06.24 |
[빅데이터 분석기사] 실기 요약본 (2) - 빅데이터 탐색 (0) | 2022.06.24 |
댓글