Chapter 2 - Command of Docker

권대규·2021년 7월 23일
2

docker-study

목록 보기
2/4

본 포스트는 Inflearn '따라하며 배우는 도커와 CI환경' 강의를 기반으로 작성되었습니다.

도커 실행 커맨드

docker run imagename

docker - 도커 클라이언트 언급
run - 컨테이너 생성 및 실행
imagename - 컨테이너를 위한 이미지

docker run imagename ls

위와 동일하지만 원래 이미지가 가지고 있는 시작 명령어를 무시하고 해당 커맨드(여기서는 ls) 실행

ex) docker run alpine vs docker run alpine ls

반면에 지난 번에 사용했던 hello-world image는 다음과 같은 오류가 발생하는 것을 확인할 수 있다.

이 이유는 Alpine 이미지 파일 스냅샷에는 ls를 사용가능하게 하는 파일이 있지만, hello-world 이미지 파일에는 ls를 사용가능하게 하는 파일이 존재하지 않기 때문.(executable file not found)

-> 즉 파일 스냅샷의 구성에 따라 사용 가능한 명령어가 상이

컨테이너 나열

docker ps

docker - 도커 클라이언트 언급
ps - process status


그냥 사용할 경우 현재 올라와있는 container가 없어서 아무것도 뜨지 않는다. Terminal 2개를 활용해서 실험해보자.

Alpine image에 대해서 ping 명령어를 활용해 지속적으로 container를 실행시켜놓고, docker ps를 찍어보면 아래와 같이 ps에 현재 실행중인 container 목록을 잘 확인할 수 있다.

이때 docker ps에 찍히는 정보들은 다음과 같다.

  1. CONTAINER ID: Container의 고유한 ID hash value, 실제로는 더욱 길고 일부분만 표출 (73f0e2551984)
  2. IMAGE: Container 생성 시 사용한 도커 이미지 (alpine)
  3. COMMAND: 컨테이너 시작 시 실행될 명령어(ping localhost)
  4. CREATED: 컨테이너가 생성된 시간(6 seconds ago)
  5. STATUS: 컨테이너의 상태 (Up 5 seconds)
  • Up: 실행중
  • Exited: 종료
  • Pause: 일시정지
  1. PORTS: Container가 개방한 포트와 호스트에 연결한 포트(여기서는 따로 없음)
  2. NAMES: Container의 고유한 이름, Container 생성 시 --name 옵션으로 따로 설정하지 않으면, 도커 엔진이 임의로 형용사와 명사를 조합해서 설정. 중복이 불가능하며 rename 명령어로 이름을 바꿀 수 있다.

추가로 꺼진 컨테이너와 같은 모든 컨테이너를 띄우고 싶으면
docker ps -a 명령어를 사용하면 된다.

도커 컨테이너의 생명 주기

위와 같은 생성주기를 거친다.

docker run 명령어는 docker create와 docker start 명령어로 나뉠 수 있다.

docker create

docker create은 image의 파일 스냅샷을 컨테이너에 할당된 하드디스크로 담아주어 컨테이너를 생성하는 역할을 한다.

docker start

하드디스크에 이미지 파일 스냅샷이 담기면, 실행해야할 명령어를 컨테이너를 시작하고, 시작 시 실행될 명령어를 실행해준다.

이전에 사용했던 hello-world image를 가지고 실습을 해보면 다음과 같다.

create시 아래 나오는 값들은 컨테이너의 아이디이므로 해당 아이디를 활용해 start를 시켜보았지만, 제대로 실행이 안됨을 확인할 수 있다. attach라는 option을 덧붙여줘야 잘 실행한다. 그리고 굳이 컨테이너의 아이디를 전부 입력할 필요 없이, 앞의 일부만 입력해도 알아서 잘 실행된다고 한다.

잘 실행됨을 확인할 수 있다.

여기서 attach라는 option은 실행하고 나오는 output들을 화면에 print해주는 역할을 한다고 한다.

docker stop vs docker kill

docker stop과 docker kill은 모두 container를 중단하는 맥락을 갖고 있는 명령어들이다. 우선 alpine image와 ping 명령어를 활용해서 해당 명령어들 실습을 진행해보겠다. stop의 경우에는 아래와 같이 이루어지는데, 어느정도 시간이 지나고 난 후 멈추는 것을 확인할 수 있다.

docker kill은 docker stop과 다르게 명령어를 입력하자마자 바로 container가 중지됨을 확인할 수 있다.

stop과 kill은 둘 다 container를 중지시키는 command지만, stop은 graceful하게 중지시키고, kill은 어떤 것도 기다리지 않고 바로 container를 중지시킨다.

예를 들면, container가 어떠한 메세지를 보내고 있다고 하면 stop은 메세지 보내는 명령어가 완료될 때까지 기다렸다가 container를 종료시키고 kill은 바로 종료시킨다는 것이다.

명령어의 관점에서 보면 docker stop은 sigterm이라는 명령어를 보내 현재 프로세스들을 정리하는 시간인 grace period를 주고, 이 과정이 완료되면 sigkill 명령어를 통해 container를 중지하지만 docker kill은 바로 sigkill 명령어를 사용한다고 한다.

docker rm

docker rm은 컨테이너를 삭제하는 커맨드이다. 이때 유의할 점은 중지되어있는 컨테이너만 삭제 할 수 있다는 것이다.


우측에 docker ps -a를 통해 모든 container들을 확인한 후, 가장 끝단에 있는 container를 삭제해주니 docker ps -a를 사용해도 목록에서 나오지 않음을 확인할 수 있다.
이때 모든 container들을 삭제하는 커맨드는 아래와 같다
docker rm `docker ps -a -q`
여기서 유의해야 할 점은 따옴표가 아니라 백틱을 사용한다는 점이다. 아래 shell을 보면 따옴표 썼다가 삑난 것은 물론, 제대로 커맨드를 입력해서 모든 컨테이너를 잘 삭제했음을 확인할 수 있다.

docker rmi imageid

docker rm + image로 이미지를 삭제하고 싶을 때 사용하는 커맨드이다.

docker system prune

모든 컨테이너, 이미지, 네트워크를 삭제하는 커맨드이다. 하지만 실행중인 컨테이너에는 어떠한 영향도 끼치지 못한다고 한다.

실행중인 컨테이너에 명령어 전달

docker exec containerid

컨테이너를 실행할 때 명령어를 입력해주는 것이 아니라, 실행중인 컨테이너에 명령어를 전달하는 커맨드이다. alpine을 활용해서 실습을 해보면 다음과 같다.

실행중인 컨테이너에서 터미널 사용하기

docker exec -it containerid sh

명령어 란에 sh를 사용하면 shell이 켜져서 컨테이너 내부에서 터미널을 사용할 수 있다.

이때 exec가 아니라 run을 사용하는 것도 가능하고, 터미널 환경에서 나오려면 exit를 입력하거나 Ctrl + D를 입력하면 된다.

아무래도 run같은 경우에는 새로 생성하는 command이다 보니, image를 입력해야 하는 것 같아 alpine으로 변경해서 해보니 잘 실행되었다.

추가로 -it option에 대해서 설명하자면

-i는 -interactive=false를 줄인 것으로 표준 입력을 활성화한다는 옵션이라고 한다.

-t는 -tty=false로 ttymode를 사용한다는 옵션으로 이 옵션을 사용하지 않으면 명령을 입력만 가능하고 셸이 표시되지 않는다고 한다.

profile
글많은 개발자

0개의 댓글