본문 바로가기
IT Security/Docker & Kubernetes

[Docker & Kubernetes] 5. Docker 매우 기본적인 명령어 사용법1

by Rosmary 2022. 5. 22.
728x90
반응형

 

 

 

지난 포스팅에서 도커는 이미지를 기반으로 특정 환경을 동적으로 구현하는 컨테이너를 만들며, 이 이미지는 Dockerfile의 build로 형성할 수 있음을 알아보았다. 추가로 이미지를 Dockerfile로부터 build하는 과정에 들어가는 시간과 노력을 최소화하기 위해 Docker의 공식 Registry에서는 사용자들이 주로 사용하는 Docker 이미지를 제공하고 있다는 것까지 알아보았다.

 

이제 막 Docker 설치가 끝난 리눅스라면 컨테이너를 형성할 이미지가 없어 아무것도 구동을 할 수 없는 상태다. 따라서 이번 포스팅에서는 이 이미지들을 Registry에서 다운로드 받고, 컨테이너를 실행하고, 컨테이너 상태를 모니터링하고 다시 컨테이너와 이미지를 삭제하는, 기본적인 과정에 대해서만 다루어보려 한다. 향후 몇 개의 포스팅은 Docker의 기본 적인 사용법과 관련된 내용만 작성할 듯 하다.

 

 

 

I.  docker 정보, 상태 확인 기본 명령어

1. docker 버전 정보 확인 - docker version

docker-ce, docker-ce-cli, containerd 등 docker를 사용하기 위한 패키지가 모두 설치된 상태라면 docker 명령어를 사용할 수 있을 것이다. 설치가 정상적으로 되었다면 해당 명령어는 /usr/bin/docker에 위치한다.

 

 

이 docker 명령어는 인자로 몇몇 command를 입력해야 하는데, 패키지 설치 후 가장 기본적으로 확인하는 버전 정보는 docker version 이라는 명령어로 확인할 수 있다.

 

docker version 명령어 결과는 크게 client와 server 섹션으로 나누어져 표시된다. 정상 설치가 되지 않는 경우 server 부분이 표시되지 않는다는데, 아직까지 필자는 여러 번의 설치 과정에서 이러한 경험을 진행한 적이 없다. 대체로 잘 설치되는 듯 하다. client와 server의 버전이 동일하게 표시되는 것도 확인하자.

 

 

2. docker 시스템 정보 확인 - docker system info 또는 docker info

 

docker system info 또는 docker info 명령어는 현재 docker 시스템에 대한 정보를 나타낸다. 가령, 생성된 전체 컨테이너 수, 이미지 수, 시스템이 구동중인 OS 등 다양한 정보가 화면에 출력된다. docker version 명령어 결과와 동일하게 client와 server 정보로 나뉘어져 표시된다.

 

 

docker info는 지금 당장 볼 것이 많지는 않다. 다만 추후 docker 실습을 통해 확인할 사항이 종종 나타나므로 docker info, docker system info 명령어로  정보를 확인한다는 것만 기억해두자.

 

 

 

3. 시스템에 저장된 docker 이미지 목록 확인 - docker images

 

저장소에서 pulling(다운로드) 받은 이미지나, Dockerfile로부터 build를 통해 생성된 이미지가 서버 내에 존재한다면 이들의 목록은 어떻게 확인할까? docker는 docker images라는 명령어 한 줄로 이 목록을 쉽게 확인할 수 있도록 만들어놓았다.

 

 

하지만 지금은 받아놓은 이미지가 없어 빈 값으로만 출력된다. 조금 뒤에 이미지를 다운로드 받고 이 부분이 어떻게 변하는 지 살펴보려 한다.

 

 

4. docker container 구동 상태(Process) 확인 - docker ps

 

docker 이미지가 컨테이너로 생성된다는 것은 특정 환경의 격리가 이루어지는 것이며, 격리된 환경이 실행되어야만 HostOS인 리눅스의 프로세스에 컨테이너가 등록된다고 지난 포스팅에서(필자가 못 그리는 그림까지 친절하게 그리면서) 언급했다. 이렇게 구동중인 프로세스를 HostOS 리눅스의 ps 명령어로도 확인할 수 있지만, 컨테이너 정보만 별도로 나타나지 않기 때문에 컨테이너의 수가 많아지면 관리가 어려워진다. 

 

이 때문에 docker는 docker ps 라는 명령어를 통해 구동중인 컨테이너 정보를 확인할 수 있도록 제작해놓았다. 

 

 

