Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

하마롱크의 블로그

Docker 본문

Docker

Docker

하마롱크 2021. 11. 7. 08:51

Docker는 대표적인 컨테이너 엔진이다. 애플리케이션이 움직이는 환경을 컨테이너라는 단위로 가상화하고, 이와 더불어 컨테이너의 베이스가 되는 이미지를 빌드(build)하고, 이미지 배포를 위한 Docker Hub와 같은 저장소도 갖추고 있다. 

 

컨테이너란?

컨테이너는 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같이 응용 프로그램을 실행하는 데 필요한 모든 것을 포함하는 경량의 독립 실행형 소프트웨어 패키지이다. 컨테이너 이미지는 런타임에 컨테이너가되고 Docker 컨테이너의 경우 이미지가 Docker Engine에서 실행될 때 컨테이너가 된다. 컨테이너는 환경에서 소프트웨어를 분리하고 개발과 준비 사이의 차이점에도 불구하고 소프트웨어가 균일하게 작동하도록 보장한다.

 

컨테이너와 가상머신 

컨테이너는 하이퍼바이저와 완전히 다르다. 가상머신은 Host OS 위에 하이퍼바이저를 설치하고, 그 위에 Guest OS를 동작시키는 형태로, 하나의 서버를 여러 서버로 전환시키는 물리적 하드웨어를 추상화하는 것이다.  OS와 커널이 통째로 가상화가 되는 것이다. 반면에 컨테이너는 Host OS의 커널을 공유하면서 분리된 프로세스로서 실행해 마치 가상머신이 움직이고 있는 것처럼 보이게 하는 기술이다. 하이퍼바이저와 다르게 Guest OS가 없으므로, 가상머신에 비해서 가볍고 빠르게 동작할 수 있다. 

 

하이퍼바이저는 사용에 따라 성능 저하가 발생하거나 메모리, 디스크와 같은 리소스를 가상환경에 확보할 필요가 있어 리소스 소비량이 많아진다는 단점이 있었다. 이해 비해 컨테이너는 Host OS 상의 프로세스로, 각각 컨테이너의 형태로 움직이며, 격리된 컨테이너의 프로세스에서 다른 컨테이너나 호스트 환경의 프로세스에 접속할 수 없다. 

컨테이너에 대해 별고의 루트디렉토리가 할당되어 호스트 환경과는 별도의 네트워크와 IP주소를 할당한다. 그리고 각 컨테이너에서 실행되는 프로세스에 대해서도 사용할 수 있는 호스트 환경의 CPU와 메모리 등의 리소스 제한을 설정할 수 있다.  

 

프로세스 격리에는 Host OS에서 실행되는 커널 기능이 사용된다. 리눅스에서 실행되는 도커는, 프로세스 격리를 위해 리눅스 커널이 제공하는 gcroup이 사용되고, 루트 디렉토리를 경리하는 데에는 chroot가 사용된다.

컨테이너 내에서 볼 수 있는 파일은 이미지 형태로 처리되고, 실제로는 호스트 환경의 파일 시스템에서 파일로 추출된다. 파일시스템의 기능(Aufsd와 OverlayFS)을 사용함으로써 동일한 이미지와 함께 실행 중인 컨테이너가 같은 파일에 기록되지 않으면 동일한 파일을 참조한다. 이러한 이유로 도커에서 사용하는 컨테이너형 가상화는 하이퍼바이저형 가상화보다 소비자원이 적다는 장점이 있다.

 

Docker 컨테이너

도커는 리눅스 상에서 컨테이너 방식으로 프로세스를 격리해서 실행하고 관리할 수 있도록 해주며, 계층화된 파일 시스템에 기반헤 효율적으로 이미지를 구축할 수 있도록 지원한다. 도커를 사용하여 이미지를 기반으로 컨테이너를 실행할 수 있다. 이미지를 파일로 보관하고, 원격저장소를 통해 편리하기 공유도 가능하며, 도커가 설치된 환경에서는 이미지를 컨테이너로 실행하는 것이 가능하다. 

 

Docker 이미지

도커에는 immutable infrastructure(불변인프라) 개념이 도입되어 있다. 이미지로 이미 만들어진 환경을 변경하지 않고, 컨테이너가 움직이는 동안은 파일을 변경해도 원본이미지가 변경되지 않는다. 도커에서는 애플리케이션이나 패키지 업데이트도 새로운 이미지를 만들고, 이를 바탕으로 한 컨테이너를 다시 시작하여 수행한다.

일반적으로 서비스가 실행 중인 상태에서 패키지 설치 등이 이루어지는 것과 다르게 도커 이미지를 빌드할 때는, 서비스가 움직이지 않은 상태에서 커맨드 자체만이 실행된다. 그리고 도커 이미지 빌드는 항상 이전 단계의 이미지에 변경 사항을 저장하는 형태로 실행되기 때문에 항상 새로운 환경에서 새로운 패키지를 넣는 형태로 실행된다. 또한 서비스가 실행되는 시점은 컨테이너가 실행되는 시점이므로, 빌드 때 변경된 설정을 다시 읽어들이거나 재시작하는 과정도 필요하지 않다. 

 

 

[출처]

사쿠라이 요이치로, 무라사키 다이스케 저, "도커실전 가이드(영진닷컴)"

https://www.growin.co.kr/docker