I got IT

Docker 컨테이너 라이프 사이클 명령어 총정리 본문

DevOps/MSA

Docker 컨테이너 라이프 사이클 명령어 총정리

joshhoxy 2023. 5. 31. 22:22

컨테이너의 특징

도커(Docker)는 컨테이너화 된 애플리케이션을 만들고 배포하기 위한 오픈 소스 플랫폼입니다.

즉 컨테이너를 생성하고 관리하는 하나의 소프트웨어 프로그램 입니다.

컨테이너는 애플리케이션을 실행하는 독립적인 환경을 의미하는 배포 단위이고,

컨테이너가 갖는 가장 큰 특징은 VM과 다르게  Host OS의 커널을 사용한다는 것이고 이로 인해 더 경량화 된 격리환경 이라는 것입니다. 

 

경량화? 가벼우니까 마구마구 올려도 되는 건가 ??

컨테이너가 경량화 된 실행환경 이기는 하지만 결국에는 컨테이너도 많이 생성할 수록 관리가 어려워지고 그만큼 사용하는 메모리가 늘어나 장애가 발생하게 됩니다. 가볍다고 무작정 생성하면 결국 Host OS 시스템에 부하가 생기고 이로 인해 컨테이너 전반에 지연 및 장애를 발생시킬 수 있습니다.

 

따라서 쿠버네티스같은 컨테이너 오케스트레이션 도구를 사용하기도 하는 것이고 여러 모니터링 툴을 사용하는 것입니다. 

하지만 docker 명령어를 잘 활용하면 로컬에서도 컨테이너 관리를 충분히 할 수 있고 컨테이너의 라이프 사이클은 컨테이너의 동작원리를 이해하기 위해서는 반드시 알고 있어야 하는 개념입니다.

 

Docker 를 사용하면 HostOS 에서 Docker 명령어를 통해 각각의 컨테이너의 생성, 실행, 중지 등의 상태관리가 가능합니다.

이때 Docker도 일반적인 프로세스 처럼 Status 를 가지며 리눅스 커널의 사상을 상속받기 때문에 개념이 매우 흡사합니다. 

 

Container Lifecycle

컨테이너의 생애주기, 즉 라이프 사이클은 아래와 같습니다. 

이는 컨테이너 생애주기를 간단하게 표현한 것이고 조금 더 자세히 살펴보면 아래와 같이 나타낼 수도 있습니다.

도커를 이용하면 도커 클라이언트라는 인터페이스(CLI)를 활용하여 도커 상태를 관리할 수 있습니다.

위와 같이 컨테이너 상태를 관리하기 위해 사용하는 도커 명령어를 하나씩 살펴보면서 컨테이너의 상태를 관리하는 방법에 대해 정리하도록 하겠습니다.

 

Docker 상태 관리 명령어

docker ps

: 실행중인 Docker 컨테이너 목록 표시

일반적으로 docker ps 명령어를 실행하면 실행 중인 컨테이너 목록이 출력됩니다. 기본적으로 실행 중인 컨테이너만 표시되며, 종료된 컨테이너는 표시되지 않습니다. 따라서 -a 옵션과 사용하는 것이 일반적입니다.

옵션

-a, --all: 실행 중인 컨테이너뿐만 아니라 종료된 컨테이너도 표시합니다.
-q, --quiet: 컨테이너 ID만 표시합니다.
-f, --filter: 지정된 조건에 따라 컨테이너를 필터링합니다.
--format: 출력 형식을 지정합니다.

 

 

docker create

: 도커 컨테이너 생성

docker create [옵션] [이미지명]

명령어를 수행하면 상태가 가장 초기 상태인 Created가 됩니다. 이는 컨테이너의 설정과 파일 시스템이 준비되었지만 아직 실행은 되지 않은 상태입니다.

이때 --name 명령어로 특정 컨테이너 이름을 지정할 수도 있습니다.

 

 

docker start 

: 도커 컨테이너 시작

이때 docker run 과 다른 점은 이미 생성된 컨테이너를 실행하는 것입니다.

docker start [옵션] [컨테이너ID or 이름]

 

docker run 

: 컨테이너 실행

컨테이너를 생성부터 시작까지 한번에 하는 명령어 입니다.  

docker run [옵션] [이미지]

이때, 이미지가 없으면 자동으로 default 저장소에서 이미지를 pull 하여 다운받습니다. 이 때, 별 다른 설정을 안했다면 default 저장소는 Docker hub 입니다. 

 

docker ps 명령어를 해보면 컨테이너가 실행중인 것을 확인할 수 있습니다.

 

옵션