docker ps 명령어는 옵션 -a를 쓰면 구동중인 컨테이너 뿐만 아니라 중단되거나 종료된 컨테이너 정보까지 확인할 수 있다(컨테이너가 삭제되면 이 명령어에 나타나지 않는다. 추후 살펴볼 예정이다). 역시 이미지가 존재하지 않기 떄문에 docker ps 명령어로 현재 구동중인 컨테이너 정보를 확인한다는 것 정도로만 기억을 해 두자.

 

 

docker에서 이미지, 컨테이너 모니터링과 관련된 가장 기본적인 명령어는 위의 4개가 끝이다. 그 중에서도 docker images와 docker ps는 자주 사용하는 명령어라 익숙해져야만 한다. 이제, Docker Registry로부터 이미지를 다운로드받아 컨테이너를 실행함과 동시에 모니터링 값이 어떻게 바뀌는지 알아보도록 하자.

 

 

II. Docker Registry 관련 명령어

(1) Docker 이미지 다운로드 - docker pull {이미지이름}:{이미지tag}

 

필자가 docker를 구동하고 있는 OS는 CentOS 리눅스다. 여기에 필자는 Ubuntu 이미지를 다운받아 Ubuntu 리눅스를 구동해보려 한다. 그 전에, 이미지가 docker registry에 어떻게 보관되고 있는지 먼저 살펴보자. https://hub.docker.com으로 로 이동하고 가입한 뒤, 사이트 위쪽의 검색창에 ubuntu를 입력해보자.

 

 

검색 결과의 가장 위쪽에 보면 Ubuntu, DOCKER OFFICIAL IMAGE 라는 항목이 제일 먼저 보인다. 위의 스크린샷에도 표시해 두었지만 이미지이름이 서두에 먼저 나오며, 해당 이미지가 Docker의 공식 이미지인지 여부를 배너를 통해 알 수 있다. 가장 위의 이미지를 클릭해서 들어가보자.

 

 

클릭해서 이동하면 해당 이미지에 대한 상세 정보가 표시된다. 오른쪽을 보면 해당 이미지를 다운받기 위한 명령어를 제공하고 있고, 바로 아래에 "사용 가능한 태그 정보 보기(View Available Tags)"를 볼 수 있는 창으로 이동하는 링크가 보인다. Docker 이미지에서 태그란 버전을 의미한다고 보면 된다. 

 

아래쪽의 Supported tags 어쩌구 저쩌구 섹션을 보면 Ubuntu 공식 이미지를 다운받을 수 있는 태그, 즉 버전 정보가 간략하게 나타난다. 다시 우측에 위치한 "사용 가능한 태그 정보 보기" 링크를 클릭하여 페이지를 이동해보자.

 

 

각 Ubuntu 이미지의 태그에 따라 항목이 구분되어 있으며, 각 항목의 우측에는 해당 태그의 이미지를 다운받을 수 있는 명령어를 화면에 표시하고 있다. 우선, 태그에 따라 이미지를 다운로드 받는 명령어의 모양이 조금씩 다르다는 것 정도로만 기억하고 다시 리눅스 쉘로 돌아와보자.

 

Docker Registry에서 이미지를 다운로드받는 명령어는 docker pull 이라는 명령어다. 명령어 뒤에는 인자값으로 이미지 이름:이미지태그 정보를 입력하는데, 이미지 태그 정보는 생략해도 무방하다. 대신 이미지 태그 정보가 생략된 경우, Docker Registry는 자동으로 가장 최신(latest) 태그 이미지에 대해 다운로드하게 된다.

 

#  docker pull {이미지이름}:{태그정보}

 

명령어가 작동하는 부분을 그림으로 표시하면 아래와 같다. 그림 내용을 참고하여 ubuntu 최신버전을 Pulling 해보자.

 

태그 정보 미입력 시 자동으로 최신 태그(latest)를 다운로드받는다.

 

docker pull 명령어 입력 후 상태

 

 

이제 앞서 보았던 docker system info와 docker images 명령어로 image 부분에 변화가 나타났는지 확인해보자.

 

docker (system) info 명령어로 현재의 서버에 이미지가 1개 증가했음을 알 수 있다. 또한,

 

 

docker images 명령어로 1개 추가된 이미지에 대한 정보를 확인할 수 있다. 이미지파일의 크기가 77.8 MB라는 것을 확인하자. 보통 VMware에 필요한 Linux iso 이미지 파일 크기가 최소 1 GB를 초과한다는 것을 생각한다면 매우 가볍다.

 

docker ps 명령어를 치면 아직 결과가 나타나지 않는다. 당연히 이미지를 다운로드받기만 했을 뿐 컨테이너를 생성해서 구동하지는 않았기 때문이다. 

 

 

III. 이미지로부터 컨테이너 생성(create), 구동(start), 실행(exec)


