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

[Docker & Kubernetes] 4. Docker의 동작 구조

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

 

 

 

이번 포스팅에서는 Docker라는 녀석이 어떤 구조를 가지고 있는지 알아보려한다. 도대체 dockerfile이라는 것은 무엇이기에 Docker Image(이미지)를 생성할 수 있는 것인지, 그리고 Docker Image는 무엇이기에 Docker Container를 생성하여 구동할 수 있는 것인지, 그리고 Docker Registry는 무엇인지, 그리고 앞서 설명한 이 요인들의 관계가 어떻게 되는지 하나씩 보려 한다. 

 

새로운 시스템을 접하면, 그 시스템이 전체적으로 어떻게 구성되어 있는지 알고 있어야 세부적인 부분이 보인다. 따라서 필자는 Docker가 돌아가는 방식에 대해 큰 그림부터 먼저 제시하려 한다.

 

 

1. Docker의 구조

 

아래의 그림을 참고하자.

 

리눅스(필자는 CentOS에 docker를 설치했다)에 docker 설치가 막 끝난 상태라면, docker 명령어를 사용할 수 있을 뿐, 어떠한 이미지나 컨테이너도 가지고 있지 않다. 그리고 인터넷에는 docker 이미지를 저장하는 저장소(Registry)가 존재한다. 주소는 hub.docker.com이다.

 

 

 

현재는 아무런 작업도 진행하지 않은 상태라, 이 둘의 관계가 어떻게 되는지 감이 오지 않을텐데, 이 관계를 알아보기 위해 docker의 주요 키워드와 그들의 관계에 대해 먼저 알아봐야 한다. 바로 Dockerfile, 이미지 그리고 컨테이너라는 개념이다.

 

 

 

2. Dockerfile, 이미지, 컨테이너

 

위에서 보았던 docker registry는 잠시 제쳐두고, docker 서버에만 집중을 해보자.

 

이전의 포스팅에서 docker의 배경에 대해 설명하면서, docker는 리눅스의 LXC 기술을 활용하여 경량 가상화를 실현한다고 했다. 즉, VMWare처럼, 환경 구성에 필요한 OS 설치와 기타 설정을 개발자나 엔지니어가 직접 구성하는 것이 아니라, 그 환경에 대한 정보를 파일로 정의하고 그 내용을 고스란히 구현한다고 보면 된다. 따라서 가상화 환경을 구축하더라도 기존의 가상머신에 비해 훨씬 가볍도 빠르게 동작할 수 있는데다, 별도의 설정 작업을 필요로 하지 않아 훨씬 효율적이다. 

 

그럼 이 정보를 저장하는 파일은 무엇일까? docker에서는 환경 정보를 저장하는 파일을 Dockerfile이라고 한다. 이 Dockerfile은 컨테이너 구동에 필요한 정보를 사람이 직접 작성한 파일이라고 보면 된다. 

 

하지만 컴퓨터는 사람이 작성한 언어를 이해하지 못한다. 따라서 컴퓨터가 이해할 수 있는 형태(0과 1의 이진 형태)로 이 Dockerfile을 변환해주어야 하는데, 이 변환 과정을 거쳐 생성한 파일이 바로 이미지다. 따라서 이미지는 특정 환경에 대한 정보가 변하지 않고 저장되는 정적인 형태의 파일이라 보면 된다.

 

그런데, 정적 형태를 띄는 이미지는 의미가 없다. 어찌되었든 저 환경이 동적으로 구현되어야 가상화를 이끌어 낼 수 있기 때문이다. 즉, 이미지를 동적인 형태로 변경한 것이 컨테이너이며, 컨테이너가 구동된다는 것은 우리가 필요로하는 OS와 특정 환경이 경량 가상화로 구현된다는 것을 의미한다.

 

이제, Dockerfile과 이미지, 컨테이너 사이 관계를 그림으로 나타내보자.

 

 

 

 

3. docker 서버 내에서의 구조

 

docker 서비스를 설치하면 사용할 수 있는 docker 명령어를 통해, Dockerfile, 이미지, 컨테이너를 생성하고 구동하는 것이 가능하다. 아래는 이 세 인자의 관계와 명령어에 대해 아주 간략하게 표시한 도식이다.

당연하게도, docker 명령어는 위에 표시된 내용보다 훨씬 많다.

 

유심히 봐야 할 부분은 docker 이미지와 컨테이너 사이 관계다. 정적인 이미지가 동적인 컨테이너로 단순하게 생성되는 것으로는 가상화 구현이 되지 않는다. 생성된 컨테이너가 Linux의 프로세스에 올라가야, 즉 컨테이너의 구동(run)이 되어야만 경량 가상화로 구현이 되는 것이다. 조금 더 풀어서 설명하자면 컨테이너를 생성하는 것은 특정 환경을 다른 환경과 분리시킨다는 이야기고, 컨테이너를 구동하는 것은 분리된 환경을 프로세스화(daemonize라고도 한다)하여 특정 환경을 만드는 것이다.

 

 

4. Docker 서버와 Docker Hub의 관계

 

위의 도식만 보면 컨테이너를 만드는데 있어 토대가 되는 파일이 Dockerfile임을 알 수 있다. 하지만 Dockerfile은 처음 Docker를 시작하는 사람들이 바로 배우기에는 내용이 조금 어렵다. 따라서 docker에서는 특정 환경에 대한 이미지를 저장소에 저장하고, 이를 다운받아 사용할 수 있도록 시스템을 구성해놓았다.

 

Docker Hub는 Linux의 yum repository와 비슷한 역할을 하는 것이라 보면 된다. rpm 대신 이미지를 저장한다.

 

공식 Docker Registry는 Public Registry라고 하며, Public 외에 Private Registry를 만들어 운용하는 것도 가능하다. 이러한 저장소에 저장된 이미지를 docker 서버로 다운로드 하는 것을 pulling이라고 하며, 반대로 자신이 만든 이미지를 Registry에 업로드 하는 것을 Pushing이라고 한다.

 

 


 

원래는 docker의 주요 명령어와 함께 구조를 나타내려고 2주 전부터 포스팅을 작성하고 있었는데, 생각보다 글의 길이가 길어져 폭파하고 다시 작성했다. 다음 포스팅에서는 docker와 관련된 주요 명령어를 살펴보려 한다.

 

 

 

Fin.

 

 

반응형

댓글