도커는 도커 클라이언트를 통해서 도커 서버에 명령어를 전달하고 기능을 실행한다. 도커의 기본 명령어로 컨테이너 생성, 시작, 삭제 등을 연습해보자.
$ docker create <이미지 이름>
도커 이미지를 이용해 도커 컨테이너를 생성한다. 만약 해당 이미지가 local에 없다면 도커 허브에서 이미지를 pull 한 다음 컨테이너를 생성한다.
docker create
명령어는 도커 컨테이너를 생성하고 생성된 컨테이너의 ID 값을 리턴해준다. 그리고 이 명령어는 컨테이너를 생성하기만 할 뿐 동작시키지는 않는다. 따라서 docker ps
명령어를 사용했을 때 해당 도커의 ID를 가진 컨테이너가 나오지 않는다.
`8797d6c4b02d` 는 방금 생성한 redis의 컨테이너가 아니다. redis의 컨테이너의 ID(`3db01c...`)와 비교해 보면 알 수 있다.
$ docker start <컨테이너 ID/이름>
도커를 생성하고 나서는 도커를 실행해주어야 한다. 이때는 도커 컨테이너의 이름 혹은 ID 값을 이용한다.
docker ps
명령어를 사용했을 때 redis 이미지의 컨테이터가 실행 중임을 알 수 있다.
$ docker run <이미지 이름>
docker run
명령어는 도커 이미지로 부터 컨테이너를 생성하고 실행한다. 즉, docker creeat
+ docker start
의 결과라고 볼 수 있다. 따라서 docker run
명령어를 사용하면 생성과 동시에 실행하기 때문에 docker ps
에서 생성되고 실행중인 컨테이너를 볼 수 있다.
$ docker run <이미지 이름> ls
도커 이미지의 내부파일을 보기 이전에 도커 이미지에 대해 알아야한다. 도커 이미지에는 실행 명령어와 파일 스냅샷이 들어있다. 이중에 파일 스냅샷은 해당 어플리케이션 설치에 필요한 파일과 디렉터리를 복사한 것이다. 위의 명령어는 파일 스냅샷에 들어있는 파일의 ls(list)를 보기 위한 명령어다. alpine 이미지를 이용해서 실습해보면 다음과 같은 결과를 볼 수 있다. (이미지 내부 파일을 본다라고 표현하는 것 보다 컨테이터 내부 파일을 본다라는 말이 더 맞는 말이 아닌가 생각한다.)
위 명령어는 docker run
명령어에 ls
명령어를 추가해준 것이기 때문에 컨테이너 또한 생성 및 실행된다. 아래의 사진에서 사용한 docker ps --format
명령어는 원하는 정보만 화면에 띄우는 명령어다.
$ docker stop <컨테이너 이름/ID>
위 명령어는 진행중인 프로세스에 SIGTERM
을 보내서 프로세스가 종료됨을 알린다. 그후 SIGKILL
을 보내서 컨테이너를 중지시킨다. 따라서 해당 컨테이너의 작업을 중단하고 나서 종료한다. 이는 리눅스의 kill <PID>
와 같다.
$ docker kill <컨테이너 이름/ID>
위 명령어 또한 진행중인 컨테이너를 멈추게 한다. docker stop
과의 차이는 SIGTERM
없이 바로 컨테이너가 멈춘다는 점이다. 즉, 시스템 종료 보다는 강제 종료에 가깝다. 따라서 리눅스의 kill -9 <PID>
와 같다.
$ docker rm <컨테이너 이름/ID>
실행중인 컨테이너는 삭제가 불가능하다.
$ docker rm `docker ps -a -q`
위 명령어는 중지된 컨테이너들을 삭제한다. docker ps -a-q
는 컨테이너의 ID 만 반환한다. 실행중인 컨테이너는 삭제가 불가능 하므로 ERROR를 반환하지만 중지된 컨테이너들은 ERROR 반환 없이 삭제된다.
$ docker rmi <이미지 이름>
도커의 이미지는 하드디스크 용량을 많이 차지한다. 사용하지 않는 이미지가 있다면 수시로 정리해 주는 것이 좋다.
참고