1. 컨테이너 생성 - docker (container) create {이미지명}:{태그정보}

 

이제 Ubuntu 실행을 위해 컨테이너를 생성해보자. 누차 말하지만 컨테이너 생성은 Ubuntu 구동을 위한 환경의 격리에서만 끝이난다. Ubuntu를 실제로 프로세스에 등록하려면 생성한 컨테이너를 구동(Run)해야만 한다.

 

컨테이너 생성과 관련된 명령어는 docker create다. 인자로 서버에 저장된 "이미지이름:태그정보"를 사용한다. docker pull과 마찬가지로 태그정보가 누락되면 최신 태그(latest) 이미지로 컨테이너를 생성한다.

 

 

 

생성한 컨테이너로 인해 docker info 명령어 결과가 변경되었을 것이다. 확인해보자.

 

 

컨테이너 1개가 생성된 것이 보이고, 현재 이 컨테이너는 구동하는 상태가 아닌 것까지 확인된다. 따라서 docker ps 명령어를 치면 이전과 마찬가지로 아무 결과가 나타나지 않는다. 왜냐하면 docker ps 는 프로세스로 등록된 컨테이너 정보만 표시하기 때문이다. 

 

 

그럼에도 불구하고 docker ps 명령어로 구동중이지 않은 컨테이너 정보까지 확인하고 싶다면 옵션으로 -a를 입력하면 된다.

 

 

다시 위쪽으로 올라가서 docker create 명령어로 출력된 문구를 잘 보자. 16진법으로 작성된 글자 중 앞 12자리가 생성된 컨테이너의 ID로 표시된다. docker ps -a 명령어 결과의 container ID 값과 비교해보자. 

 

사용한 이미지는 최신 태그의 ubuntu이며, 3분 전에 만들어진 상태로 대기중임을 알 수 있다. 만들어진 컨테이너는 "determined_chatelet"이라는 이름이 부여되어 있다. 이 이름은 컨테이너 생성 시 옵션을 통해 지정할 수 있는데, 지정하지 않는 경우 무작위 이름이 컨테이너에 부여된다. 그림으로 나타내면 현재 상태는 아래와 같다.

 

 

 

하나의 이미지로 여러 컨테이너를 생성할 수 있으니, 이번에는 특정 이름을 부여하여 컨테이너를 생성해보자. 필자는 "ubuntu_test"라는 이름으로 컨테이너를 생성할 것이다. 동일하게 docker create 명령어를 사용하되, 옵션으로 --name="사용할 이름"을 추가해보자.

 

 

# docker create --name="ubuntu_test" ubuntu:lastest

 

docker ps -a 명령어로 확인해보면, 이전의 determined_chatelet 외에 필자가 지정한 이름인 ubuntu_test로 컨테이너가 하나 더 생성되었음을 알 수 있다.

 

docker create로 컨테이너 생성 시 사용할 수 있는 옵션들이 꽤 많은데, 당장 이 부분에서 언급하기에는 양도 많고 정리도 되지 않을 듯 하다. 당장 바로 뒤의 docker start 명령어에서도 하나 더 볼 예정이니, 옵션에 대해서는 포스팅을 진행하면서 하나씩 언급하는 방향으로 나가려 한다. 

 

 

 

 

2. 컨테이너 구동 - docker (container) start {컨테이너이름 or 컨테이너ID}

 

컨테이너를 생성했다면, 이 환경을 구현하기 위해 프로세스에 등록을 진행해야 한다. 데모나이즈(Daemonize)라는 용어로도 불리는데, 마치 리눅스에서 systemctl 명령어로 서비스를 실행하는 것과 비슷하다고 보면 된다. 이는 명령어 docker start로 진행할 수 있다. 인자로 사용되는 값은 이전에 생성한 컨테이너 이름이나 ID 둘 중 하나를 입력하면 된다.

 

 

필자는 ubuntu_test 컨테이너를 실행하려한다. 이 ubuntu는 어떤 이유로 인해 구동이 잠깐동안만 정상적으로 되다가 곧 exit 상태로 변경된다.

 

 

간략하게 설명하자면, 기본 ubuntu 이미지는 어떠한 서비스도 제공하지 않는, 말 그대로 순수 OS 역할만 한다. 따라서 ubuntu 컨테이너를 실행하더라도, 내부에서 생성된 환경을 유지할만한 어떠한 서비스도 존재하지 않기 때문에 자동으로 종료된다. 마치 python으로 hello world를 출력만하는 python 파일을 실행파일로 돌리면, 실행 창이 잠깐 나타났다가 꺼지는 것과 동일하다고 보면 된다.

 

