개발 공부를 시작하면 자주 듣게 되는 Docker
!
개인 프로젝트를 진행하며, 개발환경을 분리하고 싶다는 생각에 Docker에 대해서 알아보기 시작했는데 내가 생각했던 것보다 훨씬 편리하고 중요한 개념인 것 같아 정리를 해보려고 한다!
Docker
는 Container
기반 가상화 플랫폼으로, 응용 프로그램과 그 종속성을 격리된 환경인 Container
로 패키징하여 실행하는 기술이다.
이를 통해 응용 프로그램을 서로 다른 환경에서도 일관되게 실행할 수 있고, 개발 환경과 운영 환경 사이의 차이로 인한 문제를 줄일 수 있다! 도커 컨테이너는 가볍고 빠르며 확장성이 좋아서 개발 및 배포 프로세스를 간소화하는 데 사용된다.
Docker Engine
은 컨테이너를 생성하고 관리하는 주체로서, 컨테이너를 제어할 수 있고 다양한 기능을 제공하는 도커의 프로젝트이다. 도커의 생태계에 있는 여러 프로젝트들은 도커 엔진을 좀 더 효율적으로 사용하기 위한 것에 불과하기 때문에, 도커의 핵심은 도커 엔진이라고 할 수 있다
Container
는 가상화 기술 중 하나로, 대표적으로는 LXC(Linus Container)가 있다. 기존 OS를 가상화 시키던 것과 달리 컨테이너는 OS레벨의 가상화로 프로세스를 격리시켜 동작하는 방식으로 이루어진다.
기존에도 가상화 기술은 존재해 왔는데, 왜 Docker를 사용하는 걸까?
결론적으로, Docker Container
는 가상화된 공간을 생성할 때 리눅스 자체 기능을 사용하여 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 없고
,
가상 머신과 달리 커널을 공유해서 사용하기 때문에 용량이 작고
,
위와 같은 이유 때문에 컨테이너를 이미지로 만들었을 때 배포하는 시간이 VM에 비행 빠르고, 사용할 때 성능의 손실 또한 거의 없다
다양한 환경에서 동일한 실행 환경
을 보장한다.
개발 환경과 운영 환경의 차이로 인한 문제를 방지하며, 응용 프로그램을 어디서든 실행할 수 있다.
도커 컨테이너는 이미지로 패키징되어 배포되기 때문에, 어플리케이션 배포가 간단해진다.
이미지를 공유하거나 배포할 때 용이
하며, 빠른 확장
이 가능하다.
도커는 각 컨테이너를 격리된 환경으로 실행하므로, 하나의 컨테이너에서 발생한 문제가 다른 컨테이너에 영향을 주지 않는다.
VM과 비교했을 때, 더 가볍고 빠르며 호스트 시스템의 리소스를 효율적으로 활용
할 수 있다.
컨테이너 기반 아키텍처는 쉬운 스케일링이 가능하기 때문에, 요구에 따라 응용 프로그램을 확장
할 수 있다.
Docker Image
란 컨테이너를 실행할 수 있는 실행파일 ,설정 값들을 가지고 있는 것이라고 생각하면 된다.
Docker File
은 Docker Image
생성 과정에 대해 기술한 파일
Docker Image
를 저장하고, Docker hub
이라는 public 레지스트리와 private 레지스트리가 있다.
일반적으로 고용 레지스트리에서 실행한다
docker pull, docker run -> 필수 이미지를 가져온다
docker push -> 레지스트리에 저장한다
Dockerfile을 작성하여 도커 이미지를 생성
이미지를 기반으로 도커 컨테이너를 실행
도커 컨테이너 간의 통신을 위해 네트워크 설정을 구성
필요한 호스트와 컨테이너 간의 포트 매핑을 설정
도커 컴포즈를 사용하여 여러 컨테이너를 정의하고 관리
빌드한 이미지를 도커 레지스트리에 업로드하거나, 다른 개발자와 공유