본문 바로가기
IT Security/Docker & Kubernetes

[Docker & Kubernetes] 6. Docker 매우 기본적인 명령어 사용법2

by Rosmary 2022. 5. 24.
728x90
반응형

 

 

 

 

 

지난 포스팅에 이어, 계속 Docker의 기본 명령어 사용법에 대해 작성하려 한다. 지난 번에는 Docker 이미지를 공식 저장소에서 다운로드받고, 컨테이너 생성과 실행을 진행하며, 컨테이너와 이미지에 대한 모니터링 값이 어떻게 변하는지 확인해봤다. 이번 포스팅에서는 실행한 컨테이너의 중단, 재시작, 삭제, 이미지 삭제까지 진행해보려 한다.

 

1. 실행중인 컨테이너 중단 - docker stop {실행중인컨테이너이름 or ID}

지난 번 ubuntu 이미지를 컨테이너로 생성하고 실행할 때 컨테이너 이름을 ubuntu_test2로 지정한 것이 있다. 이제 필자는 구동중인 ubuntu_test2 컨테이너를 중단시킬 것이다.

 

필자가 VM 리눅스를 재부팅하는 바람에 컨테이너를 다시 실행해서 Status 값이 저 모양이다. ID 값도 변경되었으니 참고하자.

 

ubuntu_test2 컨테이너를 삭제하면, docker ps에서 나타난 2개의 컨테이너 중 web_test만 docker ps에 남아 있는 것이 확인된다. 이는 다른말로 하자면 컨테이너에 부여된 프로세스를 회수했다는 것이다. 더 쉬운 말로 설명하자면, ubuntu_test2가 메모리에서 삭제되었다는 것이다. ps -ef 명령어로 ubuntu_test2와 web_test의 프로세스를 확인해보자.

 

이 명령어를 그림으로 나타내면 아래와 같다.

 

Process 영역은 서버의 Memory라고 생각하면 된다.

 

 

 

중단된 컨테이너를 다시 시작하려면, 단순히 docker start 명령어로 실행하고자 하는 컨테이너를 지정해주면 된다. 이 부분은 이전 포스팅에서도 언급한 내용이니 바로 넘어가고...

 

 

2. 컨테이너 삭제 - docker (container) rm {중지,생성된 컨테이너이름 or ID}

 

이제 중단한 ubuntu_test2를 삭제해보자. 삭제 전, 프로세스에 올라오지 않은 컨테이너를 확인하기 위해 docker ps -a 명령어를 입력해보자. 실행중인 web_test(nginx)를 포함하여 중단된 ubunt_test2와 이전에 만든 컨테이너 2개도 존재하고 있음을 확인할 수 있다.

 

 

참고로 ubuntu_test2와 ubuntu_test의 exited 코드가 각각 137과 0으로 다른 것을 확인할 수 있다. 137은 Out of Memory, 즉 프로세스 할당이 종료되면서 메모리에서 컨테이너가 삭제되었기 때문이고, 0은 프로세스의 정상 종료를 의미한다. 

 

중단된 컨테이너는 docker (container) rm 이라는 명령어를 사용한다. rm이 remove의 약자라는 것을 리눅스를 하시는 분들이라면 대부분 아실테니 굳이 이 의미까지 설명하지는 않아도 될 듯 하다. 가운데의 container는 생략이 가능하다.

 

#  docker container rm ubuntu_test2

 

docker ps -a 결과에 나타났던 컨테이너 ubuntu_test2가 사라진 것이 확인된다. 아래의 그림과 같이 생성했던 컨테이너를 docker 서버 내에서 완전히 삭제한다.

 

 

이제, 구동중인 web_test 컨테이너를 삭제해보자. ubuntu_test2와는 달리 에러가 발생하며 삭제를 할 수 없다고 출력된다.

 

 

에러 로그를 잘 읽어보면 이유를 알 수 있는데, 삭제하려는 web_test는 구동중, 즉 프로세스를 할당받은 녀석이라 삭제가 어렵다는 말이다. 다른 말로 하자면 삭제하려면 서비스 구동부터 멈춰야한다는 말이다. 서비스 구동을 멈추고 다시 삭제를 진행해보자.

 

 

방금 전과 달리, 삭제가 잘 이루어짐을 확인할 수 있다. 즉, docker rm 명령어는 프로세스에 등록되지 않은 컨테이너만 삭제할 수 있다는 말이다.

 

*  추가 팁

이제, 남아있는 녀석들도 삭제를 진행해보자. 그런데, 이를 일일이 삭제하려니 여간 귀찮은 일이 아니다. 지금이야 남아있는 컨테이너가 2개 뿐이지만 실제 Docker를 운영하면 발생하는 컨테이너 수가 관리가 어려울 정도로 많아질텐데, 사용하지 않는 컨테이너를 한 번에 정리할 수 있는 방법은 없을까? 

 

Docker 명령어는 리눅스와 상당히 유사해서, 리눅스스럽게 명령어를 조합해서 사용하는 것이 가능하다. 

먼저, 남아있는 컨테이너 중 Exited 상태로 표시되는 컨테이너의 ID만 화면에 출력해보자. 아마 Bash를 조금 다루어보신 분들이라면 아마 아래와 같이 명령어를 작성하지 않을까 싶다.  

 

 

docker ps 명령어는 특이하게도 filter라는 옵션을 통해 특정 상태의 컨테이너만을 추출할 수 있도록 하는 기능이 있다. 필자가 추출하려는 컨테이너는 status가 Exited로 표시된 컨테이너이므로, 아래와 같이 명령어를 작성하면 된다.

 

#  docker ps -a --filter='status=exited'

 

