AI 부트캠프/챕터4(12.05~12.27)

TIL 57

musukie 2024. 12. 6. 11:51

Docker Container 명령어

Docker Container 명령어에 대해 더 살펴보자.

cd ~
mkdir nodejsapp
cd nodejsapp
vi app.js # 테스트용 nodejs 앱

위의 코드까지 실행하면 터미널 창이 텍스트를 편집할 수 있는 상태가 된다. 넣고 싶은 내용을 넣어주고 ESC 키를 누르고 :wq를 입력하고 엔터 치면 된다.

vi Dockerfile # 새로운 도커 이미지를 위한 Dockerfile

위의 코드도 마찬가지로 내용을 채우고 ESC 키를 누르고 :wq를 입력하고 엔터 치면 된다.

docker buildx build -t node-test:1.0 . # 1.0 태그를 추가하여 node-test라는 이미지를 빌드

위의 코드를 통해, 우리는 이 애플리케이션은 1.0이라고 부를 것이다. 위 명령어를 실행하면, Docker 파일에 있는 명령어들을 순차적으로 실행해서 우리만의 Image를 만들게 된다. 실행되는 과정을 보면 app.js 파일을 복사하는 것을 확인할 수 있다.

docker images | grep node-test  # 빌드 완료한 이미지 보기

위의 코드를 통해 빌드 완료된 이미지를 확인할 수 있다.

docker image history node-test:1.0 # 1.0으로 태그 추가한 이미지의 Dockerfile history

위의 코드를 통해 Image의 내용을 확인할 수 있다. 우리가 설치한 것, app.js를 복사한 다음, 6060번 포트를 연 것 등을 눈으로 볼 수 있다.

docker run -itd -p 6060:6060 --name=node-test -h node-test node-test:1.0
docker ps | grep node-test
curl http://localhost:6060

위의 명령어로 실행시킬 수 있다. 첫 번째 명령어로 실행시킨 후, 두 번째 명령어로 확인하면, 실행되고 있음을 확인할 수 있다. 마지막 명령어를 통해 6060번 포트에서 어떤 일이 일어나고 있는 지도 확인할 수 있다.

 

즉, 이는 우리가 만들었던 nodejsapp을 통해 확인한 것이다.

docker logs node-test

위의 명령어를 통해 node-test의 로그를 확인해보면, 파일 내용이 나타난다.

docker run 에서 자주 사용하는 옵션

  • -d : detached mode; 백그라운드 모드. 기다리지 않고, 뒤에서 실행되는 모드
  • -p : 호스트와 컨테이너의 포트를 연결(포워딩)
  • -v : 호스트와 컨테이너의 디렉토리를 연결(마운트)
  • -e : 컨테이너 내에서 사용할 환경변수 설정
  • -name : 컨테이너 이름 설정
  • -rm : 프로세스 종료 시 컨테이너 자동 삭제
  • -ti : -i 와 -t 를 동시에 사용한 것으로 터미널 입력을 위한 옵션
# 컨테이너에서 실행 중인 프로세스 조회
docker top node-test

# 컨테이너에 매핑된 포트 조회
docker port node-test

# 컨테이너 리소스 통계 출력 (1회)
docker stats node-test --no-stream

# 컨테이너 리소스 통계 출력 (스트림)
docker stats node-test

위의 코드는 실행 중인 Container의 내용을 좀 더 살펴보는 명령어다. 컨테이너 리소스 통계에서는 CPU나 메모리를 얼마나 사용하고 있는 지 등을 확인할 수 있다. 실시간으로 어떻게 변하는지 확인하려면 --no-stream을 빼고 명령어를 치면 된다.

로그 확인

이제 실행 중인 애플리케이션의 로그를 확인해보자.

# 표준 출력(stdout), 표준에러(stderr) 출력
docker logs node-test

# 로그를 계속 출력
docker logs –f node-test

첫 번째 명령어를 실행시키면 이 때까지 실행시킨 로그가 모두 출력된다. 두 번째 명령어는 실시간으로 로그가 계속 출력된다.

# 출력된 로그는 파일로 관리되기 때문에 HostOS 의 disk 를 사용
docker info | grep -i log

출력된 로그는 파일로 관리되기 때문에 HostOS 의 disk 를 사용한다. (강의에서는 Windows 기준으로 진행된다.)Windows 운영체제 기준으로, 이 disk는 Ubuntu 22.04의 특정 디렉토리에 저장되고, logging driver는 json 형태로 저장되고, log에는 이러이러한 것들을 저장한다는 것을 확인할 수 있다.

Docker Container 내부 확인

Docker Container 내부를 확인해보자.

# 컨테이너 내부 확인
docker inspect node-test

