본문 바로가기

잡다/docker

[docker] cli 명령어들

 도커에서 이미지나 컨테이너와 관련된 작업을 하기 위해서는 docker client 상에 정의된 명령어를 이용해야 한다. 여기서는 중요한 명령어 몇가지를 정리한다.


도움말

docker --help

 각종 명령 뒤에 --help 을 덧붙이면 해당 명령에 대한 여러 옵션이나 도움말 등을 볼 수 있다.


docker run

 도커 이미지로부터 컨테이너를 생성한 후 실행하는 명령이다. run 명령은 생성(create) + 실행(start) 2개 명령이 조합된 것으로, 컨테이너를 쉽게 실행하기 위한 줄임 명령이라고 생각할 수 있다.

docker run [options] image_name [command]
  • options : 대상이 되는 이미지에 대해 적용할 옵션.
  • image_name : 다운로드 할 이미지 이름. https://hub.docker.com/ 에서 찾을 수 있다.
  • command : 실행할 커맨드 명령어.

 

options

옵션에는 다양한 것이 존재하는데, 일부만 살펴보면 다음과 같다.

  • -a : 컨테이너에서 입출력하는 내용을 보거나 쓸 수 있다. run 명령의 기본 옵션이다.
  • -it : 컨테이너 내부에서 입출력을 수행할 수 있다. ( i : 입출력, t : 포맷팅 ) 
  • -p : 컨테이너 내부 포트를 외부(로컬 컴퓨터) 에 노출하기 위한 명령이다.
    -p 노출포트:내부포트 형식으로 지정한다. -p 3000:8080 이면, 8080번 내부 포트를 내 컴퓨터 포트 3000과 연결.
  • -t : 태그를 지정한다. -t 도커ID/프로젝트명:버전 형태로 지정한다.
    이때 : 앞부분이 REPOSITORY, 뒷부분은 TAG가 된다.
    docker images을 통해 이미지를 열람한 모습.
  • -v : 도커 볼륨을 지정한다. 보통 docker-compose.yml 파일로 지정한다.

 

command

도커에서 이미지는 2가지 요소로 구성된다.

도커 이미지 = 퍄일 시스템 스냅샷 + 초기 실행 명령어

 docker run 또는 docker create을 이용하면 생성되는 도커 컨테이너에 대해 실행 명령어가 지정된다. 일단 컨테이너에 실행 명령어가 지정되면, 해당 컨테이너의 실행 명령어는 변경할 수 없다. 그런데 경우에 따라 이미지의 초기 명령어 대신 다른 명령어가 필요한 경우가 있다. 이 경우 command에 해당 명령을 넘겨 지정한다.

예시)

docker run busybox echo hi there  # hi there을 출력
docker run busybox echo bye there # bye there을 출력
docker run busybox ping google.com # google.com에 핑을 찍기
docker run -it busybox sh # 쉘을 상호작용 가능한 형태로 실행한다.

초기 지정된 커맨드를 덮어쓰기 위한 부분이라고 생각하면 된다.


docker start

이미지로부터 생성된 컨테이너를 시작하거나, 이전에 종료(stop 또는 kill) 했던 컨테이너를 다시 시작할 때 사용된다. 

docker start [-a] container_id
  • -a : docker run의 옵션과 유사. STDOUT/STDERR 등을 커맨드 창과 연결한다.

 기본적으로 docker start는 -a 옵션이 비활성화 되어 있다. 해당 옵션 없이 컨테이너를 시작하면, 컨테이너는 커맨드창에 자신의 컨테이너 id를 반환한다. -a 옵션이 있는 경우에만 컨테이너 실행 및 로그 기록 출력이 가능하다.

