Summary
우리가 어떠한 애플리케이션을 설치하고 실행을 하려고 한다면, 그냥 실행이 되는 것이 아니라 그에 맞는 환경이 기본적으로 구축이 되어 있을 경우에 정상적으로 실행이 됩니다. 그런데 여기서 우리가 A 라는 프로그램과 B라는 프로그램 두 가지를 동일한 컴퓨터에서 실행하고, 이 두 프로그램 모두 실행을 위해 C라는 프로그램이 필요하다고 가정 해보겠습니다.
그런데 여기서 A라는 프로그램은 C프로그램의 2.0.0 버전이 필요하고, B라는 프로그램은 C프로그램의 1.0.0 버전이 필요하다면, C라는 프로그램은 동일 컴퓨터내에서 여러 버전을 설치할 수 없기 때문에 A와 B 둘 중 하나는 정상적인 실행을 보장할 수 없습니다.
이를 의존 충돌(Conflicting Dependencies) 라고 합니다.
이런 문제를 해결하기위해 필요한 기술이 바로 컨테이너입니다. 컨테이너는 애플리케이션을 컨테이너 내에 구성함으로써, 각각의 컨테이너는 각자 고유의 의존성을 가지게 됩니다. 그럼 컨테이너는 무엇일까요?
Container & Docker
container
컨테이너란 소프트웨어 서비스를 실행하는데 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리 등과 애플리케이션 코드를 함께 포함하는 경량 패키지 입니다.
예를 들어 쉽게 설명하자면 한 개발 팀에서 여러명의 개발자가 애플리케이션을 만들기 위해, 비슷한 개발 환경을 구축하고, 개발을 진행하게 됩니다. 그리고 구축하는 과정에서 OS, 프로그램의 설치 버전에 따라 예기치 못한 상황이 발생할 수 있고, 이렇게 발생한 문제를 해결하기 위해 많은 시간을 소모하게 됩니다. 이러한 이슈는 개발 환경과 배포 환경의 차이로 인해 배포 과정에서도 동일하게 발생할 수 있습니다.(로컬에선 잘 돌아가다가 배포하니까 안되네.....?)
이때 필요한 개념이 컨테이너입니다. 개발을 컨테이너 위에서 진행할 경우, 버전 및 애플리케이션 코드가 모두 들어있으므로 모든 개발자가 동일한 환경 하에 개발을 진행할 수 있습니다.
💡 Container VS VM(Virtual Machine)
컨테이너는 가상머신(VM) 과 마찬가지로 프로세스, 네트워크, 파일 시스템을 격리할 수 있다는 장점을 가지고 있습니다. 그러나 둘의 작동원리는 많이 다릅니다. 그 차이점에 대해 간단하게 알아보겠습니다.
이 사진에서 보면 컨테이너와 가상머신의 가장 큰 차이는 OS 유무입니다. 가상 머신은 각각의 독립적인 OS 가 있으나, 컨테이너의 경우 호스트 OS의 커널을 공유하고 있습니다. 이런 차이점 덕분에 OS 커널을 공유하는 컨테이너는 가상 머신보다 훨씬 적은 메모리를 사용하게 됩니다.
Docker
Docker는 애플리케이션을 개발, 배포 및 실행하기 위한 개방형 소프트웨어 플랫폼입니다. 도커를 사용하면 애플리케이션을 인프라로부터 분리가 가능하기 때문에 빠른 소프트웨어의 제공이 가능합니다. 이전에도 리눅스 컨테이너(lxc)라는 가상화 기술이 있었으나 그것을 쉽게 컨테이너화 할 수 있는 생태계/커뮤니티가 존재하지 않았습니다. 그러다 2013년 등장하게 된 도커가 Docker Hub이라는 저장소와 함께 빠르게 성장하기 시작하였고, 개발자들이 애플리케이션을 컨테이너 방식으로 손쉽게 실행할 수 있게 되었습니다.
💡 Docker(컨테이너)의 장점
- 의존 충돌 문제를 해결해줍니다.
- 위에 설명했던 내용과 같습니다.
- 개발과 배포환경을 일치시킵니다.
- 보통의 서비스 개발을 진행할 시 여러 개발자가 비슷한 개발 환경을 구축하고 개발을 진행합니다.
- 이 과정에서 시스템 환경에 따라 설치되는 소프트웨어의 버전이 상이하고, 설치과정에서 사소한 실수로 인해 발생한 문제에 많은 시간을 소모할 수 있습니다.
- Docker를 사용하게 되면 운영체제에 영향을 받지 않고 소프트웨어 패키지를 설치할 수 있게 됩니다.
- 수평 확장 및 새로운 내용을 배포하기 쉽습니다.
- 도커는 실행환경 구축이 쉽기 때문에 동일한 애플리케이션 구성을 컨테이너로 실행하고, 로드밸런서에 서버를 추가만 하면되므로 서버 증설이 수평확장에 용이합니다.
- 또한 개발이 완료되면 개발했던 환경 그대로 배포를 진행하면 되기 때문에 배포 또한 쉽게 가능합니다.
Docker 핵심 키워드
컨테이너(Containers)
컨테이너는 이미지의 실행가능한 인스턴스로, 여러 실행 환경에 구애받지 않고 실행될 수 있도록 만들어진 애플리케이션 상자입니다. 하나의 컨테이너는 다른 컨테이너 또는 호스트 시스템과도 비교적 잘 분리되어 있습니다.
이미지(images)
이미지는 컨테이너 생성을 위한 생성 지침 및 애플리케이션,애플리케이션 구성을 함께 담아 놓은 템플릿으로, 이미지를 이용하여 컨테이너를 생성합니다. 하나의 이미지를 이용하여 여러 컨테이너 생성이 가능합니다. 즉 수평 확장이 가능하다는 이야기입니다.
또한 하나의 이미지로부터 변경사항을 추가하여 또 다른 이미지 생성이 가능합니다.
레지스트리(Registry)
이미지의 수가 많아지면 관리가 힘들기 때문에 이러한 이미지는 레지스트리에 저장됩니다. Docker CLI에서 이미지를 이용해 컨테이너를 생성할 때, 이미지가 존재하지 않는다면 기본 레지스트리로부터 다운로드 받게 됩니다. 대표적으로 Docker Hub, Amazon ECR 등이 있습니다.
참고문서:
https://docs.docker.com/get-started/overview/
https://cloud.google.com/learn/what-are-containers?hl=ko
https://www.oracle.com/kr/cloud-native/container-registry/what-is-docker/
'DevOps 부트캠프 > Docker' 카테고리의 다른 글
Fastify서버 Docker 실행 시 접속 문제 (0) | 2022.03.31 |
---|---|
[Docker] Dockerfile을 이용한 이미지 빌드 예제 (+ docker-compose) (0) | 2022.03.25 |
댓글