Computer Science/etc

[Docker] 서버 가상화 및 도커 기본 사용법

비소_ 2023. 1. 19.

가상화

하이퍼바이저 형 가상화 방식은 Vmware 처럼 가상머신에 Guest OS, 가상 CPU, 가상 메모리 등을 제공하여 마치 물리서버처럼 실행되는 것 처럼 보인다. 하지만, 이 방식은 가상머신 이미지마다 결국 OS가 필요하게 되고, 가상머신마다 운영체제가 달라질 수 있어 운영관리의 어려움이 발생할 수 있다.

이와 달리 컨테이너 형 가상화 방식은 여러 개의 컨테이너를 호스트 OS 커널에서 직접 실행하게 된다. 따라서 컨테이너는 기존 가상화 기술보다 가볍게 동작한다.

컨테이너 기술은 갑자기 등장한 것이 아니고, 기존 리눅스 기반 시스템에서 프로세스 간 격리를 위해 사용하던 기술들을 조합하여 발전시켜 만들졌다고 볼 수 있다. chroot와 네임 스페이스, cgroup을 조합한 형태인 LXC(Linux Container)에서 부터 컨테이너 기술이 본격적으로 발전했다.

  • chroot: 특정 디렉토리를 루트로 인식하게끔 하는 명령어
  • 네임 스페이스: 리눅스 시스템 자원을 묶어 프로세스 할당하는 방식, 하나의 프로세스 자원을 관리하는 기능
  • cgroup: CPU, 메모리 등 프로세스 그룹의 시스템 자원 사용량을 관리하여 특정 애플리케이션이 자원을 과도하게 사용하는 것을 제한.

자세한 내용은 아래 블로그를 참조하자.

https://naver.me/5oQ5twWH

 

서버 가상화: 가상머신(VM)과 컨테이너

[BY 가비아] 가상화 기술이 발전하지 않았다면 지금 서버실은 어떤 모습일까요? 기업은 여전히 한 대의 ...

m.post.naver.com


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 + PCtrl + 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.

https://tech.cloudmt.co.kr/2022/06/29/%EB%8F%84%EC%BB%A4%EC%99%80-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%9D%98-%EC%9D%B4%ED%95%B4-1-3-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%82%AC%EC%9A%A9%EB%B2%95/

https://naver.me/5oQ5twWH

http://www.opennaru.com/cloud/virtualization-vs-container/

댓글