-i : 호스트의 표준 입력을 컨테이너와 연결 (interactive)
-t : TTY (가상 터미널장치)  할당
--rm : 컨테이너 실행 종료 후 자동 삭제
-d : 백그라운드 모드로 실행 (detached). 자주 쓰는 옵션
--name : 컨테이너 이름 지정
-p : 호스트-컨테이너 간 포트 바인딩
-v : 호스트-컨테이너 간 볼륨 바인딩

 

-i, -t 옵션 사용하기 📌

i, t 옵션은 Guest OS가 설치되어있는 컨테이너에 터미널 연결할때 자주 쓰이는 옵션입니다.

 

-p -d 옵션 사용하기 📌

p 옵션을 통해 컨테이너와 호스트간 포트를 바인딩 할 수 있습니다. nginx 를 예로 살펴보겠습니다.

d 옵션을 통해서는 컨테이너가 백그라운드에서 실행되도록 합니다. 

docker -p 80:80 -d nginx

 

docker ps

docker ps 명령어를 보면 아래와 같이 PORTS 필드에 HostOS:컨테이너가 80:80 으로 바인딩된 것을 볼 수있습니다.

컨테이너 정상작동 확인을 위해 curl 명령어를 수행해봅니다.

 

docker pause 

: 컨테이너 일시중지

컨테이너 내의 모든 프로세스가 정지되어 CPU 및 메모리 사용이 중단됩니다.

docker pause [컨테이너ID or 이름]

 

docker unpause

: 컨테이너 실행 재개

 

docker stop 

: 컨테이너 중지(종료)

docker stop [컨테이너ID or 이름]

컨테이너 내부에서 실행 중인 프로세스를 정지시키고 컨테이너를 종료합니다. 이때 docker stop은 SIGTERM 시그널을 전달합니다. 프로세스를 정상적으로 안전하게 종료 시킵니다.

-t, --time 옵션을 사용하여 예약종료합니다.

 

docker stop $(docker ps -a -q)

모든 컨테이너를 종료할 때 사용됩니다. 

$(docker ps -a -q) 먼저 수행 -> 모든 컨테이너 id 를 불러와 $를 통해 호출되어 docker stop 인자값에 사용됩니다.

 

docker kill

: 컨테이너 강제 중지(종료)

SIGKILL 시그널을 전달합니다. 보통 컨테이너가 정상 작동하지 않을 때 프로세스를 강제로 종료합니다.

docker kill [컨테이너ID or 이름]

 

Docker 컨테이너 및 이미지 자원 정리하기

 

docker rm

: 컨테이너 삭제

docker rm [옵션] [컨테이너ID or 이름]

옵션

-f, --force: 실행 중인 컨테이너를 강제로 삭제합니다. f 옵션 없이 실행중인 컨테이너 삭제 명령시 명령어 실행에 실패합니다.
-v, --volumes: 컨테이너와 연결된 볼륨을 함께 삭제합니다.

 

docker container prune

: 중지된 모든 컨테이너 삭제

 

docker images

: 도커 이미지 확인

호스트에 저장된 이미지 목록을 표시하는 데 사용됩니다.

 

docker rmi

: 도커 이미지 삭제

docker rmi [옵션] [이미지명 or 이미지ID]

옵션

-f, --force: 이미지를 강제로 삭제합니다. 이미지가 여러 개의 태그로 식별되는 경우에도 강제로 삭제됩니다.
-i, --no-prune: 이미지 삭제 후 dangling 이미지를 자동으로 정리하지 않습니다.
-a, --all: 모든 태그의 이미지를 삭제합니다.

 

그 외

docker inspect

: 컨테이너 또는 이미지 상세 정보 확인

low-level의 여러 컨테이너 정보를 확인할 수 있습니다. 주로 컨테이너 상태 장애 발생 시 문제파악할 때 자주 사용하는 명령어 입니다.

docker inspect [옵션] [컨테이너ID or 컨테이너이름 or 이미지ID]


docker inspect 명령어를 실행하면 해당 컨테이너 또는 이미지에 대한 상세한 정보가 JSON 형식으로 출력됩니다. 이 정보에는 개체의 ID, 상태, 네트워크 설정, 볼륨 마운트, 환경 변수, 포트 매핑 등 다양한 속성과 구성이 포함될 수 있습니다.

 

결론

로컬에서 적은 수의 컨테이너를 관리하는 것은 도커 명령어로 충분하나 노드와 컨테이너가 많아질 수록 복잡도가 증폭하기 때문에 여러 관리도구의 도움이 필요해 집니다.  따라서 다양한 컨테이너 관리도구 들이 생겨나고 있는 것입니다.

 

 

'DevOps > MSA' 카테고리의 다른 글

컨테이너 중지 없이 터미널 나가기  (0) 2023.06.02