가상화

 

아파치의 경우에도 하나의 서버가, 다른 도메인으로 들어오면 여러 사이트 제공해줄 수 있게 됐어.

하드웨어 성능이 증가함에 따라 여러 서비스를 제공해줄 수 있는 여력이 생겼어.


 서버 가상화
  서버를 가상 머신의 형태로 사용할 수 있도록 하는 가상화 기술
  CPU, RAM, HDD 등의 자원을 가상머신들이 나눠 사용할 수 있음

 네트워크 가상화
  물리적인 네트워크를 가상의 논리적인 네트워크로 구성하는 가상화 기술
  물리적으로 존재하던 네트워크 장비는 가상 머신의 형태로 존재함

 스토리지 가상화
  여러 디스크 장치를 하나의 논리적인 디스크로 사용할 수 있도록 하는 가상화 기술
  
 컨테이너 가상화
  하나의 호스트 OS를 논리적으로 구획하여 서로 독립적인 애플리케이션을 실행할 수 있는 가상화 기술

-----

컨테이너 기술

Linux LXC

FreeBSD Jail
 프로세스 구획
 네트워크 구획
 파일시스템 구획

Solaris Containers
 Zone
 리소스 관리

cgroups
 프로세스, 쓰레드를 그룹으로 묶어서 관리하는 기능과 시스템의 리소스(CPU, RAM, Disk)에 대해 제한하는 기술

Namespace
 각각의 오브젝트를 격리하기 위한 리눅스 커널 기술  (운영체제를 여러 개의 구역으로 나눠서 사용..?)

 PID Namespace : 독립적인 PID 사용할 수 있는 Namespace
 Network Namespace : 독립적인 네트워크를 사용할 수 있는 Namepspace
 UID Namespace : 독립적인 UID를 사용할 수 있는 Namespace
 Mount Namespace : Mount Point를 독립적으로 사용할 수 있는 Namespace
 UTS Namespace : 독립적인 호스트네임을 사용할 수 있는 Namespace
 IPC Namespace : 독립적인 IPC를 사용할 수 있는 Namespace

Union Filesystem
 하나의 파일시스템이 아닌 각각 독립적인 여러개의 파일시스템 레이어가 묶여서 하나의 파일시스템으로 이용할 수 있도록 하는 파일시스템 기술

OCI(Open Container Initiative)
 컨테이너의 표준 사양을 제정하기 위해 2015년에 만들어진 단체
 Docker, CoreOS, Google, Red Hat AWS, MS 등이 주요 멤버로 참여

-----

Docker
 2013년 Docker 사에서 Go 언어 기반으로 개발한 오픈소스 컨테이너 기술
 기존의 Linux Container 기술보다 좀더 사용성이 개선되어 널리 사용되고 있음
 개발 환경, 테스트 환경, 서비스 환경을 통합적으로 관리할 수 있음

도커 주요 특징
 - 서버를 코드 형태로 정의
 - 이식성
 - 다양한 벤더 환경에서의 상호 운용성

도커 주요 구성 요소
 컨테이너
   컨테이너 이미지가 실행된 형태로 상태를 가지지며 애플리케이션 실행에 필요한 파일을 포함하는 단위

 이미지
   애플리케이션이 포함된 컨테이너를 생성하고 실행하기 위한 파일을 포함하는 데이터 세트 단위

 저장소(Registry)
  컨테이너를 생성하기 위한 이미지를 저장하는 저장공간
  대표저인 저장소는 "Docker Hub"

 도커 호스트
  -  도커 컨테이너가 실행될 수 있도록 컴퓨팅 리소스를 제공하는 컴퓨터

 도커 클라이언트
  - 도커 실행 명령어

----

도커 엔진 정보 확인
$ docker info

도커 버전
$ docker version

도커 이미지 목록 확인
$ docker image ls
$ docker images

REPOSITORY       TAG       IMAGE ID       CREATED        SIZE
ubuntu/apache2   latest    603872f94008   6 days ago     180MB
centos           7         eeb6ee3f44bd   5 months ago   204MB

도커 컨테이너 이미지 검색
$ docker search IMAGE
NAME                                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
python                                   Python is an interpreted, interactive, objec…   0         [OK]       
mirantis/python-operations-api           https://mirantis.jira.com/browse/IT-40189       0                    [OK]    

이미지 다운로드
$ docker image pull IMG_REPO:TAG
$ docker pull IMG_REPO:TAG

컨테이너 실행 (새로운 컨테이너 시작)
$ docker container run --name CONTAINER IMG_REPO:TAG
$ docker run --name CONTAINER IMG_REPO:TAG

컨테이너 실행(포그라운드로 제어 터미널 포함)
$ docker container run -it --name CONTAINER IMG_REPO:TAG
$ docker run -it --name CONTAINER IMG_REPO:TAG

