컨테이너를 왜 써야 하는가?
1. Immutable Infrastructure (의존 패키지 설치 등 설치에 관련된 이슈 회피 가능!)
다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해줍니다. 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립PC, AWS, Azure, Google cloud등 어디에서든 실행할 수 있습니다. - 출처
그러니까, 매번 가상 컴퓨터를 만들어서 실행 환경을 일일히 설치해주는 그런 일을 피할 수 있게 된 것입니다. 이러한 서비스를 Immutable Infrastructure라고 부릅니다.
2. 마이크로서비스 아키텍쳐로 인해 생성되는 인스턴스의 환경 세팅이 쉬워진다.
확장성과 유지 보수의 편리함을 위해서는
모놀리식 (≒ 온 프레미스) 아키텍쳐보다는 마이크로서비스 아키텍쳐로 서버를 구성하게 됩니다. (당연하죠!)
(https://aws.amazon.com/ko/microservices/)
대규모 서비스를 구축해야 한다고 가정해본다면 이러한 서비스를 모놀리식으로 구성한다면 우선 그 서비스가 단일 컴퓨터에서 돌아갈 수도 없을 것이며, 유지 보수가 심각하게 불편해질 것입니다.
그렇다면 결국 마이크로 서비스 아키텍쳐를 구성해야 하는데 마이크로 서비스를 구축하는 데 있어 가상 컴퓨터를 생성하는 양은 무지막지하게 많을 것입니다.
이런 환경에서 수작업으로 실행 환경을 세팅하는 것보다는 도커를 이용하면 실행 환경을 구축하기 쉬워질 것입니다.
추가로, 저 정도 규모는 도커를 관리(Orchestration)하는 쿠버네티스도 사용되어야겠죠.
결국 정리하자면 트렌드는 클라우드 컴퓨팅 + 마이크로 서비스 아키텍쳐 + 도커 + 쿠버네티스로 서버를 관리한다고 볼 수 있겠습니다.
그러나 반드시 저것이 정답인 것은 아니고 소규모 회사인 경우에는 필요에 따라 선택적으로 사용하는 것이 좋겠습니다. 소규모 회사에서는 쿠버네티스를 사용하지 않는 편이 좋다는 글도 있습니다. (꽤 유명한 사람이 쓴 글인데 못찾겠네요)
VM와 다른 점은 무엇인가?
쉽게 말해 VM에 있는 GuestOS와 Hypervisor(하이퍼바이저)가 없다. 때문에 빠르다.
Docker는 Virtual machine이 아니다! (좋은 글)
🚨 hypervisor?
하이퍼바이저는 호스트 시스템에서 다수의 GuestOS를 구동할 수 있게 하는 소프트웨어이다. 하드웨어를 가상화하면서 하드웨어와 각각의 VM을 모니터링하는 중간 관리자이기도 하다.
하이퍼바이저는 크게 네이티브 하이퍼 바이저(하드웨어 -> 하이퍼바이저 -> GuestOS) 호스트 하이퍼 바이저(Host OS -> 하이퍼바이저 -> GuestOS)로 나뉩니다. 후자가 일반적으로 활용됩니다.
하이퍼바이저에 대한 글은 다음 글을 참고합시다.
http://cloudrain21.com/hypervisor-types
VM은 무겁다. 그 무거움의 원인은 Guest OS와 Hypervisor이다. (오버헤드라고 할 수 있겠다) 동일한 컴퓨터 리소스 위에 다른 컴퓨터를 올리는 것이므로 무거울 수밖에. Hypervisor위에 게스트 OS를 설치해야만 하고, 이미지에 OS가 있기 때문에 자연스럽게 무겁고 클 수 밖에 없다.
반면 컨테이너는 가볍다. 도커는 Docker Engine이 Hypervisor 대신 들어간다. 게스트 OS를 설치하지 않고 Docker 컨테이너에 서버에 사용하고자 하는 것만 설치할 수 있다. OS가 빠졌으니 VM에 비해 가벼울 수밖에.
조금 더 자세하게 적자면, 도커 컨테이너에서 돌아가는 애플리케이션은 컨테이너로 격리되어 있기는 하지만 같은 호스트 OS의 동일한 커널을 공유한다. 반면 VM은 호스트 OS와 독립되어 있다. 위 그림에서 VM1, VM2로 분리되어 그려져 있는 것은 이런 의미이다. 때문에 VM에 대한 가상화 프로세스를 관리하긱 위해 호스트 시스템은 자신의 하드웨어 리소스의 일부를 VM에 할당해야 한다...
도커가 이용하는 Linux 기술
tip)
윈도우에서 사용할 때는 Hypervisor를 이용한다. 하이퍼바이저를 안 쓰려고 도커를 쓰려는 것이기 때문에 도커는 리눅스 환경에서 사용할 때 그 이점이 커진다.(그래도 편의성 면에서 VM사용하는 것보다는 나으니 윈도우에서도 무조건 설치하자)
컨테이너 격리를 위해 리눅스의 컨트롤 그룹(cgroup)과 네임 스페이스을 사용한다. 둘 다 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널 기능들이다.
- Cgroup : CPU, 메모리, Network Bandwith 등 프로세스 그룹의 시스템 리소스 사용량을 관리 => 어떤 앱이 리소스 사용량이 너무 많다면 Cgroup에 넣어 해당 앱의 리소스 사용량을 제한할 수 있음
- 네임 스페이스 : 하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술. 별개의 독립된 공간을 사용하는 것처럼 격리된 환경을 제공하는 경량 프로세스 가상화 기술
그런데 어떻게 리눅스 커널 기능인 Cgroup과 네임스페이스를 윈도우나 맥에서 사용할 수 있는 걸까요? 이는 리눅스가 아닌 다른 OS를 사용할 때는 리눅스 VM을 이용하기 때문입니다.
...
리눅스 커널
리눅스 VM
윈도우/맥
하드웨어
그런데 VM을 안 쓰려고 Docker를 쓰는 건데...
따라서 Docker는 리눅스에서 사용하는 것이 좋습니다. 그럼에도 설치의 편의성 때문에 Docker를 쓰는 게 좋긴 합니다.
이미지?
이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 ubuntu이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있고 MySQL이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보등을 가지고 있습니다.
이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없습니다. 이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성만 하면 됩니다. - 출처
뭔가 복잡한 것 같으면, 이미지과 컨테이너의 관계는 클래스와 인스턴스의 관계라고 생각하면 편합니다.(당연히 정확하진 않음)
이미지가 없으면 도커허브로부터 이미지를 다운로드 받고, 이미지는 런타임시에 컨테이너가 됩니다.
docker를 GUI로 편하게 모니터링하고 싶다면
docker desktop말고 lazydocker 쓰세유. 리눅스에서도 유용합니다.
github.com/jesseduffield/lazydocker
- b - bulk 명령. 즉, 전체 삭제, 전체 제어 등 전체를 다루기에 편함
- d - 컨테이너 삭제
- r - 컨테이너 재시작
- s - 컨테이너 정지
- R - 재시작옵션보기(build 다시하기와 같은 옵션)
'Ops, Infra, etc > 🐋 Docker (+Swarm)' 카테고리의 다른 글
docker 기반 nginx~react 개발 및 배포 (0) | 2021.03.26 |
---|---|
docker compose와 간단한 compose 문법 (2) | 2021.03.24 |
node.js 기반 앱을 docker 환경에서 실행해보자 (0) | 2021.03.23 |
Dockerfile을 이용한 Docker 이미지 생성하기 (0) | 2020.09.03 |
docker 기본 명령어 (ps, stop, start, rm, logs, exec, images, network) (1) | 2020.09.03 |