https://www.oracle.com/kr/cloud/cloud-native/container-registry/what-is-docker/
면접에서 "혹시 도커를 써보셨나요?",
"도커 기반 어플리케이션 운영 및 배포 경험이 있나요?"
라는 질문을 굉장히 많이 받는다.
또 주변 얘기를 들으면 대부분의 회사들이 도커를 사용하고 중요하다
라는 말을 많이 듣는다.
"그래서 도커가 뭔데?"
라는 생각이 들었다.
Use Containers to Build, Share and Run your Applications
컨테이너를 사용하여, 어플리케이션을 Build 하고 Share 하고 Run 하는 기술이다.
A container is a standard unit of software
that packages up code and all its dependencies
so the application runs quickly and reliably
from one computing environment to another.
컨테이너는 애플리케이션이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로
빠르고 안정적으로 실행되도록 코드와 모든 종속성을 패키징하는 소프트웨어의 표준 단위.
호스트 운영체제의 종속성에 대해서 이해할 필요가 있다.
우리가 흔히아는 운영체제들 Windows, Linux, Mac 등에서
실행되는 어플리케이션들은 각 환경에서 필요한 라이브러리와 의존성이 있다.
운영체제는 자신이 지원하는 프로세스와 시스템 자원, 파일 시스템, 네트워크 등의 구성 요소가 다르기 때문이다.
운영체제마다 실행 파일의 형식이나 라이브러리를 참조하는 방식 등도 다르다.
ex) windows -> dll 파일 참조.
따라서, 각 운영체제에서는 필요한 라이브러리와 의존성이 다르게 구현되어야 하며,
애플리케이션이 운영체제의 구성 요소와 상호작용할 수 있도록 이를 지원해야 한다.
호스트 운영체제의 종속성으로 인한 호환성 문제를 해소하기 위한 기술이
가상화 기술과 컨테이너 기술이다.
예시를 통하면 더 잘 이해가 될 것 같다.
정지원 이라는 친구는 C 언어를 활용하여, 엄청난 프로그램을 개발하였다.
이삭 이라는 친구가 이 프로그램을 사용하고 싶어, 정지원에게 이 프로그램을 받았다.
이삭은 이 프로그램을 정상적으로 사용할 수 있을까?
이삭 과 정지원의 운영체제가 다르다면,
이삭은 프로그램을 정상적으로 사용할 수 없을거다.
C 언어는 각 운영체제마다 적합한 컴파일러가 존재하기 때문에,
컴파일 된 프로그램을 준다면 호환성 문제가 발생할 것이다.
Java 는 이를 가상화 기술을 통해서 해결한다.
운영체제의 의존성을 JVM 이라는 가상머신이 가져가면서,
우리는 Java 어플리케이션을 다양한 환경에서 공유 및 제공할 수 있다.
현대에는 다양한 플랫폼, 운영체제를 사용한다.
다양한 환경에서 안정적인 서비스를 제공하기 위해서는 호환성 문제를 잘 다룰 수 있어야한다.
다양한 환경 및 운영체제에서 어플리케이션을 빠르고 안정적으로 실행 시키기 위함이다.
결과적으로 비용, 유지보수, 시장 점유율, 이식성 측면에서 장점이 있다.
그림을 먼저 보고 설명을 보면 이해가 편할 것 같아 그림을 먼저 첨부한다.
Virtual machines (VMs) are an abstraction of physical hardware turning one server into many servers. The hypervisor allows multiple VMs to run on a single machine. Each VM includes a full copy of an operating system, the application, necessary binaries and libraries – taking up tens of GBs. VMs can also be slow to boot.
하나의 서버를 여러 서버로 전환하는 물리적 하드웨어의 추상화.
하이퍼바이저는 여러 VM이 단일 시스템에서 실행되도록 한다.
각 VM에는 수십 GB를 차지하는 운영 체제, 애플리케이션,
필수 바이너리 및 라이브러리의 전체 사본이 포함된다.
하드웨어 에뮬레이션 (하드웨어 리소스의 동작을 소프트웨어로 대신하는 가상화 방식) 을 통해 호스트 와 게스트 OS 간에 완전한 분리가 가능하며,
애플리케이션의 실행을 완전히 격리시키기 때문에 높은 안정성, 보안성을 제공한다.
가상 머신을 이용한 운영 시스템은 호스트 시스템과 가상 머신 사이의
인터페이스(Hyper-Visor)를 거쳐야 하므로, 성능 저하가 발생할 수 있다.
VM 마다 수십GB 의 리소스들을 담고있기 때문에, 많은 메모리가 필요하고
Boot 되는 시간이 비교적 느리다.
Containers are an abstraction at the app layer that packages code and dependencies together. Multiple containers can run on the same machine and share the OS kernel with other containers, each running as isolated processes in user space. Containers take up less space than VMs (container images are typically tens of MBs in size), can handle more applications and require fewer VMs and Operating systems.
컨테이너는 코드와 종속성을 함께 패키징하는 앱 계층의 추상화.
여러 컨테이너가 동일한 시스템에서 실행될 수 있으며
각각 사용자 공간에서 격리된 프로세스로 실행되는 다른 컨테이너와 OS 커널을 공유한다.
Lightweight:
컨테이너는 호스트 운영체제를 공유하기 때문에 가상 머신과 비교해
더 가볍고 빠르다.
Flexible: 컨테이너는 빠르게 생성, 삭제, 업데이트할 수 있다.
빠르게 소프트웨어를 배포할 수 있다.
Scalable:
컨테이너 기술은 미리 정의된 이미지를 사용하여 언제든지 확장할 수 있다.
따라서 서비스 트래픽이 늘어나면 쉽게 새로운 인스턴스를 생성하여
분산처리할 수 있다.
Portable:
컨테이너 이미지를 이용하면 개발 환경, 테스트 환경, 운영 환경 등
모든 환경에서 동일한 실행 환경을 제공할 수 있다.
컨테이너는 호스트 운영체제와 공유하기 때문에,
호스트 운영체제의 취약점에 노출될 가능성이 있다.
따라서 컨테이너 내부에 민감한 정보를 저장하는 것은 권장되지 않는다.
컨테이너 이미지를 만드는 과정에서 모든 의존성과 라이브러리를
포함해야 한다는 점이 번거로울 수 있다.
Secret 파일은 컨테이너 내부가 아닌, 호스트의 파일 시스템에 저장 되기 때문에
안전하게 민감한 정보를 관리 할 수 있다.
VM 은 Host 하드웨어의 자원을 가상화하여 독립적인 환경을 구축하기 때문에,
각 VM 마다 하드웨어의 자원을 사용하기 위해서 Hyper-Visor 를 거쳐서 접근하게 된다.
또한 독립적인 운영체제가 존재하기 때문에, 이에 대한 계산 리소스 또한 성능저하를 초래 할 수 있다.
Docker simplifies and accelerates your workflow, while giving developers the freedom to innovate with their choice of tools, application stacks, and deployment environments for each project.
Docker는 워크플로를 단순화하고 가속화하는 동시에
개발자가 각 프로젝트에 대해 도구, 애플리케이션 스택 및 배포 환경을 선택하여
혁신할 수 있는 자유를 제공한다.
도커 컨테이너를 사용하면 각각의 프로젝트나 애플리케이션마다 독립적인 실행 환경을 제공할 수 있다.
여러 개발자들이 각각 다른 환경에서 개발하더라도, 상황에 맞는 환경을 손쉽게 설정하여 협업 할 수 있다.
또한 개발자는 동일한 환경에서 어플리케이션을 실행할 수 있으므로, 다른 개발자들이나 운영팀과 공유할 때 생길 수 있는 호환성 문제나 버그 등의 문제를 미리 파악하고 해결할 수 있다.
도커를 사용하면 동일한 운영체제 버전과 패키지를 사용하는
모든 서버에 동일한 컨테이너 이미지를 손쉽게 배포할 수 있다.
이를 통해 서버 간의 호환성 문제를 예방할 수 있으며,
서버 환경을 효율적으로 관리할 수 있다.
또한, 도커를 사용하면 스케일링을 쉽게 수행할 수 있다.
도커 컨테이너를 여러 개 띄우고, 로드밸런서를 이용해 트래픽을 분산시켜
서버 부하를 분산시킬 수 있다.
이를 통해 서버의 가용성을 높이고, 더 많은 트래픽을 처리할 수 있다. (컨테이너 기술 Flexible, Scalable)
또한, 도커를 이용하면 서버 모니터링과 로깅이 간편해진다.
도커는 각각의 컨테이너에서 발생하는 로그를 캡처하고,
로그 파일을 수집 및 분석할 수 있는 기능을 제공한다.
- Dockerfile을 사용하여 이미지를 빌드할 때 환경 설정
- 컨테이너 실행 시점에 환경 변수를 설정
도커를 통해,