컨테이너 실행(백그라운드)
$ docker container run -d --name CONTAINER IMG_REPO:TAG
$ docker run -d --name CONTAINER IMG_REPO:TAG

 

debian os를 background로 실행시켰는데, 켜자마자 꺼졌어. 왜??

기본적으로 운영체제 이미지들은 쉘을 갖고 있는데, 이 쉘은 제어 터미널을 갖고 있지 않으면 꺼지게 되어있어.

즉, 컨테이너의 메인 프로세스가 종료가 되어버리니까 컨테이너가 종료되는거야.

(오랜 의문 해결!!!)

 

그러면 어떻게 해야 안꺼져?

docker container run -dt --name debian_3 debian 이렇게 하면 안꺼져.

만약에 docker container run -di --name debian_5 debian 이렇게 하면?

얘도 켜지긴 하네?

 

그래도 강사님이 알려준 docker container run -dt --name debianx debian 이걸로 하자.

 

docker container run -i --name debian_6 debian

-> 얘는 [devops@docker ~]$ 이런게 안떠. 대신 명령어 입력했을 때 출력은 돼.

docker container run -t --name debian_7 debian

이거는 [devops@docker ~]$ 뜨기는 하는데, 명령어 입력을 못해.

 

Q)그러면 background로 실행시킨 컨테이너에는 어떻게 들어갈까?

docker exec -it debian_8 /bin/bash

이렇게 들어감. debian_8이라는 컨테이너에 /bin/bash 프로그램을 실행시키는데, 명령어 입력 가능하게 하고 [devops@docker ~]$ 뜨게 하는거임.

$$ echo $$ 사용하고 있는 Shell의 PID값을 출력한다. 현재 bash 쉘의 프로세스 ID

ps -ef 하면 현재 쉘의 pid가 나옴


실행중인 컨테이너 목록 확인
$ docker container ls
$ docker ps

종료된 컨테이너 포함 목록 확인
$ docker container ls -a
$ docker ps -a

실행중인 컨테이너에 attach (background에 돌아가고 있는 컨테이너에 진입할 수 있음.)

주의) attach로 들어가면 입력을 제대로 못받음. 화면에 나오는 출력은 보여주는데...

shell에서 작업을 할 때는 attach는 쓰는게 아니다.

실시간으로 로그가 화면에 뜨는 상황일 때, -it로 foreground를 하면 제어 터미널을 차지하니까, attach로 그냥 출력 메시지만 보는거야.

 

$ docker container attach CONTAINER -> 새롭게 추가된 명령어가 많네.
$ docker attach CONTAINER

실행중인 컨테이너에 추가 프로세스 실행
$ docker container exec CONTAINER PROCESS
$ docker exec CONTAINER PROCESS

실행중인 컨테이너에 쉘 실행
$ docker container exec -it CONTAINER SHELL
$ docker exec -it CONTAINER SHELL

실행중인 컨테이너 종료
$ docker container stop CONTAINER
$ docker stop CONTAINER

실행중인 컨테이너 강제 종료
$ docker container kill CONTAINER
$ docker kill CONTAINER

컨테이너 삭제
$ docker container rm CONTAINER
$ docker rm CONTAINER

컨테이너 로그 확인
$ docker container logs CONTAINER
$ docker logs CONTAINER

컨테이너가 실행되면서 나왔던 로그들이랑 내가 친 명령어도 나옴.


도커 컨테이너 상태 확인(CPU, RAM, Network)
$ docker container stats CONTAINER
$ docker stats CONTAINER

지금은 컨테이너가 종료된 상태라 0%로 나옴 ㅋㅋ


도커 컨테이너 일시 정지 (컨테이너 작업을 잠시 중지해야할 필요가 있을 때. 예를 들어, 이 컨테이너가 리소스를 많이 잡아먹어서 이거 잠깐 멈추고 다른거 한다음에 다시 켜고 싶을 때)
$ docker container pause CONTAINER

도커 컨테이너 일시 정지 해제
$ docker container unpause CONTAINER

도커 컨테이너에 파일 복사
$ docker container cp DOCKER_HOST_FILE_PATH CONTAINER:/CONTAINER/FILE/PATH

도커 컨테이너 파일을 도커 호스트로 복사
$ docker container cp CONTAINER:/CONTAINER/FILE/PATH DOCKER_HOST_FILE_PATH



'System Engineering > Kubernetes' 카테고리의 다른 글

Docker (Build, Ship, Run)?  (0) 2022.03.18
docker 3/5  (0) 2022.03.17
실행중인 모든 컨테이너 한 번에 종료  (0) 2022.03.16
docker exit code 의미  (0) 2022.03.16
docker 1/5  (0) 2022.03.16
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기