ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [따라하며 배우는 도커와 CI환경] 2. 기본적인 도커 클라이언트 명령어
    DevOps/Docker 2022. 5. 16. 16:41

    기본적인 도커 명령어를 알아보자!

     

    ✔️ 이미지 내부 파일 시스템 구조 보기

    이미지 내부 파일은 어떻게 확인할 수 있는지 알아보자.

    $ 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) 를 입력하면 된다.

     

     

    참고

    728x90

    댓글

Designed by Tistory.