Tech story/Container

도커를 공부하는 초보자를 위한 안내서 5편 - 도커 설치 및 명령어 실습

kt cloud 테크블로그 2021. 7. 5. 17:45

도커(Docker) 기초 다지기 - 도커 명령어 및 실습

 

앞선 포스트를 통해 도커가 무엇인지 공부했으니, 이제 실전에 돌입할 차례입니다.

도커 설치부터 핵심적인 명령어까지 실습을 통해 차근차근 알아보겠습니다.

 

도커(Docker) 설치

도커는 리눅스 컨테이너 기반의 기술입니다. 그러므로, 리눅스 OS가 아닌 맥이나 윈도우에 설치 시 가상머신에서 설치가 된다는 점을 생각하셔야 합니다.

Linux

리눅스에 도커를 설치하는 방법은 정말 간단합니다. 자동 설치 스크립트가 있기 때문입니다. 아래의 명령어를 이용하여 간단하게 설치할 수 있습니다. 아래 명령어를 입력하면, root 권한을 요구한 뒤(password 입력) 자동으로 설치가 완료 됩니다.

(단 Linux는 ubuntu와 centos를 사용했습니다. 다른 Linux를 사용하시는 분은 https://docs.docker.com/engine/install/  를 참조해 주시면 감사하겠습니다.)

$curl -fsSL https://get.docker.com/ | sudo sh

 

Mac and Window

맥이나 윈도우에 도커를 설치하려면, Docker for Mac 이나 Docker for WIndow를 설치해야 합니다. 파일을 다운로드 받고 설치한 뒤 재부팅하면 대부분 문제없이 설치가 완료 됩니다. 다음 사진은 mac에 도커 데스크탑을 설치한 화면입니다.

<첨부1>docker desktop

 

위에서 언급했듯이, 리눅스가 아닌 윈도우나 맥에 Docker for mac 이나 Docker for Window를 이용하여 도커를 설치할 경우 네이티브가 아닌 가상머신 위에서 동작하게 됩니다. 하지만 사용할때는 마치 네이티브에서 동작하는 것과 동일하다는 착각이 들만큼 차이가 거의 느껴지지 않습니다.

 

VM위에서 도커를 실행하면 무슨 장점이 있나 싶겠지만, 그래도 도커의 독립적인 실행환경을 사용할 수 있다는데 의의가 있습니다.

 

개인적으로는 VMware나 Virtual Box를 이용하여 리눅스 가상머신을 만든 뒤에 도커를 설치하여 실습을 하기를 권장합니다. 물론 Docker for OS를 통해 따라하셔도 문제없습니다. 저는 KT cloud를 이용하여 리눅스 서버를 하나 생성한 뒤, 실습을 진행하였습니다.

 

설치확인

설치가 완료되었다면, 다음 명령어를 통해 설치가 정상적으로 되었는지 확인해 보겠습니다.

$docker version

<첨부2>docker version 확인

 

정상적으로 설치 되었다면, 위와 같은 화면을 볼 수 있습니다. client와 server 정보가 출력 되었다면 완료입니다.

 

설치에러

1. permission denied 에러가 뜰 경우에는 sudo docker version 으로 실행해 보시길 바랍니다.

2. Cannot connect to the Docker daemon at unix://var/run/docker.sock 에러가 뜰 경우에는 다음 조치사항을 따라해 보시길 바랍니다.

> sudo systemctl unmask docker.service
> sudo systemctl unmask docker.socket
> sudo systemctl start docker.service
> sudo docker version

 

 

Docker Client and Host

<첨부3>docker client and host

 

설치가 완료된 후 , docker version을 통해 확인하면 client와 server 영역이 있는 것을 확인할 수 있습니다. 그건 Docker가 위와 같은 구조를 가지고 있기 때문입니다.

 

docker client에서 command를 입력하면(예를들어, docker run) 도커 client가 명령을 docker host로 전송하고 결과를 받아 터미널 창에서 보여주게 됩니다.

 

Docker Client

Command를 입력하면 docker client에서 명령어를 Host로 전송하여 daemon에서 처리하게 됩니다. 클라이언트는 둘 이상의 데몬과는 통신 할 수 없습니다.

 

Docker Daemon

API 요청을 수신하고, 이미지 ,컨테이너, 네트워크와 같은 Docker Object를 관리하는 역할을 수행합니다. 데몬은 Docker 서비스를 관리하기 위해 다른 데몬과 통신 할 수도 있습니다.

 

어려운 내용은 일단은 지나쳐도 좋습니다. 중요한 점은 도커는 서버와 클라이언트의 역할을 각각 수행할 수 있고, 클라이언트가 서버로 명령을 보내 처리 결과를 출력해 주는 방식을 가진다는 것입니다.

 

 

컨테이너 실행하기

$docker run [OPTIONS] [IMAGE:TAG]

도커를 이용하여 컨테이너를 실행시키는 방법은 다음과 같습니다. run 명령어를 통해 Image를 컨테이너로 실행시키게 됩니다. 이 때, run시킨 이미지가 로컬 registry에 없을 경우, 자동으로 docker hub를 통해 image를 pull 받아 온 뒤 실행시킵니다.

 

아래는 컨테이너 실행 시, 자주 쓰이는 옵션을 모아놓았습니다. 아래 옵션들만 잘 기억해 놓으시면 컨테이너를 실행시키는 것에 크게 문제가 없을것입니다.

옵션  
-d detached mode로 백그라운드 모드를 의미합니다.
-p Host와 컨테이너의 포트포워딩 옵션입니다.
-v Host와 컨테이너의 디렉토리를 연결해 볼륨을 만드는 옵션입니다.
-e 컨테이너 내 환경변수를 설정할 때 사용합니다.
-name 컨테이너의 이름을 설정합니다.
-rm 프로세스가 종료되면 자동으로 컨테이너를 제거하는 옵션입니다.
-it -i 옵션과 -t 옵션을 함께 사용한 것으로, 직접 컨테이너에 접속해 터미널 입력을 위한 옵션입니다.
-link 컨테이너를 연결해 주는 옵션입니다.

 

 

컨테이너로 우분투(Ubuntu) 실행하기

백문이 불여일타라는 말이 있듯이, 실전으로 들어가서 컨테이너를 사용해 보겠습니다.

docker run 명령어를 이용해서 ubuntu를 실행시켜 보겠습니다.

<첨부4> docker run ubuntu

docker run ubuntu:18.04 명령어를 통해 우분투를 실행시켜 보았습니다.

사진을 통해 일련의 과정을 확인하실 수 있습니다.

1. 처음에는 local에서 ubuntu:18.04의 이미지가 있는지 확인 합니다.

2. 이미지가 없는것을 확인 후, library/ubuntu 즉, 도커허브에서 이미지를 pull 받습니다.

3. 컨테이너를 실행합니다.

 

그렇다면, 컨테이너가 실행중이라는 것을 어떻게 알 수 있을까요?

docker ps 명령어를 통해 가동중인 컨테이너의 리스트를 확인할 수 있습니다.

(docker ps -a 옵션을 사용한다면 현재 중지되어있는 컨테이너까지 확인가능합니다.)

<첨부5>docker ps

 

하지만, 아무리 찾아봐도 제가 실행시킨 ubuntu 컨테이너는 찾을 수 없습니다. 왜일까요?

일전에 설명드렸지만, 컨테이너는 프로세스이기 때문입니다. 실행중인 프로세스가 없다면 컨테이너는 종료됩니다. 

컨테이너는 정상 실행되었지만, 실행중인 프로세스가 없어 종료된것입니다.

 

그래서 이번에는 위에서 배운 다른 옵션을 한 번 사용해 보겠습니다. ubuntu 컨테이너를 실행시킨 뒤, bash 명령어를 실행시켜 보겠습니다. -it 옵션을 통해서 쉘에 키보드 입력을 할 수 있도록 하겠습니다. 그리고 ls 명령어를 통해 ubuntu를 실행시켰음을 확인할 수 있습니다.

<첨부6>docker run ubuntu bash

이번에는 다른 결과가 나왔습니다. 

무척 신기하지 않나요? 명령어 한줄로 ubuntu를 실행할 수 있다니..

이미지도 탑재(Pull 받아짐)되어 있는지 확인해 보겠습니다.

<첨부7>docker images

실제로도 ubuntu image가 Pull 되어있는 것을 확인할 수 있습니다.

 

image list를 확인하는 명령어는

docker images 

명령어 입니다.

 

 

컨테이너로 톰캣(Tomcat) 실행하기

이번에는 Tomcat을 컨테이너로 실행해보겠습니다. 더 다양한 옵션을 사용하니, 잘 따라와 주세요.

<첨부8>tomcat 실행
<첨부9>docker ps 톰캣확인

이제 좀 감이 잡히시나요?

처음 docker run 명령어를 실행하자, local에서 이미지를 찾고, 이미지가 없으니 docker hub에서 이미지를 pull 받아 오는걸 볼 수 있으실 겁니다.

 

그리고 그 다음에는 docker ps 명령어를 통해 tomcat 컨테이너가 실행되고 있음을 확인할 수 있습니다.

명령어를 하나씩 뜯어서 보겠습니다.

$docker run -d -p 8080:8080 --name tomcat-test tomcat

-d 옵션은 컨테이너를 백그라운드에서 돌리고 컨테이너 ID를 출력하는 옵션입니다. -detach로 표현하기도 합니다. 터미널 종료와 상관없이 컨테이너를 실행시키기 위함입니다. 

 

-p 옵션은 host와 컨테이너의 port를 연결해주는 옵션입니다. host의 8080 포트와 container의 8080 포트를 연결합니다.

 

--name은 컨테이너의 이름을 정해주는 옵션입니다. 여기서는 tomcat-test로 컨테이너 이름을 정했습니다.

 

그리고 마지막으로 tomcat image로 컨테이너를 실행시켰습니다. 이때 tag를 따로 붙이지 않는다면, default 값으로 :latest 태그가 붙으며 최신버전의 이미지를 pull 해서 가져오게 됩니다.

 

그러면 실행 결과를 한 번 확인해 보겠습니다.

<첨부10>tomcat 실행화면

사실 위와 같은 화면이 떠야 정상이지만, 아마 404 Error 페이지를 보고 계실 확률이 높습니다 ㅠㅠ

tomcat 컨테이너 내부에서 몇 가지 수정을 해야만 정상적인 화면을 출력할 수 있습니다.

그리고 그럴 때 사용 가능한 명령어가 바로 docker exec 명령어 입니다. exec 명령어를 통해 외부에서 컨테이너 안으로 명령을 실행할 수 있습니다.

<첨부10>Tomcat 수정

docker exec 명령어에 익숙한 -it 옵션을 사용했습니다. 그리고 tomcat-test 제가 정한 컨테이너 이름이죠?

들어가서 위와 같은 명령어를 통해 약간의 수정을 가했습니다. mv 명령어는 move라는 의미를 가진 명령입니다.

저두 한참을 헤메다 구글링을 통해 이유를 찾았습니다.

커뮤니티의 요청에 따라 wepapp 폴더의 내용이 webapp.dist폴더로 옮겨갔다고 합니다. 그래서 wepapp 폴더가 비워져 있었고, 브라우저에 보여줄(응답해줄) 파일이 존재하지 않은 이유로 404 error가 났던것입니다!

 

위와 같이 조치를 취해주면, 정상적으로 컨테이너가 동작함을 확인할 수 있습니다. 현재 저는 kt cloud를 이용하여, 클라우드 서버위에서 실습을 진행하고 있어 공인 ip를 통해 외부에서 접근하여 확인했습니다. 여러분이 로컬에서 실습을 진행하고 있다면, 단순히 localhost:8080을 통해 위와 같은 결과를 확인할 수 있을 것입니다.

 

 

컨테이너 정지 및 삭제

마지막으로 컨테이너를 정지하고 삭제하는 방법을 학습해 보겠습니다.

컨테이너를 중지하고, 삭제하는건 매우 간단하고 직관적 입니다.

$docker stop [options] conainer
$docker rm [options] container

정지는 말그대로 stop, 삭제는 rm 입니다. 중지를 위해서는 컨테이너의 id 또는 name을 입력하면 됩니다.

한 번 이전에 가동시켰던 컨테이너를 정지 후 삭제 해 보겠습니다.

일단 docker ps 명령어를 통해 tomcat container가 실행중임을 확인할 수 있습니다.

<첨부 11>

그 이후에, docker stop 명령어를 통해 컨테이너를 정지시켜보았습니다. 이때 컨테이너 아이디를 전부 적을 필요는 없습니다. id가 식별될 정도로 앞의 4자리에서 5자리 정도를 적어주시면 됩니다.

<첨부 12> docker stop

이제 docker ps -a 를 통해 정지되어 있는 tomcat cotainer를 확인할 수 있습니다. STATUS를 확인해보면 정지되어 있음이 확인됩니다.

<첨부13> stop 확인

마지막으로 rm 명령어를 통해 삭제해 보겠습니다.

<첨부 14> docker rm

docker rm 명령어를 통해 삭제한 뒤, 다시 한 번 컨테이너 목록을 확인해 보니 정지되어 있던 컨테이너가 완전히 삭제되어 있음을 확인 할 수 있습니다. 이 때, 삭제명령어 뒤에는 컨테이너 name을 적었습니다.(container id or name)

 

마무리

이번 포스트를 통해 docker의 강력함과 신기함을 느끼셨으면 좋겠습니다.

역시, 글로만 읽는것보다는 실습을 통해 배우는것이 훨씬 재밌고 이해도 빠른것 같습니다.

다음 포스트에서는 더 다양한 실습과 docker image를 커스터마이징하는 방법을 학습해보겠습니다.

 

긴 글 읽어주셔서 감사합니다!

 

 

관련글

1.컨테이너 개념 - https://ktcloudplatform.tistory.com/69

2. 도커 이해하기 - https://ktcloudplatform.tistory.com/73