Docker란?
- Container의 한 종류로 어플리케이션을 패키징할 수 있는 툴 : Application, SystemTools, Dependencies등을 담아, 어떤 OS든 동작이 가능하도록 하여 배포와 관리가 용이
- Docker Container Image : 가볍고 독립적이며 실행가능한 소프트웨어 패키지로 어플리케이션에 필요한 모든 것들을 포함(code, runtime, system tools, system libraries, settings.)
그럼 Container는 뭔데?
- Container는 코드와 모든 의존성들을 패키징한 소프트웨어의 표준 단위로 어플리케이션이 여러 컴퓨팅 환경에서 빠르고 신뢰성 있게 실행 가능하도록 함
- Containers는 Software를 환경에서 독립적일 수 있도록 하며, 소프트웨어가 일관적으로 동작하는 것을 보장함
Docker의 특징?
- Standard Docker는 Containers에 대한 산업 표준을 생성하고 그러한 Container들은 어디에서든 이동성을 보장
- Lightweight Containers는 machine의 OS시스템 커널을 공유하기 때문에, Application별 OS를 요구하지 않음. 덕분에, 높은 서버 효율과 서버 및 라이센싱 비용을 절감할 수 있음
- Secure Application들은 Containers 안에서 더 안전함. 또한, Docker는 강력한 default 독립성을 제공함
그럼, Docker랑 VM이 다른 건 뭔데?
- Container는 OS를 포함하지 않기 때문에, 훨씬 가벼움
1. Container
- app layer에서 추상화 되어있음
- 여러 containers가 같은 machine에서 동작 가능하며 OS kernel을 다른 containers와 공유하나, 각각은 사용자 공간에서 독립된 프로세스들로 동작함
- Containers는 VMs보다 공간을 적게 차지하며(container images are typically tens of MBs in size), 더 많은 applications를 다룰 수 있고 더 적은 VMs와 OS를 필요로 함
2. VM
- 물리적 hardware layer에서의 추상화(하나의 서버에서 여러 서버들로)
- hypervisor가 여러 VMs가 하나의 machine에서 동작될 수 있도록 함
- 개별 VM은 필요한 OS, application, binaries, libraries의 full copy를 가짐(taking up tens of GBs)
- VM은 부팅이 느릴 수 있음
- 자체 운영 체제(Operating System, OS)를 포함하고 있어 여러 리소스 집약적인 기능을 한 번에 수행할 수 있음
- VM에서 사용할 수 있는 리소스가 늘어남에 따라 전체 서버, OS, 데스크톱, 데이터베이스, 네트워크의 추상화, 분할, 복제, 에뮬레이션이 가능
3. 그 외 Container와 VM의 차이
- 하이퍼바이저는 VM에서 다양한 운영 체제를 구동할 수 있도록 허용하지만, 컨테이너는 단일한 유형의 운영 체제만 구동할 수 있음
4. 컨테이너가 HyperVisor를 완전히 대체할 수 있나?
- 컨테이너는 경우에 따라 하이퍼바이저의 대안으로 여겨지기도 하지만, 컨테이너와 가상화는 각기 다른 요구 사항을 충족하므로 확실히 그렇다고 할 수는 없음
그럼 HyperVisor는 뭔데?
1. 정의
- 가상머신을 생성하고 구동하는 소프트웨어
- 가상 머신 모니터(Virtual Machine Monitor, VMM)라고도 불리는 하이퍼바이저는 하이퍼바이저 운영 체제와 가상 머신의 리소스를 분리해 VM의 생성과 관리를 지원
2. 용어
- 하이퍼바이저로 사용되는 물리 하드웨어를 호스트라고 하며 리소스를 사용하는 여러 VM을 게스트라고 함
3. 역할
- 하이퍼바이저는 CPU, 메모리, 스토리지 등의 리소스를 처리하는 풀로, 기존 게스트 간 또는 새로운 가상 머신에 쉽게 재배치할 수 있음
4. 동작과정
- 모든 하이퍼바이저에서 VM을 실행하려면 메모리 관리 프로그램, 프로세스 스케줄러, I/O(입력/출력) 스택, 기기 드라이버, 보안 관리 프로그램, 네트워크 스택과 같은 운영 체제 수준의 구성 요소가 필요
- 하이퍼바이저는 할당되었던 리소스를 각 가상 머신에 제공하고, 물리 리소스에 대해 VM 리소스의 일정을 관리
- 물리적 하드웨어는 계속해서 실행 작업을 수행하므로 하이퍼바이저가 일정을 관리하는 동안 CPU가 VM에서 요청한 대로 CPU 명령을 계속 실행
5. HyperVisor의 이점
- 서로 다른 여러 개의 운영 체제를 나란히 구동할 수 있으며, 하이퍼바이저를 사용해 동일한 가상화 하드웨어 리소스를 공유
- 바로 이러한 부분이 가상화의 핵심적인 이점입니다. 가상화가 없다면 하드웨어에서 운영 체제를 1개만 구동할 수 있음
- 기타 참조 : 커널 기반 가상 머신(KVM)은 오픈소스 옵션으로 Linux® 커널에 포함되어 있음
Docker HostOS, GuestOS?
1. Docker의 구조
2. Base Image?
- Dockerfile example
FROM에 있는 Alpine은 Linux의 distro로, 예를 들어, 다른 distro인 Ubuntu를 대신 사용해도 됨
- 가령, Redhat Linux (RHEL)을 Host OS로 사용하는 경우에 왜 우리는 alpine을 Base Image로 사용할까? ⇒ 이 경우, 이러한 transform이 일어날 것
3. Linux Kernel과 Linux Distribution에 대해 먼저 이해해보자
- 모든 distros는 같은 Linux Kernel을 씀
- 다만, 각 distro의 목적에 최적화하기 위해 약간의 차이가 있을 뿐임(differ only in userland software) ⇒ userland software만 추가적으로 설치하면, 다른 distro 환경을 쉽게 모방이가능
- 가벼운 가상화는 같은 OS 내부에서 독립적인 공간을 가지는 것임 ⇒ Docker가 FreeBSD나 Windows를 Linux 내부에서 구동할 수 없는 이유
- Base Image는 Base OS가 아니며, Base Image가 Base OS보가 훨씬 가벼우며 이것이 docker containers가 매우 빠를 수 있는 이유임
- 오직 distro의 고유(or userland) software만 설치하고 host Lunux kernel을 사용함
4. 그래서 Base Image가 왜 필요한데?
- docker containers filesystem은 hostOS에서 독립적임 ⇒ docker image 내부의 application은 container로 구동되는 시점에 host filesystem에 접근할 수 없음
- Container 내부의 application이 다양한 OS 라이브러리들에 의존하고 있을 때, 이 어플리케이션의 구동에 대해 독립성을 유지하기 위해서는 그러한 의존성들을 Docker Image 내부에 패키징할 필요가 있음 ⇒ 이러한 이유로 다양한 Linux distros에 대하여 가능한 base images들이 존재함
(참조 : 영어원문)
So an application packaged inside a docker image wont be able to see the host filesystem(unless attached as volume) at the time of running as a container.This is why there are base images available for various Linux distros.
So, imagine the application you have inside the container depends on various OS libraries, so maintaining the isolation if we want to run the application we will have to package those dependencies too inside the Docker Image.
The docker containers filesystem is isolated from the host OS. - 또한, distro를 가지는 것은 그것의 package management 기능(yum/apt-get 등)을 가능하게 함 ⇒ docker image에 대하여 요구되는 의존성들을 디자인하는 것에 편의성을 제공
- Base Image 모습에 대해 다시 정리하자면, GuestOS는 완전한 OS가 아니며 단지 userland 혹은 distro 고유 libraries만으로 구성되어있음(essentially a part of "Bins/Libs" box of docker architecture and not a virtualized environment)
Linux Kernel은 그럼 뭔데?
1. Linux Kernel 정의
- Linux Kernel은 Linux 운영체제의 주요 구성 요소이자 컴퓨터 하드웨어와 프로세스를 잇는 핵심 인터페이스임
- 커널이라는 이름은 단단한 껍질 안의 씨앗처럼 OS 내에 위치하고 전화기, 노트북, 서버 또는 컴퓨터 유형에 관계없이 하드웨어의 모든 주요 기능을 제어하기 때문에 붙은 이름임
2. Linux Kernel의 기능?
- 커널의 기능?
- 메모리 관리 메모리가 어디에서 무엇을 저장하는 데 얼마나 사용되는 지를 추적
- 프로세스 관리 어느 프로세스가 중앙 처리 장치(CPU)를 언제 얼마나 오랫동안 사용할지 결정
- 장치 드라이버 하드웨어와 프로세스 사이에서 중재자/인터프리터 역할을 수행
- 시스템 호출 및 보안 프로세스의 서비스 요청을 수신
- 올바르게 구현된 커널은 사용자가 볼 수 없으며 커널 공간이라는 자신만의 작은 작업 공간에서 메모리를 할당하고 저장되는 모든 항목을 추적
- 웹 브라우저 및 파일과 같이 사용자가 볼 수 있는 것을 사용자 공간이라 하고 이러한 애플리케이션은 시스템 호출 인터페이스(SCI)를 통해 커널과 통신
⇒ (비유해보자면,)
- 커널은 강력한 경영진(하드웨어)을 위해 분주하게 일하는 개인 비서.
- 비서의 할 일은 직원 및 대중(사용자)으로부터 수신되는 메시지 및 요청(프로세스)을 경영진에게 전달하고, 어디에 무엇이 저장되어 있는지 기억(메모리)하고, 특정한 시간에 누가 경영진을 얼마 동안 만날 수 있는지 결정하는 것
3. OS 내에서 Kernel의 위치
- 커널과 관련하여 Linux 시스템은 다음과 같은 3개 레이어로 구성
- 하드웨어: 시스템의 토대가 되는 물리적 머신으로, 메모리(RAM)와 프로세서 또는 중앙 처리 장치(CPU) 그리고 입출력(I/O) 장치(예: 스토리지, 네트워킹 및 그래픽)로 구성. CPU는 계산을 수행하고 메모리를 읽고 씀.
- Linux 커널: OS의 핵심. 메모리에 상주하며 CPU에 명령을 내리는 소프트웨어임.
- 사용자 프로세스: 실행 중인 프로그램으로, 커널이 관리. 사용자 프로세스가 모여 사용자 공간을 구성. 사용자 프로세스를 단순히 프로세스라고도 함. 또한, 커널은 이러한 프로세스 및 서버가 서로 통신(프로세스 간 통신 또는 IPC라고 함)할 수 있도록 해줌.
- 시스템에서 실행되는 코드는 커널 모드 또는 사용자 모드라는 두 가지 모드 중 하나로 CPU에서 실행
- 커널 모드에서 실행 중인 코드는 하드웨어에 무제한 액세스가 가능한 반면, 사용자 모드에서는 CPU 및 메모리가 SCI를 통해 액세스하는 것을 제한
- 메모리도 이와 유사하게 구분(커널 공간 및 사용자 공간). 이러한 두 가지 작은 세부 사항이 보안, 컨테이너 구축 및 가상 머신을 위한 권한 구분과 같은 복잡한 작업의 토대가 됨
- 또한, 이는 프로세스가 사용자 모드에서 실패할 경우 손상이 제한적이며 커널에 의해 복구될 수 있음을 의미
- 그러나 커널 프로세스는 메모리와 프로세서에 액세스할 수 있기 때문에 충돌이 발생하면 시스템 전체가 중지될 수 있음.
- 안전 장치가 마련되어 있고 경계를 넘기 위해서는 권한이 필요하기 때문에, 사용자 프로세스 충돌은 일반적으로 큰 문제를 유발하지는 않음
- 또한 Linux 커널은 실시간 패치 적용 중에 계속 작업할 수 있으므로 패치가 보안 수정에 적용되는 동안 다운타임이 발생하지 않음
Linux distro는 그럼 뭐야?
1. 정의
- A complete Linux system package
- 대부분의 distributions는 특정 사용자 그룹을 위해 customized되어있음
2. Linux distro가 그래서 뭔데?
- 리눅스 OS는 하나의 조직에서 생산되지 않음(다른 조직과 사람들이 다른 parts를 작업 : Linux kernel (the core of the operating system), the GNU shell utilities (the terminal interface and many of the commands you use), the X server (which produces a graphical desktop), the desktop environment (which runs on the X server to provide a graphical desktop), and more. System services, graphical programs, terminal commands 등)
- 원한다면, the Linux kernel, GNU shell utilities, Xorg X server, and every other program on a Linux system의 source 코드를 저장하고 사용자 스스로 조립이 가능
- 하지만, 이는 굉장히 많은 시간과 노력을 필요로 함(involving with making all the different programs work properly together)
- Linux distribution이 이러한 일을 대신 해주는 것(taking all the code from the open-source projects and compiling it for you, combining it into a single operating system you can boot up and install)
- Linux distro는 여러 결정을 대신해줌(default desktop environment, browser, and other software)
- 또한, 새로운 software를 설치하거나 software의 새 버전을 업데이트하는 것에 대해서도 precompiled, packaged form을 제공하여 쉽고 빠르게 설치가 가능
Container환경에서 Alpine을 왜 많이 써?
- Alpine Linux?
musl libc과 busybox를 기반으로한 security-oriented, lightweight Linux distribution - Alpine Linux의 특징
- Small
- musl libc and busybox로 생성되어 작고 리소스 효율적임(A container requires no more than 8 MB and a minimal installation to disk requires around 130 MB of storage.)
- Binary packages가 축소 및 분할됨으로써, install에 대한 컨트롤 능력을 높여줌 => 환경을 가능한 간단하고 효율적으로 유지 - Simple
- Alpine은 고유의 패키지매니저를 사용하고(called apk, the OpenRC init system, script driven set-ups) 이것은 노이즈 없이 간단하고 명확한 Linux 환경을 제공함
- 사용자는 각자의 프로젝트에 필요한 packages를 추가하기만 하면 됨 - Secure
- Alpine Linux는 security를 염두에 두고 설계됨
- 모든 userland binaries는 Position Independent Executables (PIE) 로 컴파일됨(stack smashing protection)
- 이러한 사전 보안 기능들은 zero-day와 다른 취약점들과 관련된 전체 Classes의 악용을 예방할 수 있음
- Small
=> Small, Secure라는 특징으로 인해, Alpine을 Container환경에서 많이 사용하는 것으로 고려됨(다소 주관적 의견일 수 있음)
Docker를 쓰려면 알아야하는 것? (간단요약)
- Dockerfile : 어플리케이션의 실행 환경을 정의
- Image : 어플리케이션의 실행 환경의 SnapShot
- Container : Image를 담아서 실행
- Image가 Class라면, Container는 Instance
- 이미지는 불변, 각 컨테이너는 변경가능(각 컨테이너 변경사항은 이미지에 영향을 미치지 않음)
Docker의 사용과정? (간단요약)
- 각 컨테이너는 독립된 존재이므로, host의 port와 컨테이너의 port를 연결해줘야함 : port forwarding
추가적으로 알면 좋은 것
1. Docker Compose
Docker Compose 로 local 개발 환경 쉽게 관리하기
부탁드리는 사항
혹시 잘못된 내용이나 인용과 관련해서 문제되는 내용이 있다면, 그에 대해 알려주시면 정말 감사하겠습니다!
출처:
블로그에 사용한 이미지
https://www.docker.com/
https://www.youtube.com/watch?v=LXJhA3VWXFA&t=573s
https://www.youtube.com/watch?v=EbTJtanJUfE&list=PLuHgQVnccGMDeMJsGq2O-55Ymtx0IdKWf&index=3 HyperVisor
https://www.redhat.com/ko/topics/virtualization/what-is-a-hypervisor
Linux distros
https://www.techtarget.com/searchdatacenter/definition/Linux-distros-Linux-distribution https://www.howtogeek.com/132624/htg-explains-whats-a-linux-distro-and-how-are-they-different/ https://www.geeksforgeeks.org/what-are-linux-distributions/ https://www.suse.com/suse-defines/definition/linux-distribution/
Linux Conainers on Wins
https://www.docker.com/blog/preview-linux-containers-on-windows/ http://www.floydhilton.com/docker/2017/03/31/Docker-ContainerHost-vs-ContainerOS-Linux-Windows.html Conatiner
https://azure.microsoft.com/en-in/resources/cloud-computing-dictionary/what-is-a-container/#overview https://www.docker.com/resources/what-container/
Linux Kernel
https://www.redhat.com/ko/topics/linux/what-is-the-linux-kernel
Docker Compose
https://blog.gangnamunni.com/post/docker-compose-for-local-env/
Container와 Alpine Linux
https://www.alpinelinux.org/
https://velog.io/@dry8r3ad/why-alpine-linux
HostOS, GuestOS
https://www.linkedin.com/pulse/docker-host-os-guest-base-image-etc-abhijit-mazumder https://learn.microsoft.com/en-us/answers/questions/373498/are-containers-independent-of-host-os.html
Docker 입문
https://www.44bits.io/ko/post/easy-deploy-with-docker