도커(Docker)는 linux 컨테이너를 기반으로하는 오픈소스 가상화 플랫폼이다.
컨테이너는 소프트웨어를 패키지화하여 실행하는데 사용되며, 도커는 이러한 컨테이너를 관리하고 배포하는 도구이다.
도커는 컨테이너 관리 기능 외에도 명령어 입력도구인 CLI와 명령어을 받아들이는 도커 데몬과 이미지를 저장하는 레지스트리로 구성되어있다.
도커와 쿠버네티스를 함께 설치할 경우 쿠버네티스는 컨테이너 오케스트레이션을 위해 도커에 포함된 컨테이너디를 활용한다.
컨테이너란?
가상화 환경에서는 각각의 가상머신이 모두 독립적인 운영체제 커널을 가지고 있기 때문에 그만큼 자원을 더 소모해야 하고 성능이 떨어진다. 하지만 컨테이너 인프라 환경은 운영체제 커널 하나에 컨테이너 여러개가 격리된 형태로 실행되기 때문에 자원을 효율적으로 사용할 수 있고 거치는 단계가 적어서 속도가 훨씬 빠르다.
가상머신(Vertual Machine)
HyperVisor는 컴퓨터가 가지고 있는 인프라 리소스들에 대해 VM별로 배분 하는역할들을 한다. 또한 각 VM에서는 독립적인 OS를 가지고 있어따라서 독립적인 플랫폼을 하나씩 증가시킬 때마다 불필요한 OS계속해서 만들게 되어 확장성이 떨어진다. 또한 메모리나 자원에 관해서 유동적으로 관리 되는게 아니라 처음부터 정해놓고 실행하기에 비효율적이다.
컨테이너(Container)
소프트웨어는 OS와 라이브러리에 의존성을 띈다. 그러므로 하나의 컴퓨터에서 성격이 다른(OS, 라이브 버전이 다른) 소프트웨어를 한번에 실행할 때 어려움을 가질 수 있고, 관련된 구성을 가지기 어렵다.
컨테이너(Container)는 개별 application의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술을 말한다.
컨테이너의 경우 하나의 Host OS위에서 마치 각각의 독립적인 프로그램처럼 관리되고 실행된다. 불필요한 OS만드는작업 및 Infra를 독립적으로 나눌 필요가 없어서 확장성이 좋고 빠르다.
컨테이너는 독립된 애플리케이션의 실행 환경으로 VM보다 메모리를 덜 소모하고, 셋업이 빠르다. 또한 VM과 비교해 크기가 작기 때문에 마이그레이션, 백업, 전송이 쉽고 하드웨어와의 커뮤니케이션이 빨라 전달 시간이 감소할 수 있기 때문에 성능이 효과적이다. 애플리케이션의 배치와 유지보수를 향상시킨다는 장점이 있다.
도커를 사용하는 이유
- 변화하지 않는 실행환경으로 멱등성을 확보 할 수 있다.
- 코드를 통한 실행환경 구축 및 어플리케이션 구성이 쉽다.
- 실행황경과 어플리케이션의 일체화로 이식성이 향상된다.
- 시스템을 구성하는 어플리케이션 및 미들웨어의 관리 용이성이 높아진다.
웹 어플리케이션 개발을 예로 들면, 도커를 사용하는 경우 로컬개발 환경에서 필요한 어플리케이션을 신속하게 갖출 수 있으며 OS와 상관 없이 도커가 설치된 머신이라면 어디에서든지 배포가 가능해진다. 또한 변화하지 않는 일관된 실행환경이 구축되기 때문에 문제가 되는 원인을 최소화 할 수 있다. 그리고 미들웨어를 포함하는 시스템 구성 또한 설정파일로 정의 할 수 있게된다.
그 밖에도 도커는 도커이미지(Dockerfile)로 구성을 코드로 관리 할 수 있어 빠르고 쉽게 기존 컨테이너를 폐기 및 재구축 할 수 있다.
여러서버에 걸쳐있는 여러 컨테이너를 관리하기 위해 도커 스웜(Docker Swarm) 및 쿠버네티스 같은 도구들을 사용하여 관리를 할 수도 있다.
이러한 장점들을 가진 도커는 운영측면에서나, 배포 및 관리 측면에서나 기존의 가상머신보다 월등하게 편리한 점이 많고, 성능면에서도 확장이 쉽고 오버헤드가 적다는 장점이 있다.
도커 용어 정리
도커 공식 문서 에서 확인할 수 있다.
Docker는 클라이언트가 CLI를 통해 명령을 내리면 docker daemon이 이를 처리해주는 방식이다.
Docker host 내부에서 docker daemon이 이미지를 내려받아 container를 실행시키고 관리한다.
이미지의 경우 docker hub와 같은 레지스트리에서 받아 사용할 수 있고, 한번 다운받은 이미지는 재사용이 가능하다.
- DOCKER_HOST
- docker daemon이 돌고 있는 환경 → VMWare, Virtual Box
- docker는 주로 client-server architecture 이다.
- Docker daemon
- Docker API를 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리한다.
- Docker Client
- docker API 를 사용하여 여러개의 데몬과 통신을 한다.
- Docker registries
- docker 이미지 저장소
Docker Hub는 공개 레지스트리로 Docker에서는 기본적으로 Docker Hub에서 이미지를 찾도록 구성되어있다.
- docker 이미지 저장소
- Docker objects
- Images
이미지는 Docker 컨테이너 생성을 위한 정보가 포함된 템플릿
이미지를 만들 수도 있고, 레지스트리에서 다운받을 수도 있다.
이미지를 빌드하려면 Dockerfile을 사용하여 만들 수 있다 .
Dockerfile의 각 명령어는 이미지에 레이어를 만들어 빌드한다. - Containers
컨테이너는 이미지로 실행한 인스턴스
Docker API 또는 CLI를 이용하여 컨테이너를 생성, 시작, 중지, 이동, 삭제가 가능하다.
컨테이너를 하나 이상의 네트워크 및 스토리지에 연결하거나 현재 상태를 기반으로 새 이미지를 생성할 수 있다.
기본적으로 컨테이너는 다른 컨테이너 및 호스트 시스템과 격리되어있다.
컨테이너는 생성하거나 시작할때 제공하는 구성 옵션과 이미지로 정의된다. → 컨테이너가 제거되면 백업해두지 않은 변경사항이 모두 사라진다.
- Images
참고자료
[도서]컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커
https://www.oracle.com/kr/cloud/cloud-native/container-registry/what-is-docker/
http://docs.docker.com
'DevOps' 카테고리의 다른 글
Raid의 정의와 구축 실습 (0) | 2023.06.28 |
---|---|
[kubernetes] 파드, 컨테이너, 도커, 쿠버네티스의 관계 (0) | 2023.06.24 |
[kubernetes] 컨테이너 인프라 환경이란? (0) | 2023.05.25 |
[docker] 바인드마운드 vs 볼륨 (0) | 2023.05.24 |
[docker] 간단한 사용 예제 (0) | 2023.05.24 |