본문 바로가기
Cloud/Docker

[Docker] 도커 컨테이너 라이프사이클 / 도커 관리 명령어1

by Yoonsoo Park 2024. 11. 25.

*해당 포스팅은 다음과 같은 환경에서 진행하였으니, 참고 바랍니다.

  • Docker Community Edition 
  • Ubunto Linux 22.04 (OS에 따라 설치 방법은 다소 상이하나, 사용법은 동일함)
  • VMware  Workstation pro ( x86_64, CPU  x 2, RAM 2GB, HDD 120GB)

 

1. 도커 컨테이너 라이프사이클(Lifecycle)

 도커 컨테이너를 관리하다 보면, 컨테이너의 상태를 확인해야 하는 경우가 종종 생긴다. 이때 도커 컨테이너의 상태에 맞게 효과적으로 관리하기 위해서는 컨테이너의 라이프사이클을 아는 게 유리하고, 컨테이너의 라이프사이클은 직접적으로 컨테이너 관리 명령어와 연관돼 있기 때문에 간단하게 컨테이너 라이프사이클의 상태전이도를 보고 넘어가자.

 

도커 컨테이너의 라이프사이클 : 컨테이너의 생성(created)부터 삭제(remove)까지의 과정

<Docker Container Lifecycle>

 

 

2. 도커 컨테이너 일반 관리 명령어

1) create : 컨테이너 생성

#기본 형식#
docker container create  [옵션]  [저장소이름/]이미지이름[:태그]  

#예시#
docker container create --name=MyWeb httpd:latest

#옵션#
--name : 컨테이너이름
--hostname : 컨테이너 내부에 적용되는 호스트네임 지정
-i : 컨테이너의 표준입력을 항상 열린 상태로 유지  
-t : 호스트에서 컨테이너를 사용할 수 있는 콘솔(TTY)이 할당 (--tty)

#태그#
[이미지이름]:latest : 최신 버전의 이미지
[이미지이름]:stable : 안정화 버전의 이미지

**태그와 옵션은 뒤에서도 자주 쓰이기 때문에 알아두자!

<실행 화면>

 

2) ps, ls : 컨테이너 목록 확인

#기본 형식#
docker container ls  [옵션]   
docker ps [옵션]

#옵션# 
-a : 모든 상태의 컨테이너를 표시 
=> -a를 주지 않으면, 실행 중이지 않은 컨테이너는 보이지 않는다
-q : 실행 중인 컨테이너의 ID만 출력

<실행 화면>

 

 실행 화면을 보면 -a 옵션을 주지 않았을 경우, created 상태의 컨테이너는 보이지 않는 것을 볼 수 있다.

 

3) start : 컨테이너 실행

#기본 형식#
docker start  [옵션]  [컨테이너 이름 | 컨테이너 ID]
docker restart [컨테이너 이름 | 컨테이너 ID] => 재시작

#예시#
docker start 364
docker start MyWeb

<실행 화면>

 

컨테이너는 이름 또는 컨테이너 ID로 식별되는데, 해당 정보들은 ps 명령어로 확인 가능하고, 컨테이너 ID는 다른 컨테이너의 ID와 겹치지 않는 숫자까지만 기입하면 컨테이너가 식별된다

 

4) run : 컨테이너 실행 ( RUN = CREATE + START ) -- 가장 많이 사용

#기본 형식#
docker container run [옵션] [저장소이름/]이미지이름[:태그]

#예시#
docker run -d --name=MyDB --hostname=MysqlDB mysql:latest

 

run 명령어를 사용하면, 로컬에 이미지가 없을 경우, 레지스트리에서 pull해오고, create과 start과정을 모두 진행해 준다. 

 

근데 해당 명령문을 실행하면 분명 컨테이너가 실행 중이어야 하는데, 종료된 상태이다. 왜 그럴까? 

도커에서는 컨테이너를 처음 실행할 때, 초기화 과정을 거치게 된다. 그때 MySQL, mariadb, Oracle과 같은 DBMS는 필수적으로 환경 변수로 루트 비밀번호를 설정해 줘야 정상적으로 컨테이너가 초기화되며 실행된다. 위의 경우 컨테이너를 실행해 줄 때, 환경변수를 지정해주지 않았기 때문에 자동으로 종료된 것이다. 위의 명령문에 다음 옵션을 추가해 주면 정상적으로 컨테이너가 실행된다. 

docker run -d --name=MyDB --hostname=MysqlDB -e MYSQL_ROOT_NAME=1234 mysql:latest

 

5) stop : 컨테이너 중지

#기본 형식#
docker container stop   [컨테이너 이름  | 컨테이너 ID ]