따라서 컨테이너 생성과 구동 절차를 분리해서 진행할 것이라면 무언가 지속적으로 서비스가 제공되는 컨테이너를 사용해야 한다. 필자는 nginx라는 웹 프로그램 이미지를 다운로드 받고, 컨테이너를 생성한 뒤, 이 컨테이너를 구동해보려 한다. 아래의 명령어대로 진행해보자.

 

#  docker pull nginx:latest

#  docker create --name=web_test nginx:latest

#  docker ps

#  docker start web_test

#  docker ps

일반 리눅스 컨테이너와 다르게 nginx 컨테이너는 docker start로 정상 동작 상태로 표시된다.

 

그럼, ubuntu는 컨테이너 생성과정을 거쳐 정상 구동하는 것이 아예 안되는 것일까? 그렇지는 않다. 컨테이너 생성 시, Ubuntu 컨테이너가 계속 우리의 응답에 반응할 수 있는 상태로 만들어버리면 된다. 

 

필자가 조금 전 위에서 docker create 명령어의 옵션을 포스팅을 진행하면서 하나씩 소개한다고 했다. 여기서 필자는 새로운 컨테이너를 다시 생성할 것인데, 옵션으로 -it를 부여할 것이다.

 

# docker create -it --name=ubuntu_test2 ubuntu:latest

# docker start ubuntu_test2

# docker ps

 

docker create 명령어 옵션의 i는 interactive의 약자이고, t는 terminal을 뜻한다. 따라서, 새로 작성한 docker create 명령어의 의미는 다음과 같다.

 

"Ubuntu 컨테이너를 생성하는데, 내가 terminal로 접속해서 명령어를 날리는 환경을 구성할 것이야. 누군가가 접속할 때까지 기다려!"

 

따라서 docker start를 하게되면 ubuntu_test 컨테이너와 달리 종료되지 않고 컨테이너가 유지되는 것이다.

 

ps -ef  명령어로 생성된 컨테이너 ID를 grep으로 조회하면 프로세스에 컨테이너가 등록된 내역이 나타난다.

 

자... 그럼 마지막으로 만들어놓은 ubuntu_test2 컨테이너에서 명령어를 실행하여 이런저런 정보를 확인해보자.

 

 

 

 

3. 컨테이너 실행 - docker (container) exec {컨테이너이름 or 컨테이너ID} {명령어}

 

컨테이너 내에서 작업 수행(execute)을 위해 docker exec 명령어를 사용한다. 필자는 우선 현재 만들어진 ubuntu 리눅스 컨테이너에서 uname -a 명령어의 결과를 받아와보려 한다. dnqn명령어는 아래와 같이 사용한다.

 

# docker exec -it ubuntu_test2 uname -a    (명령어 결과를 interactive - 대화형 - 하게 받아야하므로 옵션 -it를 사용)

 

위의 결과를 보면 이것이 ubuntu의 내용인지, HostOS인 CentOS의 결과인지 구분이 되지 않는다. 그냥 uname -a 명령어를 입력해보자. CentOS의 Hostname은 localhost.localhost로 나타나는 것을 확인할 수 있다.

 

그런데, ubuntu 컨테이너에서 확인한 hostname. 어디선가 많이 본 값인 듯 하지 않은가? docker ps에서 컨테이너 ID와 Ubuntu hostname을 비교해보자.

 

 

생성한 컨테이너 ID가 OS hostname으로 설정된 것을 확인할 수 있다. 따라서 docker exec 명령어 결과가 생성한 Ubuntu로부터 유래했음을 확인할 수 있다. 

 

실제 컨테이너 내부에서 작업을 하고 싶다면 어떻게 해야 할까? 단순히 명령어로 bash를 실행하면 된다. 

 

#  docker exec -it ubuntu_test2 bash

 

bash 명령어를 컨테이너에 실행하면 프롬프트가 Ubuntu의 것으로 변경되고, CentOS에서 사용하는 패키지 다운로드 명령어인 yum 대신 apt 명령어를 사용할 수 밖에 없게 된다.

 

 


 

 

이번 포스팅에서는 Docker Registry로부터 Docker 이미지의 다운로드, 컨테이너 생성, 구동, 실행과 동시에 간단한 모니터링을 진행하는 명령어에 대해 알아보았다. 명령어를 몇 개 쓰지는 않았는데, Docker의 가장 기초가 되는 부분이라 docker를 사용하고자 한다면 반드시 익숙해져야만 하는 중요한 부분이다. 물론 이것 말고 중요한게 조금 더 남아있는데, 이건 다음 포스팅에서 언급하려 한다.

 

 

 

 

Fin.

 

 

 

 

 

반응형

댓글