Docker and Container
Container
먼저 컨테이너란 무엇일까요? 컨테이너는 Docker의 정식 홈페이지에서 다음과 같이 정의하고 있습니다.
Package Software into Standardized Units for Development, Shipment and Deployment
컨테이너는 애플리케이션에게 격리된 실행 환경을 제공해주는 가상화 기술입니다. 컨테이너 단위로 OS, Library, Application을 패키징 할 수 있습니다. 컨테이너 기술을 통해 하나의 OS 상에서 여러 애플리케이션을 독립적으로 실행시킬 수 있습니다.
Why container?
그러면 왜 컨테이너 기술을 사용할까요? 그 이유는 다음과 같습니다.
- 컨테이너 이미지를 서비스 별 배포 단위로 만들어서 사용
- 컨테이너 이미지는 불변
- 배포와 롤백이 용이
- 리소스 사용의 효율성 증대
- MSA(Micro Service Architecture)에 적합
Technology
이러한 컨테이너 기술을 가능하게 하는 기반 기술들이 존재합니다. 그러한 기반 기술들에 대해 살펴보도록 하겠습니다.
Namespace
프로세스에게 격리된 실행 환경을 제공하고 서로가 충돌 나지 않게 하는 기능입니다. 리눅스 커널에선 6가지 namespace 지원하고 있습니다.
- mnt(파일시스템 마운트) : 호스트 파일 시스템과 상관없이 독립적으로 파일 시스템을 마운트하거나 언마운트 가능
- pid(프로세스) : 독립적인 프로세스 공간 할당
- net(네트워크) : namespace 간 network 충돌 방지
- ipc(SystemV IPC) : 프로세스간 독립적인 통신 통로 할당
- uts(hostname) : 독립적인 hostname 할당
- user(UID) : 독립적인 사용자 할당
cgroups(Control Groups)
cgroups는 자원에 대한 제어를 가능하게 해주는 리눅스 커널의 기능입니다. 제어 가능한 자원은 아래와 같습니다.
- 메모리
- CPU
- I/O
- Network
- device 노드(/dev)
cgroup으로 그룹핑된 프로세스들은 리소스별로 정해진 양만 사용 가능합니다.
Union Filesystem
서로 다른 파일 시스템이나 디렉터리를 합쳐서 하나의 논리적인 파일 시스템으로 컨테이너에게 제공됩니다. Union Filesystem을 살펴보기 전에 먼저 Union mount에 대해서 알아야 합니다. Union mount는 다음과 같습니다.
- Union mount
- 복수의 파일 시스템을 하나의 파일 시스템으로 마운트 하는 기능
- 두 파일 시스템에서 동일한 파일이 있다면 나중에 마운트된 파일 시스템을 오버레이함 - 하위 파일시스템에 대한 쓰기 작업은 CoW(Copy on Write) 전략에 따라 복사본을 생성하여 수행하므로 원본 파일시스템은 변하지 않음
그럼 Union Filesystem에 대해 살펴보도록 하겠습니다.
- Union Filesystem
- UnionFS : Linux, FreeBSD, NetBSD를 위해 초기에 구현된 Union Filesystem
- AUFS(Advanced Union File System)
- UnionFS를 완전히 재작성하여 신뢰성과 성능을 개선하고 Writable Branch Balancing과 같은 새로운 개념을 도입
- 그러나 주류 리눅스 커널에는 반영이 안 됨
- Overlay
- 주류 리눅스 커널에 통합된 버전
Docker
Docker는 컨테이너를 이미지 파일로 빌드하고 배포하여 어디서나 실행할 수 있게 해 줄 수 있는 오픈소스 프로젝트입니다. Docker는 클라이언트(docker)와 서버(dockerd)로 구성되어 있습니다. 클라이언트에서 명령어를 서버로 전송해서 실행합니다.
docker의 동작 방식은 다음과 같습니다.
- Docker 이미지 빌드를 위해 Dockerfile 작성
- Docker 이미지 빌드를 dockerd에 요청
- dockerd에서 이미지를 빌드하고 로컬에 저장
- push 명령어를 요청하면 로컬에 저장되어 있는 빌드된 이미지를 docker registry에 전송
- run 명령어를 서버에 전송하면 docker 서버는 registry에 있는 이미지를 로컬에 다운로드하고 컨테이너를 시작
오늘은 docker와 docker의 기반 기술이 되는 container에 대해 알아보았습니다. 다음 시간에는 이러한 container들을 orchestration 할 수 있는 kubernetes에 대해 알아보도록 하겠습니다.