위의 명령어를 실행해도 되고, docker container inspect node-test 라고 명령어를 쳐도 된다. container를 생략할 수 있다는 뜻이다. 이 명령어를 통해 어떤 것이 실행되고 있는지(ID), 실행되고 있는 상태(State) 등을 확인할 수 있다.

# 터미널1, 도커 상태 확인
docker stats

# 터미널2, 도커 프로세스 이벤트 확인
docker events

# 터미널3, docker start
docker stop node-test
docker ps –a
docker start node-test

# 
docker pause node-test
docker unpause node-test
docker ps -a

첫 번째 명령어로는 도커 상태를 확인할 수 있다. 두 번째로는 이 Docker Container가 중지, 다시 시작, 종료되거나 하는 등의 과정을 확인할 수 있다. 세 번째는 node-test라는 Container를 종료시키고, 종료됐다는 것을 확인하고, 다시 node-test라는 Container를 시작시켰다. 네 번째는 node-test라는 Container를 일시 중지시키고, unpause를 통해 다시 시작하고, 그 상태를 확인하고 있다.

Docker 종료

이제 Docker를 종료시켜보자.

docker exit code
  • 0 : Docker Process가 수행해야 할 모든 Command 또는 Shell을 실행하고 정상 종료
  • 255 : Docker Image, 즉 Docker File에 정의된 EntryPoint 또는 CMD가 수행이 완료되었을 경우 발생
  • 125 : Docker run 명령어의 실패로 실제 docker process가 기동되지 않음
  • 126 : Docker Container 내부에서 Command를 실행하지 못할 경우 발생
  • 127 : Docker Container 내부에서 Command를 발견하지 못하였을 경우 발생
  • 137 : kill -9로 인해 종료 됨
  • 141 : 잘못된 메모리 참조하여 종료 됨
  • 143 : Linux Signal로 정상 종료 됨
  • 147 : 터미널에서 입력된 정지 시그널로 종료 됨
  • 149 : 자식 프로세스가 종료 되어 종료 됨

그 밖의 명령어

Docker Container 리스트를 확인해보자.

# 현재 실행 중인 것만
docker container ls
# 중지된 컨테이너를 포함하여 모든 컨테이너 리스트 확인
docker container ls -a

-a를 붙여주면 종료된 Container까지 모든 리스트가 나오게 된다.

 

종료된 Container들은 정리가 돼야 메모리 disk를 차지하지 않게 된다.

# 실행 중이 아닌 모든 컨테이너를 삭제
docker container prune

위의 명령어는 이들을 한번에 정리하는 명령어다. 정말 삭제할 건지 한 번 더 물어보는 구문이 뜨고, y를 치면 삭제된다.

# 태그가 붙지 않은(dangling) 모든 이미지 삭제
docker image prune

# 남아 있는 이미지 리스트 확인 – 실행 중인 컨테이너의 이미지 등
docker image ls

해당 image로 만들어진 모든 container가 종료됐다면, 위의 명령어를 통해 해당 image도 삭제할 수 있다. 즉, 사용하지 않는 image를 삭제하는 것이다. 이 또한 정말 삭제할 건지 한 번 더 물어보는 구문이 뜨고, y를 치면 삭제된다. 그러나 태그가 붙어있거나 현재 실행 중인 container가 있는 image는 남아있게 된다.

 

Docker 리소스를 일괄적으로 삭제해보자.

# 사용하지 않는 도커 이미지, 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제
docker system prune

위의 명령어를 치면, 나중에 배우게 되겠지만, image를 생성하는 중간에 사용했던 cache들과, Image와 Container를 실행하기 위해 사용했던 수많은 찌꺼기들을 삭제할 수 있다. 위의 명령어를 실행시키면 아래와 같은 경고 문구가 뜬다.

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - unused build cache

각각은 '종료된 컨테이너들', '어떤 컨테이너에서도 사용되지 않는 네트워크들', '태그가 붙어있지 않은 고아 이미지들', '이미지 빌드 과정 중에 생긴 고아 빌드 캐시들'을 삭제하게 된다는 의미다.

 

우리는 이번 장에서 CI/CD가 무엇인지, Docker 사용법, Docker Image와 Container에 대해 알아보았다. 다음 장에서는 CI/CD 예제를 실행시켜봄으로써, 우리가 만들었던 Spring 앱이 어떻게 CI/CD를 통해서 실행되는 지를 살펴볼 것이다.

(그런데 나는 Spring 앱을 만든 적이 없다. 어떻게 강의가 진행될까?)

'AI 부트캠프 > 챕터4(12.05~12.27)' 카테고리의 다른 글

TIL 61  (1) 2024.12.13
TIL 60  (1) 2024.12.11
TIL 59  (0) 2024.12.10
WIL 9  (1) 2024.12.06
TIL 56  (0) 2024.12.05