Docker - 가상화, 컨테이너, 이미지
docker 는 컨테이너를 기반으로 만들어진 오픈소스 가상화 플랫폼이다.
1) 가상화
- 가상화란,
서버 한 대를 여러개의 작은 서버로 나누어 사용하는 기술을 일컷는다.
- docker 역시 가상화 플랫폼으로 docker를 설치하면 간단한 명령어로 하나의 컴퓨터에서 다양한 환경을 만들 수 있다.
( python분석용, application개발용, cache저장용 )
* 필자는 분석환경을 주로 conda(python용 가상환경)로 관리해왔었는데
이번 deploy 환경 조성을 시작으로 docker로 변경하면서 더 넓은 범위에서 환경을 구분하는 것이 가능해졌다.
2) 컨테이너
- 컨테이너란,
서버 가상화 방법 중 하나이다. 가상화는 가상머신(VM)과 컨테이너 두개가 대표적이다.
- 컨테이너란 도커 가상화 방법을 이용하여 만들어지는 독립적인 컴퓨팅 환경이다.
- VMware나 VirtualBox와 같은 우리에게 친숙한 가상머신 방식은 호스트OS(서버의 원래 OS) 위에 게스트OS(가상화하여 만들어진 독립된 OS)를 가상화하여 사용하여 서버를 무겁고 느리게 만든다. 결국 원래 서버가 가지는 자원을 다 활용하기 어려움(이것을 가상화 오버헤드라 일컫습니다.)
- 그러나 컨테이너는 추가적인 게스트OS를 생성하는 일 없이 프로세스를 격리하는 방식으로 작동됩니다.
즉, 프로세스가 격리되어 만들어지는 독립적인 컴퓨터 공간 == 컨테이너
(우리가 이 '프로세스를 격리'하는 방법에 대해 자세히 알 필요는 없습니다. 우리가 알아야 할 것은 이것을 이용하면 OS를 설치하기 위해 자원을 잡아먹는 일 없이, 프로세스별로 필요한 만큼만 자원이 잡히며 신속하게 가상화 환경을 구성할 수 있다는 것입니다)
* 한 단계만 더 나아간다면, 도커는 가상머신처럼 완전히 OS부터 독립되어 만들어지지 않고 프로세스 단에서 환경이 분리되기 때문에, 보안에 취약합니다. 예시는 나중에 root권한을 다룰 때 보여드리겠습니다.
3) 이미지
- 컨테이너와 나란히 가장 중요한 개념이 이미지이다.
- 이미지는 컨테이너(가상화된 독립환경)를 생성할 때 필요한 각종 설정값을 저장하고 있는 파일이다.
- 컨테이너는 이미지로 '생성된' 가상환경을 일컫고, 우리는 수정한 컨테이너를 새로운 이미지로 다시 저장할 수 있다. (마치 git버전관리와 같죠)
- 이것은 실행방법을 보면 아주 쉽게 와닿는다.
docker pull redis
# pull 명령어로 redis 이미지를 다운받습니다.
docker run --name temp_redis -it --rm redis
# run 명령어로 다운받은 redis이미지로부터 temp_redis라는 이름의 컨테이너를 생성합니다.
이미지를 받아서 run으로 컨터에너를 생성하면 불과 1초 안에 독립된 가상환경이 생성되게 된다.