다음과 같은 컨테이너를 생각하자.

 현재 컨테이너는 busybox 이미지로부터 생성되었으며, google.com에 연속적으로 핑을 보내는 기능을 가진다. 이제 해당 컨테이너를 docker start을 통해 실행해보자.

 -a 옵션 없이 실행한 경우, 사용자가 해당 컨테이너를 실행할 때 사용한 컨테이너의 id를 반환한다. 이외의 ping 정보는 전혀 출력되지 않는다. 반면 해당 옵션이 있는 경우, ping 정보가 외부로 출력된다.

 다만 모든 상황에서 -a 옵션이 선호되지는 않는다. 로그 기록이 수없이 많이 수행된다면, 텍스트 입출력 자체가 일종의 오버헤드로 작용할 수 있기 때문이다. 필요한 경우에만 로그 기록을 보기 위한 명령도 존재하는데, logs 이다.


docker logs

 특정 컨테이너의 로그 기록을 출력하기 위한 명령이다. 기본적으로 이전까지 출력되었던 모든 로그 기록을 기록하고 있다가, 현재 명령이 수행되면 모든 기록을 출력하는 방식으로 동작한다. 과거에 컨테이너가 실행되었으나 로그 기록을 줄력하지 않은 적이 있다면, 해당 로그 기록들도 출력의 대상이 된다.

docker logs [options] container_id

  • -n number : 최대 출력 라인 수를 지정한다. logs 명령은 기존 모든 로그 기록을 출력하므로, 최대 출력될 로그의 개수를 지정해야 한다면 현재 명령을 이용한다.
  • --since / --until : 출력하고자 하는 시간을 제한할 수 있다.

여러가지 옵션을 적절히 활용하자.


docker create

특정 이미지로부터 컨테이너를 생성하고, 컨테이너의 id를 반환한다. 옵션의 경우 docker run과 상당 부분 겹친다.

docker create [options] image

예시) 


docker stop & docker kill

docker stop 및 docker kill은 현재 실행중인 컨테이너를 종료할 때 사용된다.

docker stop container_id
docker kill container_id

유사한 용도로 사용되는 명령이지만, 두 명령 사이에는 명백한 차이가 존재한다.

 docker stop은 통상적으로 도커 컨테이너를 종료할 때 사용되는 명령으로, SIGTERM 시그널에 기반하여 동작한다. 시그널이 프로세스에 도달하면 프로세스를 종료하기 전에 수행해야 하는 내용 저장, 자원 정리, 메시지 출력 등의 동작을 수행한 후 프로세스를 정상적으로 종료한다. 텍스트 문서 프로그램을 종료할 때 저장 여부를 묻는 창이 등장, 내용을 저장하고 끝내는 일반적인 상황과 유사하다.

 docker kill은 도커 컨테이너 프로세스를 바로 종료하는 명령으로, docker stop에서 수행했던 동작 없이 그저 프로세스 종료 자체만 수행한다. 따라서 이 명령을 이용하면 다음번 컨테이너 실행시 일부 문제가 발생할 수도 있다. 프로그램이 동작하지 않아 작업관리자를 통해 프로세스를 강제로 종료하는 경우와 유사하다.

 docker stop 명령은 10초동안 프로세스가 종료되지 않으면 docker kill을 수행한다. 따라서 컨테이너 프로세스를 종료할 때 확신이 없다면, 그냥 docker stop만 수행해도 전혀 상관 없다.

 를 들어 ping google.com을 수행하는 컨테이너를 생각해보자. ping 명령은 SIGTERM 명령이 동작하지 않는다고 알려져 있으므로, docker stop에 의한 SIGTERM 시그널에 반응하지 않아 10초 뒤 SIGKILL에 의해 종료된다.

 

stop 명령 이후 10초 정도를 세면 그제서야 컨테이너가 종료된다. 이는 SIGKILL 시그널에 의해 종료된 것이다.


docker build

 도커는 Dockerfile 이라는 설정 파일을 이용하여 이미지를 생성하는 기능을 제공한다. docker build을 이용하면 Dockerfile 설정에 따라 생성된 이미지를 나의 컴퓨터 내에 빌드할 수 있다.

docker build [options] path
  • options : 도커 파일을 기반으로 이미지를 빌드할 때 적용할 옵션들
  • path : 해당 도커 파일의 위치

