[따라하며 배우는 도커와 CI환경] 2. 기본적인 도커 클라이언트 명령어
기본적인 도커 명령어를 알아보자!
✔️ 이미지 내부 파일 시스템 구조 보기
이미지 내부 파일은 어떻게 확인할 수 있는지 알아보자.
$ docker run <이미지 이름> ls
위의 명령어를 통해 내부 파일 목록을 확인할 수 있다.
각각의 의미를 살펴보자.
- docker: 도커 클라이언트 언급
- run: 컨테이너 생성 및 실행
- 이미지 이름: 이 컨테이너를 위한 이미지
- ls: 원래 이미지가 가진 시작 명령어 대신 이 커맨드가 실행됨
기본적으로 docker run <이미지 이름> 을 실행하면 이미지가 가지고있는 시작 명령어가 실행된다.
그러나 이미지 이름 뒤에 ls 와 같이 커맨드를 추가하여 docker run <이미지 이름> <명령어> 를 실행하면, 시작 명령어를 무시하고 커맨드를 실행하게 된다.
alpine 이라는 이미지의 내부 파일 구조를 확인해보자.
ex) $ docker run alpine ls
해당 명령어를 통해, 이미지의 기본 커맨드가 무시되고 ls 명령어가 실행된 것을 확인할 수 있다.
다만, 해당 이미지에 이 커맨드를 실행할 실행 파일이 존재해야만 정상적으로 동작할 수 있다.
위의 예시에서는 alpine 이미지 스냅샷 안에 ls를 사용할 수 있도록 하는 실행 파일이 존재했기 때문에 결과가 출력된 것이다.
만약 커맨드를 실행할 실행 파일이 존재하지 않는다면 어떻게 될까?
executable file not found (오류)
hello-world 이미지에는 ls 라는 명령어를 실행할 수 있는 파일이 존재하지 않아 위와 같은 오류가 나는 것을 확인할 수 있다.
✔️ 컨테이너들 나열하기
1️⃣ 실행 중인 컨테이너 보기
현재 실행중인 컨테이너들의 정보를 확인하고 싶다면 다음의 명령어를 이용할 수 있다.
$ docker ps
* ps: process status 약자
이 명령어는 다음과 같이 각 컨테이너에 대하여 7가지 정보를 보여준다.
필드명 | 의미 |
CONTAINER ID | 컨테이너의 고유한 아이디 해쉬값. 실제로는 더욱 길지만 일부분만 표출한다. |
IMAGE | 컨테이너 생성 시 사용한 도커 이미지. |
COMMAND | 컨테이너 시작 시 실행될 명령어. 대부분 이미지에 내장되어 있으므로 별도의 설정이 필요없다. |
CREATED | 컨테이너가 생성된 시간. |
STATUS | 컨테이너의 상태. 실행 중은 Up, 종료는 Exited, 일시정지 Pause. |
PORTS | 컨테이너가 개방한 포트와 호스트에 연결한 포트. 특별한 설정을 하지 않은 경우 출력되지 않는다. |
NAMES | 컨테이너의 고유한 이름. 컨테이너 생성 시 --name 옵션으로 이름을 설정하지 않으면 도커 엔진이 임의로 형용사와 명사를 조합해 설정한다. id와 마찬가지로 중복이 안되고 docker rename 명령어로 변경할 수 있다. $ docker rename original-name changed-name |
실행 중인 컨테이너가 없는 경우, 다음과 같이 항목 이름만 출력된다.
이번엔 컨테이너를 실행하고 확인해보자.
이번에는 실행 중인 컨테이너 정보가 나오는 것을 확인할 수 있다.
2️⃣ 원하는 항목만 보기
기본적으로 7가지 항목이 모두 출력되지만 원하는 항목만 지정할 수도 있다.
$ docker ps --format 'table{{.항목명}}구분자{{.항목명}} ... ' # 항목명의 첫 글자는 대문자, 나머지는 소문자
ex) $ docker ps --format 'table{{.Names}}\t{{.Image}}'
위의 예시 명령어를 실행하면, Name과 Image 항목을 탭(\t)으로 구분하여 보여준다.
3️⃣ 모든 컨테이너 보기
실행 중인 것 외의 컨테이너도 모두 확인할 수 있는 명령어는 다음과 같다.
$ docker ps -a
* a: all 약자
✔️ 도커 컨테이너 생명주기 관련 명령어
1️⃣ create
$ docker create <이미지 이름>
이미지를 통해 컨테이너를 생성하고, 이미지 내부에 있는 파일 스냅샷을 컨테이너 내부의 하드디스크에 넣어준다.
2️⃣ start
$ docker start <컨테이너 아이디/이름>
시작 시 실행될 명령어를 컨테이너에 넣어주고, 컨테이너를 실행한다.
단, 이 명령어를 사용할 경구, 컨테이너를 시작하지만 실행될 때의 출력을 화면에 보여주지는 않는다.
실행 화면까지 보기를 원할 경우 -a 옵션을 사용해야 한다.
$ docker start -a <컨테이너 아이디/이름>
* a: attach
3️⃣ run
$ docker run <이미지 이름>
run은 create 와 start를 합친 명령어이다.
4️⃣ stop
$ docker stop <컨테이너 아이디/이름>
stop과 kill 모두 실행 중인 컨테이너를 중지시키는 명령어지만, 진행 중인 작업까지 바로 중단시키는지의 여부에서 차이가 있다.
stop은 진행 중인 작업까지는 완료하고 컨테이너를 중지시키는 명령어다.
SIGTERM을 보내서 리소스 해제, 상태 저장 등 시스템 종료를 위해 프로세스가 정리하는 시간(Grace Period)를 주고,
SIGKILL을 보내서 컨테이너를 중지시킨다.
5️⃣ kill
$ docker kill <컨테이너 아이디/이름>
kill은 바로 컨테이너를 중지시키는 명령어다.
SIGTERM 없이 바로 SIGKILL을 보내서 즉각적으로 컨테이너를 중지시킨다.
6️⃣ rm
$ docker rm <컨테이너 아이디/이름>
중지된 컨테이너를 삭제한다.
실행중인 컨테이너는 삭제할 수 없으므로, 먼저 중지한 후에 삭제해야 한다.
모든 컨테이너 삭제
특정 컨테이너를 지정하지 않고, 모든 컨테이너를 삭제하고 싶은 경우에는 다음과 같은 명령어를 사용하면 된다.
$ docker rm `docker ps -a -q`
도커 이미지 삭제
$ docker rmi <이미지 아이디>
위의 명령어를 통해 도커 이미지를 삭제할 수 있다.
컨테이너, 이미지, 네트워크 삭제
$ docker system prune
위의 명령어는 한 번에 컨테이너, 이미지, 네트워크를 모두 삭제해준다.
다만, 실행 중인 컨테이너에는 영향을 주지 않는다.
도커를 쓰지 않을 때, 한 번에 모두 정리할 수 있어 편리하게 사용할 수 있다.
✔️ 실행 중인 컨테이너에 명령어 전달
위에서 docker run 을 이용하면 컨테이너를 생성 및 기본 명령어 혹은 특정 명령어를 실행할 수 있었다.
그렇다면 이미 실행 중인 컨테이너에 명령어를 전달하여 실행할 수 있는 방법은 무엇일까?
$ docker exec <컨테이너 아이디> <명령어>
ex) docker exec <컨테이너 아이디> ls
위의 명령어를 사용하면, 이미 실행 중인 컨테이너에 명령어를 전달할 수 있다.
[실습] 도커 환경에서 레디스 사용하기
이제 docker exec를 이용해서 도커 환경에서 레디스를 사용해보자.
1. 레디스 서버를 실행하기
$ docker run redis
2. 실행시킨 컨테이너에 redis-cli 명령어를 전달하여 redis 클라이언트 실행하기
$ docker exec -it <컨테이너 아이디> redis-cli
docker ps 를 통해 실행 중인 컨테이너 목록에서 해당 컨테이너의 아이디를 찾고, redis-cli를 실행한다.
이후에 redis 클라이언트에 명령어를 보낼 수 있다.
여기서 -it 옵션을 붙여주어야 명령어를 실행한 후에도 계속 명령어를 적을 수 있다.
종료 시에는 exit 혹은 Control+C(⌃C)를 입력한다.
만약 -it 옵션이 없다면❓
redis-cli를 실행하기만 하고 밖으로 다시 나와버린다.
[실습] 컨테이너를 쉘 환경으로 접근하기
위에서 exec -it 를 통해 명령어를 실행해보았다.
그런데 명령어를 전달할 때마다 매번 docker exec -it <컨테이너 아이디> <명령어> 를 입력하는 것은 꽤 번거로운 일이다.
이러한 문제를 해결하기 위해, 컨테이너 안의 쉘 환경으로 접속할 수 있다.
$ docker exec -it <컨테이너 아이디> sh
sh 외에도 bash, zsh, powershell 등을 사용할 수 있지만, 이미지의 환경(OS)에 따라 사용 불가능한 것도 존재하므로 일반적인 sh을 사용하자.
환경에서 나오려면 exit 혹은 Control+D (⌃D) 를 입력하면 된다.
참고