Docker에 대한 정보를 찾아보면서 정리를 하는 글.
우선 공식 홈페이지에 있는 유튜브 동영상을 보면서 왜 도커가 생겨났으며, 도커는 어떤 식으로 작동하는지에 대한 초본이다.
Peter McKee는 이렇게 말한다. "so why docker there's a problem right now we have a lot of individual machines VMs runnning with OS is running in those whether it's on bare metal or inside of a VM and these operating systems are hard to maintain they're hard to keep up to date you have to patch them with security patches you have to install all the dependencies and you have to upgrade the operating system and then you have to install your application code on it and configure"
*베어 메탈이란?
하드웨어의 리소스를 공유하는 가상화 방식과는 다르게 하드웨어의 모든 성능을 사용할 수 있는 방식이 베어 메탈 방식
간단히 정리해보면
가상화 시스템을 사용하는 것은 특정 OS의 유지보수에 대해 수많은 어려움들이 있다. 예를 들면 최신화, 보안, 종속성, 애플리케이션 재배포 등등.. 또한 특정 서버가 오류가 발생할 경우는 여러 계층을 살펴봐야 하며, 레이어에서 꺼내어 수정해야 하며 다시 레이어 안에 넣는 것 자체도 어려웠는데,
docker는 이에 관한 솔루션을 가지고 있으며 솔루션은 docker의 containers이다.
우선 컨테이너에 대해서 자세히 알아보기로 했다.
Docker는 시작점이 LXC라는 컨테이너 기술을 기반으로 만들어진 상위 컨테이너 기술입니다. 현재는 runC라는 기술을 기반으로 하지만 도커가 접근했던 LXC컨테이너 기술에 대해서 조금 더 살펴보기로 했습니다.
리눅스 컨테이너란?
리눅스는 기본적으로 루트= '/'를 시작점으로 한 단 하나의 파일 시스템으로 존재합니다. 그 이후 각종 디바이스, 파일, 다양한 것들이 루트 파일 시스템에 마운트 되어 확장되는 방식으로 알고 있습니다. 도커는 이 단일 리눅스 시스템에 동작하고 있는 프로세스들을 격리시켜 각 프로세스마다 독자적인 리눅스 시스템 환경을 구축하는 것으로 시작한 것 같습니다. 이것이 리눅스 컨테이너라고 불립니다. 그렇기에 각 프로세스마다 독자적인 커널이 존재하며 또는 호스트 커널을 공유해서 사용할 수 있는 것이 아닐까 생각합니다.
가상화는 하이퍼바이저를 통해 독립적인 OS의 설치가 필요했고 호스트 OS의 리소스들을 칼같이 제한해서 배분했다면, 리눅스 컨테이너는 하나의 리눅스 시스템에서 프로세스들을 격리시키는 개념이므로 호스트 OS의 리소스를 프로세스가 동작에 필요한 자원만큼을 사용할 것입니다. 가상화와 다르게 각 컨테이너마다 OS를 설치하는 것이 아니기에, 특정 애플리케이션 환경만 따로 간편하게 구축을 할 수 있게 되어 구축에 필요한 전체적인 메모리도 줄어들게 되겠지요.
이러한 모든 장점은 실제 개발환경에서 무겁고 느린 가상화 대신 손쉽고 빠르게 개발 및 배포를 할 수 있는 것입니다.
사실 이러한 컨테이너라는 기능이 나올 수 있는 근간은 리눅스 커널에서 제공하는 기능 덕분입니다.
도커의 공식문서에 리눅스 커널이 제공하는 기술과 관련된 기술을 다음과 같이 나열합니다.
- namespace
- Apparmor와 SELinux profile
- Seccomp Policy
- Chroots
- Kernel capability
- CGroups
그중 동영상에서 언급된 namespace, chroots , cgroups에 대해서 살펴보겠습니다.
chroots
컨테이너는 개별적인 프로세스라고도 할 수 있습니다. 독립적으로 실행되니까요. 그리고 이러한 컨테이너들은 리눅스 시스템을 따릅니다. chroots는 프로세스의 최상위 디렉터리 (루트)를 변경하는 것을 의미하며 변경 후 어떠한 프로세스를 실행하면 이 프로세스는 변경된 디렉터리를 루트 디렉터리로 인식합니다. 분명 변경된 루트 디렉터리는 시스템 최상위 루트 디렉터리 아래에 생성될 것입니다. 이 구조는 하위 디렉터리에서는 상위 디렉터리로 접근하지 못하기 때문에 해당 컨테이너에서 실행되는 프로세스는 상위 디렉터리에 접근을 제한할 수 있게 됩니다.
namespace
컨테이너로 격리되면 프로세스 네임스페이스와 권한, 그리고 네트워크도 모두 격리되게 됩니다. 네임스페이스로 각각 컨테이너에서 실행된 프로세스가 시스템(user, file, network, hostname, process.. etc)에 대해서 독립되어 볼 수 있도록 구현해 줍니다.
리눅스 커널에서는 여러 namespace를 지원하는데, 파일 시스템 마운트, pid, net, ipc, uts. user 등을 지원한다.
Cgroups
이 기능은 각 (컨테이너=프로세스)가 사용할 수 있는 시스템 리소스를 제한해 준다. 어떠한 리소스들이냐면 메모리, cpu, I/O , 네트워크, device 노드들입니다.
이러한 리눅스 컨테이너 기술인 LXC, LibContainer, runC 등은 OCI(Open Container Initative) 스펙을 구현한 컨테이너 기술의 구현체입니다. docker는 1.11 버전부터 OCI의 구현체인 runC를 이용합니다.
도커를 사용한다는 것은 이전 기술의 문제점을 컨테이너라는 해결책으로 해결을 할 수 있고,
그 컨테이너 기술은 어디서 왔고 어떠한 식으로 작동되는지, 도커를 사용하면 어떠한 장점이 있는지 알아보았다.
도커를 이해하기 위한 지식을 공부를 먼저 하다 보니 글이 길어졌는데 끊고 다음에는 이미지에 대해서 다뤄볼까 한다.
'DevOps > Docker' 카테고리의 다른 글
window 10 wsl2 도커 완벽 설치가이드 (0) | 2022.12.25 |
---|---|
Docker 공식 이미지 가져오기 (0) | 2021.02.20 |
Dockerfile부터 push까지 (0) | 2021.02.20 |
Docker 시작 (0) | 2021.02.20 |
Docker(2) (0) | 2021.02.10 |
댓글