여기서 컨테이너의 ID 값만 추출하는 옵션으로 -q가 있는데, 이 옵션을 사용하면 잡다한 정보는 모두 제외한 채 filter 조건에 맞는 컨테이너 ID 값만 돌려준다.

 

#  docker ps -a -q --filter='status=exited' 

awk 명령어를 grep 으로 사용하는 것보다 훨씬 편하다.

 

이 값을 변수화하여 docker rm 명령어에 집어넣으면 Exited 상태의 모든 컨테이너를 삭제할 수 있다.

 

# docker rm $(docker ps -a -q --filter='status=exited')

 

남아있는 created도 연습 겸, 위와 같이 필터를 적용해서 삭제해보자. 참고로 다른 필드도 조건을 달아 검색하는 것이 가능하다. 한 가지 주의할 점은 names의 경우 filter 키 값을 name으로 지정해야 한다는 것이다.

 

 

생성한 모든 컨테이너가 사라졌다. 이제 이미지의 삭제에 대해 알아보자.

 

 

3. Docker 이미지 삭제 - docker image rm {이미지이름}:{태그} or docker rmi {이미지이름}:{태그}

 

Docker의 이미지 삭제 역시 어렵지 않다. docker rmi 또는 docker image rm 명령어를 사용하는데, 둘 중 어느 것을 써도 상관없다. 참고로 rmi는 remove image의 약자다. 참고로 이미지의 태그는 명시하지 않으면 Docker 서버에 최신 버전(latest)이 존재하는 경우 최신 버전을 삭제한다.

 

필자는 맨 처음 다운로드 받은 ubuntu 이미지를 Docker 서버에서 삭제하려 한다.

 

# docker rmi ubuntu:latest

 

필자가 지난 포스팅에서 받아놓은 nginx 이미지만 남아있는 것이 확인된다. 참고로 이미지 또한 이미지로부터 생성된 컨테이너가 존재하면 삭제가 되지 않는다. 따라서 이미지 삭제 전에는 해당 이미지로 만든 컨테이너를 모두 삭제하는 작업이 선행되어야 한다. 이 부분은 각자 테스트해보자. 크게 어렵지 않다.

 

 

 

 

4. 컨테이너 서비스의 재구동

 

이제 조금 더 서비스 관점에서 컨테이너를 생각해보자. 컨테이너는 하나의 서버에서 여러 서비스를 구동하기 위해 경량 가상화라는 기술을 적용한 것이라고 앞의 몇몇 포스팅에서 언급했다. 만약 필자가 Docker 서버에서 웹 서비스 nginx를 구동한다고 해보자. 이 컨테이너 내에는 웹 페이지 제작에 사용되는 html, css, javascript 등의 파일이 존재할 것이고 이들이 동작하기에 최적의 OS 환경 또한 구성되어 있을 것이다. 

 

하지만 웹 페이지가 리뉴얼되거나 기타 환경 설정 등이 변하는 경우도 있을 것이다. 간단히 설명하자면 크리스마스나 설날이 다가와서 그에 맞는 에디션을 일시적으로 적용하거나 그를 위한 OS 환경 변경 같은 것을 예로 들 수 있다. 이 경우, 변경이 발생하면 서비스를 재구동해야 하는 경우도 발생할 수 있다. 마치 서비스 config 변경 후 systemctl restart를 진행하는 것과 비슷하다고 생각하면 된다.

 

대부분의 컨테이너는 경량화를 위해 구동에 필요한 최소한의 파일들만 넣어놓는다. 따라서 어떤 컨테이너는 리눅스 기반으로 만들어진 컨테이너임에도 불구하고 명령어 사용(docker exec)이 불가능한 것도 존재한다. 그럼 이런 컨테이너들은 어떻게 재기동해야할까? 

 

이를 위한 명령어가 docker restart다. docker restart는 구동중인 컨테이너를 재시작하는 기능을 가지며 systemctl restart가 컨테이너에 적용된 것과 동일하다고 생각하면 된다. 테스트를 위해 남아있는 nginx 이미지로 web_test 컨테이너를 만들자. 단, 옵션으로 --publish=8888:80을 추가해주자(이 옵션은 다른 포스팅에서 다룰 예정이다).

 

#  docker create --name=web_test --publish=8888:80 nginx:latest

 

서비스가 정상적으로 올라갔다면 Docker 서버의 8888포트가 웹 서비스 포트로 작동한다. 아래의 명령어로 서버의 8888 포트가 개방되었는지 확인하고 웹 브라우저도 http://{Docker 서버 IP}:8888 접속을 진행해보자.

 

#  curl -v telnet://localhost:8888

 

지금 docker ps를 입력하면 nginx의 구동 시간이 적어도 2분 이상 지나있을 것이다. 이제 docker stop과 docker start 명령어 대신 docker restart를 진행해보자. 아마 docker ps로 나타나는 컨테이너의 실행 시간이 갱신 될 것이다.

 

필자가 nginx는 다뤄보지 않아서 뭔가 환경 변수를 건드릴만한 작업까지 진행하기에는 어려움이 많다.

 

docker restart 명령어를 그림으로 나타내면 아래가 적절할 듯 하다.

 


 

다음 포스팅에서는 docker run 명령어와 관련된 옵션, 그리고 docker 이미지를 공식 저장소에, 계정을 이용하여 등록하는 방법에 대해 포스팅하려 한다. 참고로 docker run 명령어의 옵션은 docker create 옵션과 동일한데, 그 이유에 대해서는 다음 포스팅에서 조금 더 자세하게 설명하는 것으로 하려한다.

 

 

 

 

 

 

Fin.

 

 

 

 

 

반응형

댓글