작년에 생일날 오타 하나때문에 10시간을 삽질한 개발자가 있다? 라는 블로그를 보고 뭔가 부러워서(?)
올해 필자의 생일 기념으로 기술 블로그를 써보려 한다. 도커에 대해 알아보자!
도커를 이해하려면 먼저 이 세 가지를 알아야 한다.
* Docker?
도커는 컨테이너 기술을 기반으로 한 일종의 가상화 플랫폼이다.
* 가상화?
물리적 자원인 하드웨어를 효율적으로 활용하기 위해서 하드웨어 공간 위에 가상의 머신을 만드는 기술이다.
* 컨테이너?
컨테이너가 실행되고 있는 호스트 os의 기능을 그대로 사용하면서 프로세스를 격리해 독립된 환경을 만드는 기술이다.
⇒ 다시 말하자면, 도커는 독립된 환경을 만들어서 하드웨어를 효율적으로 활용하는 기술 이라 할 수 있다.
도커의 주요 구성 요소는 이렇게 이루어져 있다.
이미지(Image): 컨테이너 실행에 필요한 파일과 설정을 포함한 템플릿
컨테이너(Container): 이미지의 인스턴스로, 실제 애플리케이션이 실행되는 환경
도커 허브(Docker Hub): 도커 이미지의 저장소로, 필요한 이미지를 쉽게 내려받아 사용 가능
도커는 이런 컨테이너에다 필요한 것만 담아서 구동 한다. 즉, 필요한 자원만 활용하게 되어 매우 효율적이다.
컨테이너 안에는 애플리케이션을 구동하는데 필요한 라이브러리 및 실행파일만 존재하기 때문에
컨테이너를 이미지로 만들경우 용량이 대폭 줄어든다!
예를 들어, 어떤 프로젝트는 Spring
으로 되어있고, 또 다른 어떤 프로젝트는 Node JS
로 되어있다고 해보면 어떨까?
자바를 깔고 노드를 깔고 프로젝트를 깃허브에서 받아와 구동시키며 라이브러리 버전을 맞추고
오류나면 다시 버전을 확인하고 충돌도 막아야하는 등 개발자가 너무 많은 작업을 수행해야한다.
말로만 들어도 비효율 적인걸 알 수 있다.
(이러한 작업을 도커 파일을 통해서 수행한 뒤 그걸 이미지화 하여 서버에서 실행하는 것이 컨테이너 이미지)
그럼 도커를 활용하면 어떤 장점이 있을까?
충돌 발생 위험
이 전혀 없다.패키지로 만들어서 운영서버에 전달
만 하면 된다. 즉, 배포가 쉬워진다.하나의 기능만을 제공하는 모듈
로 만들어서 부하가 많은 모듈은 여러개 더 만들고 하는등의 조정이 가능해진다.컨테이너 이미지 하나면 어디서든 도커를 작동할 환경만 된다면 프로젝트 세팅을 아주 간단하게 할 수 있다.
위 그림을 보면, VM은 하이퍼바이저 위에 가상 머신마다 운영체제가 있고, 그 위에 애플리케이션이 있다.
반면, 컨테이너 구조에는 호스트 운영체제 위에 바로 컨테이너가 있고, 그 위에 애플리케이션이 위치한다.
이렇게 구조 레이어가 훨씬 간단한 컨테이너가 VM보다 성능을 높이기 쉽다!
가상화 기술
: 둘 다 물리적인 하드웨어 리소스를 효율적으로 사용하기 위해 가상화 기술을 활용한다.격리 환경 제공
: 애플리케이션을 독립된 환경에서 실행하여 충돌이나 호환성 문제를 줄인다.배포 및 관리 용이
: 가상화된 환경을 통해 애플리케이션의 배포, 관리, 확장이 용이하다.구조
: VM은 하이퍼바이저 위에 각 가상 머신마다 독립적인 운영체제를 포함무게
: 각 VM은 전체 운영체제를 포함하기 때문에 무겁고, 많은 시스템 자원을 소비격리 수준
: VM은 높은 수준의 격리를 제공하여 거의 완벽하게 게스트와 호스트 분리 가능구조
: 컨테이너는 호스트 OS의 커널을 공유하며, 필요한 애플리케이션과 그 종속성만 포함 무게
: 컨테이너는 운영체제를 공유하기 때문에 훨씬 가볍고 빠름격리 수준
: 컨테이너는 프로세스 수준에서 격리되지만, 커널을 공유하기 때문에 VM보다 격리 수준 낮음도커를 설치하는 방법은 여러 가진데
AWS (Ubuntu Linux) 일 경우
sudo apt update
sudo apt install docker.io
이렇게 하면 자동으로 실행
MAC 일 경우
1. 이 사이트 에서 본인 맥북에 맞는거 dmg로 다운로드
2. 다운로드가 완료되면 Applications 폴더에서 Docker 실행
$ sudo docker images
$ sudo docker search [이미지 이름]
$ sudo docker pull [이미지 이름]:[버전]
$ sudo docker rmi [이미지 id]
$ sudo docker ps
$ sudo docker run [options] image[:TAG|@DIGEST] [COMMAND] [ARG...]
$ sudo docker start [컨테이너 id 또는 name]
$ sudo docker restart [컨테이너 id 또는 name]
$ sudo docker attach [컨테이너 id 또는 name]
$ sudo docker stop [컨테이너 id 또는 name]
정리를 잘하시는것 같아요! 좋은글 감사합니다