우리네 장

[ Docker ] 기본적인 도커 클라이언트 명령어 알아보기 본문

배포 관리 도구/Docker

[ Docker ] 기본적인 도커 클라이언트 명령어 알아보기

qpmi1zm29 2023. 2. 13. 21:58

- 도커 이미지 내부 파일 구조 보기

docker + run + < image name > + [ ls ]

위 명령어에서 네 번째 ls 는 디렉토리의 구조를 조회하는 명령어 이다.

네 번째에 명령어가 추가적으로 기입 되었을 때 의미는 " 기존의 이미지의 실행 명령어를 무시하고 네 번째 기입된 명령어를 컨테이너에서 실행해라 " 는 의미이다.

ex. docker run Alpine ls 

 

그러나 docker run hello-world ls 는 실행가능하지 않다는 에러가 출력된다. 그 이유는 hello-world 이미지에는 ls 명령을 실행할 수 있는 실행 파일이 없기 때문이다.

> 이미지에 따라서 실행할 수 있는 명령어가 다 다르다.

 

 

 

- 컨테이너들 나열하기

docker + ps + [ -a ]

-a는 all의 약자로 현재 실행 중이지 않은 컨테이너 또한 출력해 준다.

원하는 항목만 보기 위해서는 format을 지정해 주어야 한다.

docker ps --format 'table{{.Names}} \t table{{.Image}}'

: ps 출력 항목 중 컨테이너의 이름과 사용한 이미지 명만 출력되게 된다.

( 가운데 탭은 보기 편하라고 필요한 것이다. 없어도 된다 )

 

 

 

 

-도커 컨테이너의 생명주기

[ 생성 - 시작 - 실행 - 멈춤 - 삭제 ]

 

docker run <image name> 은

docker create <image name> + docker start <container name or id> 이다.

create 시 이미지의 스냅샷을 컨테이너의 하드 디스크로 옮기고, start 시 이미지의 프로그램 실행 명령어를 컨테이너에 전달하여 커널을 통해 프로그램을 실행 시킨다.

 

docker start 시 -a ( attach ) 옵션을 포함하면, 단지 실행만 시키고 터미널이 종료되는 것이 아니라 실행 한 후의 결과도 터미널에 보여주게 된다. 

ex. docker start  -a 123123 <-- hello-world 이미지로 생성된 컨테이너

 

 

 

 

-docker stop vs docker kill

stop과 kill은 모두 실행 중인 컨테이너를 종료시키는 명령어 이다. 

둘은 어떤 차이일까??

stop은 gracefully 하게 실행 중이던 명령어를 모두 실행 한 뒤에 종료하는 방법이고,

kill은 그런 거 없이 명령어 실행 시 바로 종료하는 방법이다.

 

stop과 kill은 모두 컨테이너 내부의 프로그램을 종료하기 위해 SIGKILL 명령어를 전달하는데

stop은 SIGKILL 전에 SIGTERM 명령어를 먼저 주어서 Grace Period ( 정리하는 시간 )을 갖는다.

 

 

 

 

 

- 컨테이너 삭제하기

컨테이너 삭제 및 prune 명령어 실행 시 종료되지 않은 컨테이너는 대상이 되지 않는다.

따라서 운용에 더 안전하게 컨테이너를 삭제할 수 있다.

docker rm <catainer id / name>

docker rm 'docker ps -a -q' : 프로세스 목록에 노출된 전체 컨테이너 삭제하기 

docker rmi <image id> : 이미지 삭제하는 명령어

docker system prune : 도커 컨테이너, 이미지, 네트워크 등을 한 번에 정리하는 명령어

 

 

 

 

 

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

docker + exec + <container id/name> + [ 명령어 ]

위 명령어는 run과 같은 효과를 갖는다. 하지만 둘의 차이점은 run은 새 컨테이너를 생성해서 명령어를 실행하고, exec는 실행 중인 컨테이너에 명령어를 전달하여 실행한다는 점이 차이점이다.

 

 

 

 

 

 

- 레디스를 이용한 컨테이너 이해

레디스 또한 도커 엔진 처럼 클라이언트와 서버로 나누어 실행할 수 있으며, 클라이언트에서 명령어를 입력하여 서버에 이벤트를 전달할 수 있다.

이를 위해 도커를 이용해 레디스를 구동하기 위하여 'docker run redis' 를 실행한 뒤, 

새로운 터미널 창을 통해 redis-cli 를 커맨드 명령어로 실행하게 되면 connection 에러가 발생하게 된다. 

> 왜냐하면 서버는 컨테이너 내부에서 동작하고 있으나, 클라이언트가 컨테이너 바깥에서 명령어를 전달하기 때문이다.

>> 레디스 클라이언트 또한 컨테이너 내부에서 실행되어야 정상적으로 명령어가 전달된다.

>>> docker exec  -it <container id/name> redis-cli 로 클라이언트에 접근하면 된다.

 

이때 -it는 무엇일까?? interactive와 terminal의 합성축약어로 계속해서 터미널과 상호작용을 하기 위해 필요한 옵션이다.

해당 옵션을 빼고 실행하면 exec 명령어로 redis-cli를 실행하고 나서 바로 터미널을 종료시킨다.

 

그러나 -it를 적용하면 redis-cli를 유지하여 레디스 서버에 클라이언트로 명령어를 전달할 수 있다.

ex. set value1 hello

 

 

 

 

 

 

 

-실행중인 컨테이너에서 터미널 생활 즐기기

docker + exec + -it +  <container id/name> + sh

해당 컨테이너 내부에서 돌아가고 있는 서버의 shell 스크립트를 실행하고, -it 옵션으로 지속적인 터미널 사용이 가능해지므로 타 ssh 로 접근한 서버처럼 커널을 통한 작업이 가능해진다.