#예시#
docker container stop 072

 

6) rm : 컨테이너 삭제 

#기본 형식#
docker rm <컨테이너 이름  | 컨테이너 ID>
 
#예시#
docker rm 072

**컨테이너는 실행(running) 상태에서는 삭제할 수 없다. 삭제하기 전에 꼭 정지(stop)시켜주도록 하자.

 

7) prune : 정지 상태의 모든 컨테이너 삭제 

#사용법#
docker container prune

 

** 실행중인 컨테이너를 포함하여 모든 컨테이너를 한 번에 종료하고 삭제하기

실습을 진행하다보면, 기존에 만들어준 컨테이너와 포트가 충돌하여 오류가 생기는 경우가 있다. 실무에서는 권장하지 않는 방법이나, 해당 상황에서 실행 중인 모든 컨테이너를 정지하고, 모든 컨테이너를 삭제하는 방법을 알아두자. 

//모든 컨테이너 중지
docker container stop $(docker ps -qa) 

// 중지된 모든 컨테이너 삭제
docker container rm $(docker ps -qa) 
docker container prune

$( ) 은 쉘 스크립트에서 괄호 내부의 명령어의 출력값을 외부 명령어로 치환해주는 방식이다

 

8) exec : 컨테이너 내부에 명령 전달, 쉘에 컨테이너 연결하기 

#기본 형식#
docker container exec [옵션]  <컨테이너 이름 | 컨테이너 ID >

// 컨테이너에 쉘을 연결해서 직접 접속하기(잘 사용하는 방법은 아니다)
docker container exec -it  <컨테이너 이름  | 컨테이너 ID> /bin/bash

 

9) -v : 호스트와 컨테이너의 볼륨 연결 

#기본 형식#
docker container run -v <호스트의 디렉토리>:<컨테이너의 디렉토리> <컨테이너 이름 | 컨테이너 ID>

#예시#
docker container run -itd --name=mydb -v /root/shared_sto:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 mysql:latest

 호스트와 컨테이너의 볼륨 연결은 주로 컨테이너 내부의 디렉토리에 데이터를 저장하는 게 위험하기 때문에, 호스트의 볼륨에 연결해서 호스트에 직접 저장할 수 있도록 할 때 사용된다. 컨테이너에 저장했을 경우, 컨테이너가 지워지면 데이터도 전부 유실되기 때문이다. 

 

호스트에 따로 mkdir을 해주지 않은 상태로 컨테이너에 -v 옵션을 줘서 호스트와 컨테이너 간의 볼륨을 연결하면, 자동으로 디렉터리가 생성되고, 컨테이너의 데이터가 다음과 같이 호스트에 저장된다. 

( /var/lib/mysql => mysql의 기본 데이터 저장 경로 )

 

10) pull : 레지스트리에서 이미지 다운 받기

 

docker image ls 를 치게 되면 다음과 같이 로컬에 저장된 이미지들을 볼 수 있다. run 또는 create를 사용하면, 컨테이너에 필요한 이미지를 레지스트리(Docker Hub 같은)에서 자동으로 받아오기 때문에, 자주 사용할 일은 없지만, pull 명령어를 통해 레지스트리로부터 이미지를 받아올 수 있다. 

#기본 형식#
docker container pull [받아올 이미지][:옵션]

 

11) cp : 컨테이너와 호스트간 파일 복사

#기본 형식#
//컨테이너에서 호스트로 
docker container cp 컨테이너명:경로 경로

//호스트에서 컨테이너로 
docker container cp 경로 컨테이너명:경로

 

12) stats : 컨테이너 상태 확인 

#기본 형식#
docker container stats <컨테이너 이름 | 컨테이너 ID>

 

13) logs : 컨테이너 로그 확인

#기본 형식#
docker [container] logs <컨테이너 이름 | 컨테이너 ID> 
<-- 모든 로그 출력 

docker [container] logs -f <컨테이너 이름 | 컨테이너 ID>  
<-- 모든 로그 출력 & 실시간 로그 출력 

docker [container] logs -f --tail 5 <컨테이너 이름 | 컨테이너 ID> 
<-- 최근 로그 5개 출력 & 실시간 로그만 출력

 

 

 

 힘들지만 오늘도 해낸 나를 위한 한 마디, 

"꿈을 날짜와 함께 적어 놓으면 그것은 목표가 되고, 목표를 잘게 나누면 그것은 계획이 되며, 그 계획을 실행에 옮기면 꿈은 실현되는 것이다", Grag S, Raid

 

"불투명한 미래지만, 차근차근 하나씩 헤쳐나가자. 현재에 충실하게, 확신을 갖고"