도커 사용법을 익혀보자
글에 들어가기 앞서…
이 포스팅은 도커를 다루는 방법에 대해 설명합니다. 이 포스팅은 하단 링크 영상의 상당 부분을 참조하여 작성되었습니다.
도커?
도커(Docker)는 컨테이너(Container) 기반의 가상화 플랫폼입니다. 컨테이너는 특정 업무를 수행하는데 필요한 환경을 모아놓은 것이라고 생각하면 좋은데요, 도커는 이 컨테이너를 쉽게 만들고 관리할 수 있게 해주는 도구입니다. 우리가 간혹 다른 사람들의 코드를 개인 컴퓨터 환경에서 실행시킬 때, 잘 돌아가지 않는 경우가 정말 많습니다. 도커는 이런 문제들을 성공적으로 해결해줍니다.
도커의 컨테이너 방법은 기본적으로 리눅스 운영체제에서 사용되는 방법입니다. 때문에 리눅스 운영체제에서 도커를 사용한다면, 성능저하가 발생하지 않습니다. 하지만, 리눅스가 아닌 윈도우나 맥 운영체제에서 도커를 사용한다면, 도커 내부에서 자체적으로 리눅스 가상환경을 구축하고, 그 위에서 도커가 돌아가기 때문에 어느정도의 성능 저하를 감수해야합니다. 그럼에도 많은 개발자들이 도커를 사용하는 이유는 그럼에도 도커가 제공하는 편의성이 정말 어마무시하기 때문입니다.
도커랑 가상환경의 차이점은 무엇인가요?
도커와 가상환경의 가장 큰 차이점은 ‘효율성’에 있습니다. 가상환경은 운영체제 전체를 가상화하는 반면에, 도커는 애플리케이션 실행에 필요한 최소한의 환경만을 가상화하기 때문에 리소스 소모가 훨씬 적습니다.
위의 그림처럼, 가상환경은 개별로 OS를 가지고 있어야 하기 때문에 리소스 부담이 심합니다. 하지만, 컨테이너의 경우에는 OS를 따로 가지고 있을 필요가 없어 상대적으로 훨씬 가볍습니다. 대신 컨테이너가 원래 깔려있는 OS와 대신 소통을 해서 애플리케이션이 원활하게 수행되도록 합니다.
## 컨테이너를 만들기 위해서는 어떤 과정을 거쳐야 하나요?
컨테이너를 만들기 위해서는 일단 도커파일을 만들고, 이를 통해 이미지를 만들어 컨테이너를 구동할 수 있습니다.
-
도커파일(Dockerfile)
-
Copy files: 애플리케이션을 수행하기 위해서 필요한 파일을 명시합니다.
-
Install dependencies: 어떤 프레임워크나 라이브러리를 설치해야 하는지 명시합니다.
-
Set environment variables: 필요한 환경 변수를 설정합니다.
-
Run setup scripts: 어떻게 구동해야하는지 스크립트를 명시합니다.
-
-
이미지(Image)
애플리케이션 실행에 필요한 모든 세팅들을 포함합니다.
-
컨테이너(Container)
이미지를 고립된 파일 시스템에서 실행할 수 있는 고립된 환경입니다. 이 환경에서 애플리케이션이 구동됩니다.
실제로 도커를 사용해보자
그러면 실제로 도커를 사용하는 과정을 밟아보겠습니다.
도커를 다운로드하자
일단 도커 홈페이지에 들아가서 자신의 운영체제에 맞는 버전의 도커를 다운로드 받아야 합니다. 저는 맥북에서 도커를 실행하기 때문에, 맥 버전으로 다운로드 하겠습니다.
Docker-Get Started: https://docs.docker.com/desktop/install/mac-install/
도커를 실행해보자
다운로드 받은 도커를 실행해 보겠습니다.
앱을 실행시키면 위와 같은 창을 확인할 수 있습니다. 하지만, 도커의 기능을 완벽하게 사용하기 위해서는 도커를 명령어로 실행시킬 수 있어야 합니다. 따라서 터미널에서 도커를 실행시켜 보겠습니다.
터미널에서 도커를 사용하는 방법은 아래 링크에서 확인할 수 있습니다. 들어가보시면 정말 다양한 명령어가 있는데요, 그 중 필요한 카테고리에 들어가면, 입력해야 할 명령어의 자세한 설명을 볼 수 있습니다.
docker images
터미널에서 위의 명령어를 입력했을 때 별 다른 에러가 발생하지 않는다면, 도커를 설치에 성공하신겁니다.
이미지를 pull 해오기
이제 필요한 이미지를 가져와서 환경을 구축해보겠습니다. 우리가 앱 스토어에서 프로그램을 다운로드 받을 수 있듯이, 이미지는 Docker Hub라는 Registry에서 다운로드 받을 수 있습니다.
Docker Hub에서 이미지를 받아오는 행위를 Pull이라고 합니다.
제가 다운로드 받아 볼 container는 httpd입니다. httpd는 HTTP Daemon의 약자로, 웹 서버의 일종입니다. 클라이언트에서 HTTP 요청이 오면 그에 따른 응답을 제공하는 역할을 합니다.
위의 그림을 보시면 초록색 글씨로 Docker Official Image라고 적혀있는데요, 이는 Docker Hub에서 관리하는 공식적인, 믿을 수 있는 이미지임을 의미합니다.
docker pull IMAGE
도커 허브의 이미지를 다운로드 받는 명령어입니다.
좌상단에 httpd container를 다운로드 받을 수 있게 해주는 코드가 있는데요(docker pull httpd
), 그대로 복사해서 터미널에 입력해 보겠습니다.
- image를 pull하는 자세한 형식을 docker docs reference에서 확인하세요.
docker images
를 통해 이미지를 확인해 보면, 다운로드 받은 httpd 이미지가 생긴 것을 확인할 수 있습니다.
Docker GUI에서도 httpd가 새롭게 나타난 것을 확인할 수 있습니다.
docker rmi IMAGE
도커 이미지를 삭제하는 명령어입니다.
docker rmi httpd
를 통해 다운받은 도커 이미지를 삭제할 수도 있습니다.
container를 run 하기
GUI
먼저 Docker GUI에서 컨테이너(container)를 실행(run)해보겠습니다. GUI에서 컨테이너를 실행하는 것은 정말 쉽습니다. 그 과정을 차근차근 밟아보겠습니다.
다운로드 받은 여러 이미지들 중에서, 실행할 이미지의 Actions의 재생 버튼(Run)을 누릅니다.
컨테이너를 실행할 때 설정할 수 있는 옵션이 정말 다양한데요, 그 중 컨테이너의 이름을 설정할 수 있는 옵션이 있습니다. 관리하기 편한 이름으로 설정합니다.
실행을 시키면 위와 같이 컨테이너 안에서 실행되는 프로세스가 뱉어내는 로그를 확인할 수 있고, 또 다양한 통계들도 확인할 수 있습니다.
컨테이너는 존재 자체만으로 컴퓨터의 리소스를 소모합니다. 당연히 필요가 없다면 중단시켜야하고, 제거할 수 있어야 합니다.
좌상단의 이 버튼들을 통해 컨테이너의 동작을 제어할 수 있습니다. 왼쪽부터 차례대로 중단(Stop), 시작(Start), 재시작(Restart), 삭제(Delete)입니다.
CUI
이제 CUI에서 도커 컨테이너를 실행하는 방법에 대해 설명하겠습니다.
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
터미널에서 컨테이너를 실행하는 코드입니다. 이미지 앞에는 옵션을 적고, 이미지 뒤에는 컨테이너 내부에서 수행하고 싶은 명령이 있다면, 그 명령을 적습니다.
docker ps
현재 실행중인 컨테이너를 확인하는 명령어입니다.
docker ps
를 통해 확인했을 때, 현재는 어떤 컨테이너도 실행되지 않고 있습니다. 이제 컨테이너를 실행시켜 보겠습니다.
- 3개의 터미널 창을 사용해서 컨테이너의 실행 과정을 살펴보겠습니다.
첫 번재 터미널에서 docker run httpd
명령어를 통해 컨테이너를 실행했습니다. 세 번재 터미널에서 docker ps
를 입력해 실행되고 있는 컨테이너를 확인합니다. 6분 전에 relaxed_joliot라는 이름을 가진, 그리고 httpd 이미지를 통해 생성된 컨테이너를 확인할 수 있습니다.
동일한 httpd 이미지로 또 다른 컨테이너를 생성해 볼건데요, 이번에는 두 번재 터미널에서 컨테이너를 생성해 보겠습니다.
docker run --name CONTAINER httpd
두 번째 터미널에서 docker run --name ws2 httpd
명령어를 통해 ws2라는 이름을 가진 컨테이너를 실행시켰습니다. 세 번째 터미널에서 실행중인 컨테이너들을 확인했을 때, ws2 컨테이너가 새롭게 생성된 것을 확인할 수 있습니다.
이번에는 실행중인 컨테이너를 중단시켜 보겠습니다.
세 번째 터미널에 docker stop ws2
명령어를 사용해, ws2 컨테이너를 중단시켰습니다. 두 번째 터미널에서 컨테이너가 꺼져, 자동으로 나가졌습니다. docker ps
를 통해 동작하고 있는 컨테이너를 확인했을 때, ws2가 나타나지 않습니다. 그러면 컨테이너가 삭제된 것일까요? 그렇지 않습니다.
GUI Docker를 확인해보면 여전히 ws2 컨테이너가 남아있는 것을 확인할 수 있습니다. docker stop ws2
명령어는 단순히 정지 버튼에 지나지 않습니다. 컨테이너를 정지시키는 것을 넘어서 완전히 삭제하기 위해서는 docker rm ws2
명령어를 사용해야 합니다. 이는 GUI에서의 휴지통 버튼, Delete와 동일합니다.
docker ps -a
-a
는 정지 상태의 컨테이너까지 보여주는 옵션입니다. 이 옵션을 통해서 터미널에서도 정지 상태의 컨테이너를 확인할 수 있습니다.
docker rm CONTAINER
docker rm ws2
명령어를 실행시켰을 때야 비로소 컨테이너가 완전하게 삭제된 것을 확인할 수 있습니다.
docker rm --force CONTAINER
실행 중인 컨테이너는 일반적으로는 삭제할 수 없습니다.(docker stop CONTAINER
으로 컨테이너를 정지시키는 것이 선행되어야 합니다.) 하지만 위의 --force
옵션을 사용한다면, 강제로 컨테이너를 삭제할 수 있습니다.
도커를 처음 실행시켰을 때는 로그가 실시간으로 출력되는데요, 중단 시켰다가 다시 실행시켰을 때는 그저 컨테이너 이름을 반환함으로써 다시 실행되었음을 알릴 뿐, 로그가 실시간으로 출력되지 않습니다.
docker logs CONTAINER
컨테이너의 로그를 출력하는 명령어입니다.
docker logs ws2
명령어로 로그를 출력했습니다. 하지만 여전히 로그를 띡, 하고 뱉을 뿐, 실시간으로 계속 로그를 출력하지는 않습니다.
docker logs -f CONTAINER
-f
는 컨테이너의 로그를 실시간으로 계속 출력하는 옵션입니다.
docker logs -f ws2
명령어로 이제 실시간으로 로그를 출력하는 상태를 만들 수 있습니다.
글을 끝마치며..
도커를 다룰 때 필요한 정말 기본적인 내용들을 정리해봤습니다. 글에 오류나 질문이 있다면 편하게 댓글로 남겨주세요.
감사합니다.
댓글남기기