우리네 장
[ Docker ] 기본적인 도커 클라이언트 명령어 알아보기 본문
- 도커 이미지 내부 파일 구조 보기
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 로 접근한 서버처럼 커널을 통한 작업이 가능해진다.
'배포 관리 도구 > Docker' 카테고리의 다른 글
[ Docker ] 배포된 image, rebuild 하기 (0) | 2024.03.06 |
---|---|
[ Docker ] Dockerfile을 빌드와 실행으로 나눠보자 (0) | 2023.03.09 |
[ Docker ] 도커 컴포즈 개념 알기 (2) | 2023.03.02 |
[ Docker ] Dockerfile로 이미지 생성과 컨테이너 실행하기 (0) | 2023.02.28 |