Docker는 Go 언어로 작성된 오픈 소스 가상화 플랫폼으로, 리눅스 컨테이너를 기반으로 합니다. Docker 0.9 버전부터는 자체 개발한 libcontainer 컨테이너를 사용하고 있습니다.
컴퓨터의 성능 향상에 따라 가상화 기술이 주목받게 되었는데, 이는 컴퓨팅 리소스를 더 효율적으로 활용하기 위한 방법입니다. 서버 관리자로서 보았을 때, CPU 사용률이 단지 10%에 불과한 서버는 리소스가 낭비되는 것으로 보일 수 있습니다.
그러나 모든 서비스를 한 서버에 두는 것은 안정성 문제를 야기할 수 있습니다. 이런 문제를 해결하기 위해, 안정성을 향상시키면서도 리소스를 최대한 활용할 수 있는 방법으로 서버 가상화가 등장하였습니다. 가장 대표적인 가상화 플랫폼으로는 VM이 있습니다. VM은 운영 체제를 가상화하는 것으로 널리 알려져 있습니다.
그렇다면 컨테이너는 무엇일까요?
컨테이너란?
컨테이너는 가상화 기술의 한 형태로, LXC(Linux Container)가 대표적인 예입니다. 기존의 OS 가상화와 달리, 컨테이너는 OS 레벨에서 프로세스를 격리하여 가상화합니다.
그렇다면, 한 서버에서 여러 OS를 가상화하여 사용하는 방식과, 컨테이너 방식으로 프로세스를 격리하여 동작하는 방식은 어떤 차이점이 있을까요?
VM 가상화 플랫폼과 Docker 가상화 플랫폼의 차이
우리에게 익숙한 VM이란 가상화 플랫폼은 Host OS 위에 가상화를 위한 Hypervisor 엔진을 두고, 그 위에 Guest OS를 올려 사용합니다. 이는 가상화된 하드웨어 위에 OS가 올라가는 형태로, Host와 거의 완벽하게 분리된다고 볼 수 있습니다.
반면에 Docker 같은 컨테이너 기반 가상화는 Docker 엔진 위에 필요한 바이너리만 올라가게 됩니다. 이는 OS 가상화와 다르게 Host OS와 완전히 분리되지는 않지만, Host의 커널을 공유함으로써 IO 처리가 쉽고, 성능 효율을 높일 수 있습니다.
컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라, Host OS의 자원을 분리하여 여러 환경을 만들어내는 방식입니다. 그래서 컨테이너 기반 가상화는 OS 가상화에 비해 더 가볍고 빠르다는 장점이 있습니다. 하지만 이렇게 설명하면 컨테이너 기반이 OS 가상화보다 뛰어나다고 생각할 수 있지만, 그렇지는 않습니다.
OS 가상화는 컨테이너 기반 가상화보다 더 높은 격리 레벨을 제공하며, 보안 측면에서도 더 유리합니다. 또한, 커널을 공유하지 않아 다양한 OS를 동시에 사용할 수 있다는 장점이 있습니다.
이런 이유에도 불구하고 Docker를 사용하는 이유는 성능 향상, 뛰어난 이식성, 그리고 쉽게 확장할 수 있는 유연성 때문입니다.
이러한 특성들은 Docker를 효과적인 도구로 만들어주어서 많은 개발자들에게 사랑받게 하였습니다.
Docker Image에 대해 알아보기
Docker Image란, 컨테이너를 실행할 수 있도록 필요한 실행 파일과 설정 값들을 포함하고 있는 것입니다. 이는 마치 컨테이너에 담겨 실행될 프로그램이라고 생각하면 이해하기 쉽습니다.
그렇다면 이 Docker Image는 어떻게 생성되는 것일까요? 이미지가 어떻게 만들어지는지를 알아보는 것은 Docker를 이해하는데 중요한 단계입니다.
그러므로 이에 대해 먼저 살펴보도록 하겠습니다.
Docker 이미지를 만드는 과정은 계층적이라고 볼 수 있습니다.
예를 들어, Ubuntu 이미지를 만들기 위해 Layer A, B, C가 필요하다고 가정해봅시다. 이렇게 만들어진 Ubuntu 이미지는 기본 베이스 이미지로 사용될 수 있습니다.
그 다음으로 Nginx 이미지를 만들고자 한다면, 이미 생성된 Ubuntu 이미지 위에 Nginx Layer만 추가하면 됩니다. 이렇게 하면, 실제로는 Layer A, B, C 그리고 Nginx가 합쳐진 이미지가 생성되지만, 과정적으로 보면 Ubuntu 이미지에 Nginx가 추가된 것으로 볼 수 있습니다.
이제 만약 Web App 이미지를 만들고자 한다면 어떻게 될까요? Ubuntu 이미지에 Nginx와 Web App을 모두 추가하는 것이 아니라, 이미 만들어진 Nginx 베이스 이미지 위에 Web App만을 추가하여 이미지를 만들게 됩니다. 이렇게 Docker 이미지는 여러 계층의 Layer로 구성되며, 필요한 부분만 추가하는 방식으로 효율적으로 이미지를 관리할 수 있습니다.
이제 이러한 이미지를 실제로 만드는 방법에 대해 알아보기 위해, Dockerfile에 대해 알아봅시다.
Dockerfile은 Docker 이미지를 생성하기 위한 설정 파일로, 이미지 생성 과정을 단계별로 명시하고 있습니다.
'docker build' 명령을 통해 Dockerfile에 기술된 내용대로 Docker 이미지를 생성할 수 있습니다.
Dockerfile의 중요성과 활용
Docker Hub는 Docker Image들을 저장하고 배포하는 중앙 저장소로, 많은 회사들이 여기서 소프트웨어를 배포하고 있습니다.우리는 Docker Hub에서 Image를 pull하여 간단하게 컨테이너에 넣어 사용할 수 있습니다.
그러나, 때때로 기존의 배포판이 아닌, 사용자가 직접 커스텀한 이미지를 만들고 싶을 수 있습니다. 그럴 때 사용하는 것이 Dockerfile입니다.
Dockerfile은 이미지를 생성하기 위한 설계도라고 볼 수 있습니다. 여기에는 이미지를 구성하기 위한 명령어들이 순서대로 작성되어 있습니다. 이를 통해 우리는 어떤 Base Image를 사용하고, 어떤 소프트웨어를 설치하며, 어떤 설정을 변경하는 등의 과정을 통해 최종적인 Docker Image를 만들 수 있습니다.
즉, Dockerfile을 읽을 수 있다면 해당 이미지가 어떻게 구성되어 있는지 이해할 수 있습니다. 또한, Dockerfile을 수정하고 다시 build하면 자신만의 커스텀 Docker Image를 만들 수 있습니다.
이러한 이유로 Dockerfile은 Docker를 활용하는 데 있어 중요한 요소입니다.
Docker Hub와 Docker Registry의 이해
Docker Hub는 Docker Image들을 저장하고 관리하는 공공 저장소로, 여러 회사들이 Docker로 만든 소프트웨어를 배포하기도 하고, 공개 이미지를 공유하기도 합니다.
Docker Hub를 통해 사용자들은 이미지를 쉽게 pull 받아 컨테이너에 적용시킬 수 있다고 설명 드렸습니다. 이는 GitHub에서 소스 코드를 관리하고 공유하는 방식과 유사하게 생각하면 이해하기 쉽습니다.
그렇다면 Docker Registry는 무엇일까요? Docker Registry는 Docker Hub와 비슷한 역할을 하지만, 비공개적으로 사용할 수 있는 Docker 이미지 저장소입니다.
Docker Registry를 사용하면, 공개되지 않아야 하는 민감한 정보나 특정 조직 내부에서만 공유해야 하는 이미지 등을 안전하게 관리하고 배포할 수 있습니다. 따라서, Docker Registry는 Docker Hub와는 다르게, 사용자가 직접 서버를 운영하여 비공개적으로 Docker 이미지를 저장하고 관리하는 방식을 제공합니다.
위 그림은 Docker Image를 Pull받기 위한 url이 어떤식으로 작성되는지 설명해줍니다.
url을 적지 않는다면 default값으로 Docker Hub에서 Image를 pull 받게되고 url을 적어준다면 사설 저장소에서 이미지를 받을 수 있습니다.
Docker 아키텍처
Docker의 핵심 개념과 구성에 대해서 알아보았습니다.
Docker가 어떻게 구성되고 동작하는지를 이해하는 것은 Docker를 효과적으로 활용하는 데 있어 중요한 단계입니다. Docker의 사용량은 꾸준히 증가하고 있으며, 이제는 Docker를 모르는 사람이 거의 없을 정도로 널리 사용되고 있습니다. Docker는 격리된 프로세스를 통해 이식성과 유연성을 제공합니다.
이러한 장점 때문에 Docker는 서버 관리의 새로운 표준이 되었으며, IT 분야에서 광범위하게 활용되고 있습니다. Docker는 애플리케이션의 개발, 테스트, 배포 과정을 단순화하고, 환경에 구애받지 않는 일관된 작업을 가능하게 합니다. 또한, 마이크로서비스 아키텍처와 같은 현대적인 애플리케이션 아키텍처를 구현하는데 있어 핵심적인 도구로 사용되고 있습니다.
이처럼 Docker는 IT 업계에서 높은 가치를 인정받고 있으며, 앞으로도 그 중요성은 계속해서 증가할 것으로 예상됩니다.
REFERENCE
https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90
'DevOps > Docker' 카테고리의 다른 글
Docker 기본 명령어(Linux) (0) | 2023.11.23 |
---|---|
Docker 설치 방법(Ubuntu) (0) | 2023.11.23 |
Docker 및 기타 프로그램 환경설정 및 설치 (0) | 2023.06.05 |