본문 바로가기

Development/Web

Container 개념과 Docker 기초 내용

들어가며

웹 서비스를 개발하는 경우에는 서버로 사용할 PC에 Apache, MySQL을 설치해야 하는 것과 같이 어떠한 서비스를 개발하고 운영할 때, 운영체제에 여러 소프트웨어를 설치해야 한다. 해본 사람은 알겠지만, 웹 페이지 구현은 고사하고, 이러한 소프트웨어를 설치하는 과정에서 여러 오류를 마주치다보면, 흥미가 매우 떨어지게 된다.

Container

누군가가 웹 서버를 운영하는데 필요한 소프트웨어를 전부 설치한 컴퓨터를 제공해준다면, 단지 개발만 하면 되기 때문에 매우 행복할 것이다. 이를 가능케 하는 방법으로는 대표적으로 가상머신(VM)이 있다. 가상머신에 운영체제와 웹 서비스를 운영하기 위한 소프트웨어를 설치해놓고 이를 이미지 파일로 남겨놓는다고 가정해보자. 그러면 새로운 웹 서비스를 개발할 때마다 해당 이미지를 복사해서 가상머신을 실행시키기만 하면 되기 때문에 위에서 언급한 복잡한 과정을 거치지 않아도 된다. 그러나, 가상머신에는 한 가지 단점이 있는데, 그건 바로 용량이 무겁다는 것이다. 먼저, 가상머신에 설치되는 운영체제는 결코 가볍지 않으며, VMware나 VirtualBox와 같이 가상머신을 구동시키는 소프트웨어는 현재 자신의 PC와 같은 또 다른 운영체제에서 실행되어야 하기 때문이다.

그렇다면, 하나의 운영체제에서 각각의 소프트웨어를 실행시킬 수는 없을까? 자신의 PC에서 여러 개의 가상환경이 실행되는데, 이 가상환경을 컨테이너라고 한다. 각각의 컨테이너에는 운영체제가 설치되는 것이 아니라 소프트웨어를 실행하는데 필요한 라이브러리와 실행 파일만을 포함시킨 상태이므로 별도의 소프트웨어를 설치하지 않아도 된다. 즉, 이미 존재하는 운영체제를 공유하여 해당 운영체에서도 소프트웨어를 실행시키는 것이기 때문에 용량이 가볍고, 실행 속도 또한 빨라질 것이다.

Docker

컨테이너는 Linux 운영체제에 내장되어 있는 소프트웨어 실행 환경이며, 컨테이너를 실행하려면 별도의 소프트웨어가 필요하다. 이러한 소프트웨어의 종류는 다양하나, 그 중에서 가장 대중적으로 사용되는 Docker에 대해서 정리해보았다(도커 명령어에 대한 자세한 내용은 도커 공식 문서에서 확인할 수 있다.).

설치

도커를 실행하는 운영체제가 Linux인 경우에는 Linux 운영체제를 설치할 필요가 없기 때문에 최상의 조건으로 도커를 실행시킬 수 있다. 반면에 운영체제가 Windows와 같이 Linux가 아니라면, 도커가 실행될 수 있는 가상머신이 자동으로 설치되므로 어느정도 성능 저하를 감수하여야 한다. 그럼에도 불구하고 Linux가 아닌 다른 운영체에서도 도커를 사용하는 이유는 편의성이 매우 높기 때문이다. 도커는 도커 공식 페이지에서 다운로드 할 수 있으며, 운영체제별 설치 과정도 자세히 나와있기 때문에 별도로 언급하지는 않겠다(다만, Windows의 경우 도커를 실행하는 도중 VM 관련 이슈가 발생할 수 있는데, 이는 구글링을 통해 해결할 수 있다). 설치가 완료되었다면, 명령 프롬프트에서 아래의 명령어를 입력해보자.

$ docker images

그리고 아래와 같은 결과가 보인다면 정상적으로 설치가 완료된 것이다.

REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

용어 정리

아이폰의 경우 애플리케이션을 자신의 기기에 설치할 때, 앱 스토어(AppStore)에서 검색한 후 다운로드 받고, 특정 프로세스에서 해당 애플리케이션이 실행된다. 이와 마찬가지로 도커에서는 원하는 이미지를 도커 허브(docker hub)에서 찾아서 다운로드 받고, 특정 컨테이너에서 해당 이미지를 실행시킬 수 있다.

