왜 도커가 필요한 것인가?
호환성과 의존성문제
1. 만약 여러 기술스택(장고, MySQL, redis 등)을 개발을 진행한다고 가정한다고 했을때 각각의 기술 스택들은 설치되있는 OS의 버전에 대한 호환성과, 의존성 문제를 가진다.
2. 서비스의 기술 스택이 업그레이드 되거나 확장으로 인해 아키텍쳐 구조를 바꿀 상황은 항상 온다. 무엇인가 바뀔때마다 각각의 기술스택의 라이브러리 호환성과 의존성 문제를 체크해주어야 하는데 이런 지옥을 "The Matrix form Hell"이라고 하기도한다.
3 새로운 개발자가 팀에 들어올때마다 초기세팅을 도와주는것은 정말 번거로운 작업이다. 정확한 버전의 운영체제, 그리고 기술스택을 사용하고 설치하고 있는지 확인하는 작업은 엄청난 고통을 동반한다. dev, test, beta, staging, production 등 여러 환경을 운용하고 있는 조직이라면 운용하고 있는 환경마다 작업을 해주어야한다는 엄청난 부담감이 생길 것이다.
이러한 호환성, 의존성 문제때문에 개발에 집중할수 없고 같은 환경을 공유하는데도 많은 이슈들을 겪어야 했다. 이러한 고통들은 도커를 사용한다면 해결이 가능하다. 도커는 각 기술스택들을 분리된 컨테이너에 고립시키고 얽혀있는 호환성과 의존성 문제를 분리 시켜준다. 운영체제가 다르더라도 도커만 설치한다면 대부분의 운영체제 환경에서 호환성, 의존성 문제 없이 어플리케이션을 실행 시킬 수 있다.
컨테이너(Container)란 무엇인가?
컨테이너는 모든 요소들로부터 완전히 독립되고 고립된 환경이다. 각각의 컨테이너는 각자의 process, network, mount를 가지고 있다. 하지만 여기서 중요한점은 OS kernal을 공유한다는 것이다.
또한, 컨테이너 개념 도커가 만든것이 아니다! 컨테이너는 이미 10여년 전부터 활용되고 있었고(LX c, LX d 등), 도커는 LX c 컨테이너를 활용하는 tool 이다. 로우-레벨에 위치한 LX c 컨테이너 환경 설정을 보다 쉽게 하기위해 도커는 개발자들에게 쉬운 접근성을 제공해준다.
운영체제(OS: Operating System)
뜬금없이 왠 운영체제? 라고 하겠지만 도커가 어떤 방식으로 운용되는지 알기 위해 기초적인 운영체제 이해가 필요하다. Ubuntu, Fedora, Centos 등 이러한 운영체제는 크게 두가지로 구성되어 있다.
1. OS 커널
OS Kernel 은 탑제되어있는 하드웨어와 상호작용을 책임지는 역할을 한다.
2. 소프트웨어 세트
소프트웨어 세트는 User-interface, drivers, compilers, file manager, etc) 이러한 소프트웨어들로 구성되어 있다.
OS 커널이 리눅스라고 가정했을때 그 위에 설치된 각기 다른 소프트웨어 세트에 의해서 운영체제의 종류가 결정이된다. 즉, 운영체제들을 Linux kernel을 사용하고 있고 다른점이라곤 그 위에 설치된 소프트웨어 세트일뿐이라는 점이다.
그리고, 도커는 Linux kernel을 공유하고 있다!
커널 공유
도커가 설치된 ubuntu 운영체제를 사용하고 있다고 가정했을때, Linux kernel을 공유하고 있는 다른 운영체제 환경(Fedora, Centos)에 컨테이너 환경을 배포할 수 있다.
중요한 점은 우리가 많이 쓰는 Window는 Linux kernel을 공유하고 있지 않다! (hate window). 이러한 이유 때문에 윈도우 환경에서 설치된 컨테이너는 Linux kernel을 공유하고 있는 OS 위에서 동작하지 않는다. 윈도우에서 도커를 사용하려면 window docker server 가 필요하다.
만약 리눅스 환경에서 만들어진 컨테이너를 윈도우에 돌린 경험이 있다면, 그것은 window 가 Linux virtual machine 실행하고 그 위에 리눅스 컨테이너들을 올려 놓은 이유이기 때문이다.
Container VS Virtual Machine
Virtual Mahine 은 Hyper-V 위에서 작동하고 각 VM 안에 OS가 설치되어 있다. 이러한 이유때문에 컨테이너보다는 무겁고 용량도 많이 차지하며 자원 소모도 크다는 점이 있다.
그렇다고 해서 conatainer 와 vm 중에 무엇을 선택해서 써야한다는 것이 아니다! 각 기술을 다른 목적을 위해 만들어 졌기 때문에 이 두 기술의 특징을 적절이 조합해 사용한다면 분명 응용할 방법이 있을것이다. 공부해보자.
virtual Machine - 가상화 기술을 통해 각 운영체제와 커널을 같은 하드웨어위에 운용하는 기술
container - 컨테이너 기술은 어플리케이션을 고립시켜서 어느 환경에서든 쉽게 운용할 수 있게 해주는 기술
Images VS Containers
Image 는 하나의 템플릿이라고 볼수 있다. 도커파일로 부터 생성되며 컨테이너를 생성하기 위해 사용된다.
Container 는 작동하고 있는 이미지의 인스턴스이다. 각 컨테이너는 독립적인 프로세스 구조와 환경을 가지고 있다.
이미 많은 이미지들이 Docker Hub에 존재하고 있기때문에 필요한 이미지를 간단히 Hub으로부터 받아 올수 있다.
도커 파일(Docker File) 도커 이미지를 생성하기 위한 가이드 라인이다.
'CONTAINER > docker' 카테고리의 다른 글
도커 파일만들기 nodejs (0) | 2021.05.30 |
---|---|
[docker] 실행해보자 (0) | 2021.02.28 |