Docker 이해하기 (2) - Docker Architecture, Container 및 Image

BangDori·2024년 4월 25일
0

저번 Docker 이해하기 (1)을 작성하며 도커의 인기가 얼마나 대단한지를 새삼 느끼며, 도커를 왜 사용하는건지, 도커가 무엇인지에 대해 알아보았다. 이번 게시물에서는 도커 아키텍처, 컨테이너, 이미지에 대해 알아보자.

📌 Docker Architecture

도커 아키텍처와 관련한 정보는 #docker-architecture 공식문서에서 언급하고 있는 아키텍처 정보를 참고하면서 보면 공부하면 좋을 것 같다.

우선 도커 아키텍처는 크게 Client, Host, Registry 로 나뉘어져있다. 도커는 RESTful API와 유사하게 client-server 아키텍처를 사용하고 있는데, 여기서 Client는 도커 아키텍처의 Client이다. Host는 도커를 실행하는 물리적 혹은 가상 서버를 의미한다. 그리고 Registry는 이미지들을 저장하는 저장소인데, 누구나 사용할 수 있는 공개 레지스트리로 도커 허브(Docker Hub)가 있다.

위 아키텍처에서 Client 측에서 실행하는 명령어인 docker run, docker build, docker pull을 하면 어떻게 되는지 차근차근 알아보자.

docker run

docker run 명령어는 컨테이너를 실행하기 위해 사용하는 명령어로 도커를 사용한다면 가장 많이 사용하게 될 명령어 중 하나일 것이다. 아키텍처를 따라가면, docker run 명령어를 입력하면 Host 즉 가상 환경에 있는 dockerd(docker daemon)에게 전달한다. dockerd는 클라이언트 측의 요청을 수신하고, 가상 환경에 위치한 이미지를 실행하게 된다. 이렇게 실행 가능한 이미지를 컨테이너라고 한다. 이때 가상 환경에 이미지가 없다면 어떻게 해야할까

docker build

docker build*Dockerfile과 context로부터 이미지를 빌드한다. 여기서 빌드 context는 지정한 경로 혹은 URL에 위치한 파일들의 집합이다.

여기서 URL 파라미터는 깃허브 레포, tarball context 등이 될 수 있을 것이고 지정한 경로는 Dockerfile에 명시한 해당 프로젝트의 위치가 될 수 있을 것이다.

Dockerfile

Dockerfile은 주어진 이미지를 빌드하는 데 필요한 모든 명령을 순서대로 포함하는 텍스트 파일

docker pull

docker pull은 앞서 가상 환경내에 이미지가 없을 경우, 도커 허브내에서 이미지를 가져오는 역할을 한다. 깃의 git pull을 생각하면 빠르게 이해될 것이다. 도커 허브는 앞서 말했듯 공개 레지스트리이기 때문에 누구나 이미지를 pull하고 run 할 수 있다. pull이 있다면 push도 있지 않을까?

물론 docker push도 있다! push 뿐만 아니라 수 많은 명령어가 존재한다. 앞서 소개한 명령어 외에 다른 명령어가 궁금하다면 docker (base command)를 확인해 보면 좋을 것 같다.

📌 Docker Image

공식 문서에서는 도커 이미지에 대해 도커 컨테이너를 만들기 위해 instructions이 포함된 읽기 전용 템플릿이라고 설명하고 있다. 실제로 우리가 이미지를 생각해보면, 이미지는 그 자체로 볼 수만 있고 수정에 대해서는 불가능하다. 물론 이미지 편집 툴을 이용하면 이미지를 수정할 수 있겠지만, 이미지 자체만 놓고 봤을때는 불가능하다.

여기서 instructions는 소스 코드, 라이브러리, 종속성, 도구 및 응용 프로그램을 실행하는데 필요한 기타 파일을 포함하는 불변(변경 불가) 파일이다. 즉 도커 이미지는 우리가 작성한 소스 코드, 라이브러리 등을 모두 포함하는 독립적인 환경을 포함하는 템플릿을 뜻하는 것이다.

이미지는 읽기 전용이므로 *스냅샷이라고도 하며, 특정 시점의 애플리케이션과 가상 환경을 나타낸다.

이미지는 특정 시점을 나타내기에, 도커의 큰 특징 중 하나인 일관된 환경에서 개발자가 안정적이고 균일한 조건에서 소프트웨어를 테스트하고 실험할 수 있도록 한다. 실제로 도커 허브를 확인해보면, 다양한 이미지가 있는 것을 확인할 수 있다.

이 중 굉장히 인기가 많은 nginx 이미지를 확인해보면, 수 많은 태그가 있는 것을 확인할 수 있다. 이 태그가 의미하는 것은 무엇일까?

태그는 일반적으로 이미지의 특정 버전을 나타내는 것으로, 자신이 테스트하고 싶은 버전이 있다면 해당 버전의 태그를 가진 이미지를 가져와서 테스트할 수 있다.

📌 Docker Container

도커 컨에티너는 앞서 설명한 도커 이미지의 실행가능한 인스턴스를 의미한다. 즉, 특정 버전의 이미지에 포함되어 있는, 소스 코드, 라이브러리 등을 실행한 상태이다.

만약 도커 이미지를 도넛 틀, 도넛 레시피라고 비유한다면, 도커 컨테이너는 해당 레시피를 이용하여 만든 도넛으로 비유할 수 있다. 하나의 도넛 레시피에서 여러 가지 맛이 나는 도넛을 만들 수 있는 것처럼, 하나의 이미지를 통해 여러 개의 도커 컨테이너를 만들 수 있다.

또한 기존에 만들어진 도넛들은 도넛 레시피를 수정하더라도, 이미 기존 레시피로 만들어진 도넛에는 영향이 없듯 도커 이미지를 변경하더라도 이미 실행중인 도커 컨테이너에는 영향을 주지 않는다.

즉 각각의 도넛, 컨테이너들이 완전 독립된 환경을 가진다고 생각할 수 있다.

참고

profile
Happy Day 😊❣️

0개의 댓글