iPhone Docker
출처 AppStore docker hub
대상 Application image
다운로드 download pull
실행환경 process container

애플리케이션은 여러 프로세스에서 실행 가능한 것처럼 이미지 또한 여러 컨테이너에서 실행할 수 있다.

기본 명령어

👉 이미지 다운로드

도커 허브에 접속해보면 여러 도커 이미지를 볼 수 있다. 이중에서 apache를 설치해보려고 한다. 도커에서 apache 이미지는 httpd라는 이름으로 되어 있기 때문에 검색창에 httpd로 검색한 후 해당 이미지를 한다. 그러면 httpd 이미지의 설명과 더불어, 다운로드할 수 있는 명령어를 확인할 수 있는데, 이 명령어를 명령 프롬프트에 입력하여 httpd를 다운로드 받아보자.

$ docker pull httpd

이어서 아래 명령어를 입력하였을때 httpd가 목록에 보인다면, 해당 이미지를 정상적으로 설치한 것이다.

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
httpd        latest    a8ea074f4566   3 weeks ago   144MB

👉 컨테이너 실행

다운로드 받은 이미지는 컨테이너를 통해 실행된다. 정확히 말하자면, 이미지가 실행되는 것이 아니라 새로운 컨테이너에 이미지의 복사본이 실행되는 것이다. 도커의 이미지를 컨테이너로 실행시키는 명령어는 아래와 같다.

$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

이어서 다운로드한 httpd 이미지를 아무런 옵션 없이 실행시켜보자.

$ docker run httpd

새로운 명령 프롬프트에 아래 명령어를 입력하면 현재 실행 중인 컨테이너를 확인할 수 있다.

$ docker ps

하나의 이미지는 여러 개의 컨테이너로 실행될 수 있다고 하였다. 그렇다면, 이번에는 새로운 명령 프롬프트에서 아래 명령어를 입력하여 name 옵션을 추가한 컨테이너를 실행시켜보자.

$ docker run --name test httpd

👉 컨테이너 종료

아래의 명령어를 입력하여 위에서 실행시킨 두 개의 컨테이너 중에서 이름이 test인 컨테이너를 종료시켜보자.

$ docker stop test

아래의 명령어를 입력하여 현재 실행 중인 컨테이너 목록을 보면, test라는 컨테이너가 보이지 않는다. 그렇다면 종료시킨 컨테이너는 삭제가 된 것일까?

$ docker ps

위 명령어 '-a' 옵션을 추가로 입력하면 실행 여부에 상관 없이 모든 컨테이너를 확인할 수 있다.

$ docker ps -a

👉 컨테이너 재실행

종료시킨 컨테이너를 재실행할 때에는 docker run ~이 아니라 docker start ~를 입력하여야 한다.

$ docker start test

위 명령어를 실행시키면, 최초로 컨테이너를 실행(run)했을 때와는 다르게, 해당 컨테이너의 로그가 나타나지 않는 것을 확인할 수 있다.


👉 컨테이너 로그 확인

아래 명령어를 입력하여 재실행한 컨테이너의 로그를 한 번만 확인할 수 있다.

$ docker logs test

컨테이너의 로그를 실시간으로 확인하고 싶다면 위의 명령어에 '-f' 옵션을 추가로 입력한다.

$ docker logs -f test

👉 컨테이너 삭제

컨테이너를 삭제할 때에는 아래 명령어를 입력한다. 단, 현재 실행 중인 컨테이너는 삭제할 수 없으니, 삭제하려는 컨테이너를 종료시킨 후 삭제하여야 한다.

$ docker rm test

물론, 현재 실행 중인 컨테이너를 강제로 삭제시키는 옵션이 존재하나, 이는 위험하기 때문에 잘 사용하지 않는다.

$ docker rm --force test

👉 이미지 삭제

아래 명령어를 입력하면 이미지를 삭제할 수 있다.

$ docker rmi httpd

마치며

여기까지 컨테이너의 개념과 더불어 도커 설치, 기본 명령어까지 정리해보았다. 추후에 공부할 내용이긴 하지만, 도커 컴포즈(docker compose)를 다루거나, 도커를 대신하여 쿠버네티스(kubernetes)로 넘어가기 전에 도커가 무엇인지, 기본적인 사용 방법은 무엇인지 정도는 알고 넘어가야 할 것 같아서 공부한 내용을 정리해보았다.