Docker는 도대체 뭘까??

Kyle·2022년 10월 12일
0
post-thumbnail

docker의 로고는 너무너무 귀엽다..!!

새로운 프로젝트 팀에 참여하는 과정에서 docker에 대한 얘기를 듣게 되었다.

docker desktop설치라는 문구를 보고 docker를 띡- 설치했다.

그런데 docker가 뭐지..?

docker와 devops에 대해 얘기는 많이 들었지만 정작 어떤 것인지 몰랐다.
심지어 올해까지만 해도 devops의 뜻도 모르고 있었던 것 같다.

왜 사용하는지 모르는 상태로 사용하는 것은 개발자로써 지양해야 하는 자세라고 생각이 되었고 앞으로 합류하게 될 사람들도 같은 궁금증을 가지고 있을 수도 있어 팀장의 허락을 받고 이를 정리하여 팀 자료에 추가적으로 기록하였다.

이번 기회에 알게 된 Docker, 가볍게 찍먹해보자

Docker란?

Docker란 리눅스 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 간단히 풀어보자면 원하는 개발 환경을 파일에 저장하면 docker를 통해 어떤 버전 및 OS에서도 해당 환경을 시뮬레이션 할 수 있도록 돕는 기술이다.

💡 docker를 이해하기 위해서는 가상화, 컨테이너에 대한 이해가 선행되어야 한다.

가상화란?

컴퓨터의 성능을 더욱 효율적으로 사용하기 위해 등장한 기술로 리소소를 최대한으로 활용하는 방법이다.

서로 다른 3개의 물리 서버가 있다고 가정해 보자. 하나는 메일 서버이고, 다른 하나는 웹 서버이고, 나머지 하나는 내부 레거시 애플리케이션을 실행하는 서버이다. 각 서버는 실행 용량의 일부인 30% 용량만 사용하고 있다. 그러나 내부 운영을 위해서 레거시는 계속 필요하므로 레거시 애플리케이션과 이를 호스팅하는 세 번째 서버를 유지해야 한다.

위의 사진처럼 1개의 서버와 1개의 운영 체제, 1개의 태스크와 같이 개별 서버에서 개별 태스크를 실행하는 것이 더 쉽고 안정적인 경우가 많지만 가상화를 사용하면 메일 서버를 2개의 고유한 서버로 분할해 독립적인 태스크를 처리하고 레거시 애플리케이션을 마이그레이션할 수 있다.

첫 번째 서버를 다시 분할해 다른 태스크를 처리하면 사용률을 30%에서 60% 또는 90%까지도 높일 수도 있다. 이 상태에서 빈 서버를 재사용해 다른 태스크를 처리하거나 모든 서버를 사용 중지해 냉각 및 유지관리 비용을 줄일 수 있다는 장점이 있다.

Linux 컨테이너란?

Linux 컨테이너는 실행에 필요한 모든 파일을 포함하여 실행 환경에서 애플리케이션을 패키지화하고 분리하는 기술이다. 이를 통해 전체 기능을 유지하면서 컨테이너화된 애플리케이션을 환경(개발, 테스트, 생산 등)간에 쉽게 이동할 수 있다.

VM vs Container

한 운영체제 위에서 동일한 어플리케이션을 각각의 고립된 다른 환경에서 구동하기 위해서는 Host OS위에 Hypervisor라는 가상머신(VM)을 생성하고 구동하는 소프트웨어가 필요하다.

Hypervisor 는 Host OS의 자원을 Guest OS들에게 할당하고 각각의 Guest OS는 상호 간섭하지 않고 분리된 환경에서 구동된다.

Host OS는 베이스가 되는 기존 환경, Guest OS는 가상 머신으로부터 분할된 각각의 환경을 가리킨다.

VM의 가상화 과정에서는 필연적으로 Hypervisor를 거치기 때문에 속도 저하 및 성능 저하가 발생하고 VM은 해당 환경을 구동하는데 필요한 파일을 전부 새로 만들기 때문에 VM을 배포할 때 만들어지는 이미지의 크기가 매우 커진다는 한계가 있다.

ContainerVM을 경량화 한 컨셉이다. Container는 Host OS를 공유하면서 필요한 프로세스만 격리하는 방식인데 Host OS 위에서 구동하고 별도의 Guest OS가 없기 때문에 Host OS와 다른 OS는 구동할 수 없다. 대신 경령화의 컨셉에 맞춰 격리시킬 애플리케이션과 필요한 파일이나 특정 라이브러리 등 종속 항목만 포함하기 때문에 배포를 위해 생성되는 이미지의 용량이 작아지고 Hypervisor를 거치지 않기 때문에 실행 속도 또한 빠르다는 장점이 있다.

💡 Image요? Img?
docker에서 일컫는 이미지라 함은 그림 형식이 아닌 컨테이너 생성에 필요한 모든 파일과 설정값을 지니고 있는 형태를 말한다.
ex) Ubuntu의 이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있다.

Docker의 역할

Docker를 이용하면 이미지를 실행시켜 컨테이너로 만들거나 생성된 컨테이너를 관리하고 다시 이미지로 만드는 작업을 간단하게 진행할 수 있다. 주로 다른 라이브러리와 충돌하는 것을 방지하기 위해 격리된 환경이 필요할 때, 완성된 서비스를 배포할 때, 혹은 배포 중인 서비스를 받아서 실행해 볼 때도 유용하게 사용이 된다.

profile
불편함을 고민하는 프론트엔드 개발자, 박민철입니다.

0개의 댓글