다양한 설정이 존재하지만, 일부만 살펴보자.

  • -f 파일이름 : 반드시 파일의 이름이 Dockerfile일 필요는 없다. 기본적으로 build 명령은 Dockerfile 파일을 찾지만, -f 명령을 이용하면 다른 이름의 도커파일을 이용하여 빌드가 가능하다.
  • -t ID/프로젝트(Repository):태그 : 태그를 붙인다. 앞에서 설명한 태그를 붙이는 방식과 동일하다.

예시)

docker build . # 현재 폴더의 Dockerfile을 이미지로 빌드.
docker build -f Dockerfile.dev . # 현재 폴더의 Dockerfile.dev을 이미지로 빌드.
docker build -t blaxsior/test:latest . # 현재 폴더의 Dockerfile을 태그 붙여 빌드.

docker ps

실행했었던 도커 컨테이너( 프로세스 ) 를 열람한다.

docker ps
docker ps -a

-a 없이 명령을 실행하면 현재 실행중인 컨테이너만 표시된다. -a는 실행했었던 모든 컨테이너를 보여주는 옵션으로, 특정 컨테이너를 다시 실행하거나 삭제하는 등의 동작을 수행할 때 컨테이너의 id를 얻기 위해 주로 사용한다.

-a 없이 실행하는 경우. 현재 실행중인 도커 프로세스만 볼 수 있다.
-a 옵션을 추가한 경우. 이전에 실행되었던 모든 컨테이너 정보를 보여준다.


docker images

컴퓨터에 저장되어 있는 이미지들을 열람한다. 

docker images [options]

필요에 따라 옵션을 이용하면 된다.

 태그를 지정하지 않고 이미지를 빌드하면, 해당 이미지의 REPOSITORY 및 TAG 가 <none>으로 나타난다. 따라서 특별한 이유가 있는 것이 아니라면 빌드할 때 -t 옵션을 이용하여 명시적으로 태그를 지정하는 것이 좋아 보인다.


docker container / docker image

 각각 컨테이너 / 이미지와 관련된 동작을 수행한다. 현재 명령들은 수행할 수 있는 동작이 다른 명령들과 겹치는 부분이 많아 --help 을 통해 해당 명령을 사용하는 방법을 직접 알아보는 것이 나아 보인다. 

 두 명령 다 prune 명령이 있다. 전자는 현재 Stopped 상태인 컨테이너들을 제거하고, 후자는 현재 비사용중인 컨테이너들을 제거한다. 더 이상 필요없는 데이터가 존재하는 경우 사용할 수 있다.

docker container prune
docker image prune

 만약 현재 환경에서 필요없는 모든 파일(캐시 포함) 을 날리고 싶은 경우, docker system prune 명령을 사용할 수 있다.


docker compose

 도커에서는 여러개의 이미지(각각 프로젝트) 를 동시에 사용해야 하거나, 추가적인 설정 (포트 넘버 지정 등) 이 필요한 경우 해당 작업을 간편하게 할 수 있도록 설정을 지정하는 목적의 파일인 docker-compose.yml 을 생성하여 사용한다.

 docker compose 은 해당 파일을 기반으로 이미지를 빌드때 사용되는 명령으로, 기존에는 docker-compose라는 별개의 cli가 존재했으나 (현재도 사용 가능), 현재는 docker cli 의 compose 명령만으로도 해당 작업을 처리할 수 있다.

docker compose build # 컴포즈 파일을 빌드
docker compose up # 컴포즈 파일을 빌드 & 실행. 이전에 빌드되었다면 캐시를 기반으로 동작
docker compose up --build # 새롭게 빌드하면서 실행.
docker compose down # 컴포즈 파일에 의한 환경을 종료하고 제거
docker compose stop # 컴포즈 파일에 의한 환경을 종료
docker compose start # 이전에 생성되었던 컴포즈 파일에 의한 환경을 실행

이외의 다양한 명령이 있으므로, 필요하다면 --help 옵션을 이용하자.

 


 많은 프로그램들은 자체적으로 많은 기능을 가진다. 따라서 모든 기능을 알고 있는 것은 사실상 불가능하다. 특정 기능이 필요하거나, 새로 알게 되었다면 이를 정리하고 기억해두는 자세가 필요할 것 같다.