-
Docker 란?프로그래밍 기초 공부 2023. 4. 1. 14:23
컨테이너
- 컨테이너는 Host OS 상에서 리소스를 논리적으로 구분하여 마치 별도의 서버인 것 처럼 사용할 수 있게 하는 기술
- 물리적으로 구분하지 않기 때문에 쉽게 없애고 다시 생성하고 할 수 있는 것
- 가벼움
컨테이너 사용 이유
- 여러 애플리케이션에서 사용하고 있는 라이브러리나 미들웨어의 버전에 대한 충돌을 회피
- 이식성과 확장성이 좋음
- 컨테이너 이미지 그대로 의존성 없이 다른 환경에서 실행 가능
- 컨테이너를 여러 개 실행해서 이중화 가능
- 다양한 운영 환경을 지원할 수 있음
- Windows 환경에서 Linux를 실행하거나 그 반대도 가능
Docker
- 컨테이너 기술을 사용하여 애플리케이션에 필요한 환경을 신속하게 구축하고 테스트 및 배포를 할 수 있게 해주는 플랫폼
- 다양한 프로그램들과 실행환경을 컨테이너로 규격화시켜 프로그램의 배포 및 관리를 단순화할 수 있음
- 프로그램의 코드뿐만 아니라 실행에 필요한 모든 dependency들도 컨테이너에 담기 때문에 다른 환경에서도 빠르게 어플리케이션을 실행할 수 있음
Docker 사용 이유
- MSA의 단점인 관리의 복잡성을 해결해주기 위해 서비스의 컨테이너화가 이루어지고, 이 과정에서 Docker와 Kubernetes가 많이 도입됨
- 테스트, 스테이징, 배포 등 여러 용도로도 사용할 수 있음
- IaC(Infrastructure as Code)가 가능함
- 인프라를 코드화해서 관리할 수 있다는 점
Docker 장점
모듈성
- 컨테이너화에 대한 Docker 접근 방식은 전체 어플리케이션을 분해하지 않고도 업데이트 또는 복구를 위해 애플리케이션의 일부를 분해하는 기능에 중점을 둠
- 이러한 마이크로서비스 기반 접근 방식 외에도 서비스 지향 아키텍처(SOA)와 거의 같은 방식으로 멀티플 어플리케이션 간에 프로세스를 공유할 수 있음
계층 및 이미지 버전 제어
- 각 Docker 이미지 파일은 일련의 계층으로 구성되며 이러한 계층들은 단일 이미지로 결합됨
- 계층은 이미지가 변경될 때 생성되고, 사용자가 실행 또는 복사와 같은 명령을 지정할 때마다 새 계층이 생성됨
- Docker는 이러한 계층을 재사용하여 새 컨테이너를 구축하는데, 이때 구축 프로세스 속도가 빨라짐
- 중간 변경 사항은 이미지 간에 공유되므로 속도와 크기, 효율성이 더욱 향상됨
- 계층화에는 버전 제어가 내재되어 있음
- 새로운 변경 사항이 있을 때마다 변경 로그가 기본 제공되므로 컨테이너 이미지를 완벽하게 제어할 수 있음
롤백
- 모든 이미지에는 계층이 있음
- 현재의 이미지 반복이 적절하지 않은 경우 이전 버전으로 롤백이 가능함
- 이 기능은 애자일 개발 접근 방식을 지원하며 툴 관점에서 실제로 지속적 통합 및 배포(CI/CD)를 수행하는 데 도움을 줌
신속한 배포
- Docker 기반 컨테이너는 배포 시간을 몇 초 단위로 줄일 수 있습음
- 각 프로세스에 대한 컨테이너를 생성하면 해당 프로세스를 새 애플리케이션과 빠르게 공유할 수 있음
- 컨테이너를 추가하거나 이동하기 위해 운영 체제를 부팅할 필요가 없으므로 배포 시간이 상당히 단축됨
- 배포 시간이 단축되면 컨테이너에서 생성한 데이터를 쉽고 비용 효율적으로 생성하고 제거할 수 있음
Docker 이미지
- 컨테이너를 생성하는 Base가 되는 것
- 이미지는 컨테이너를 실행하는데 필요한 모든 것을 포함하고 재사용이 가능
- 도커에서 서비스 운영에 필요한 서버 프로그램, 코드 및 라이브러리, 컴파일된 실행 파일 등을 묶는 형태를 도커 이미지라고 Repository에 배포되어 있어 받아서 사용하면 됨
- 도커 이미지를 실행하면 도커 컨테이너가 된다고 볼 수 있음
- 도커 이미지는 도커 파일로 만들어지는데
- 도커 파일에는 소스코드와 함께 의존성 패키지 등 사용한 설정 파일을 관리하기 쉽도록 명시
- ex)
- Oracle 이미지를 받아서 컨테이너를 생성하고 DB로 활용
- Java, Apache/Tomcat이 설치되어 있는 이미지를 받아서 그 위에 애플리케이션을 올리고 재배포
- Windows OS에서 CentOS 운영체제를 사용하기 위해 CentOS 이미지를 받아서 사용
도커 file
- 이미지 생성 출발점으로 이미지를 구성하기 위한 명령어들을 작성하여 이미지를 구성할 수 있음
- Docker File을 읽을 수만 있다면 해당 이미지가 어떻게 구성되어 있는지도 알 수 있음
- 기존 Docker hub에서 image를 pull 하여 간단하게 컨테이너에 넣어 사용할 수 있지만 이것을 보완하거나 수정하고 싶을 떄 사용
도커 레이어
- 도커 이미지는 러이어 개념을 사용
- 여러 개의 레이어를 나누어 이미지를 구성함
- 레이어 방식을 사용하면 기존의 이미지 레이어를 이용해 다양한 이미지를 새로 만들 수 있음
- 기존 이미지를 이용하기 때문에 용량 절약 가능
도커 허브
- 도커의 수많은 공개 이미지를 무료로 관리해줌
- 도커 허브로 인해 누구나 쉽게 도커 이미지를 만들고 배포할 수 있음
Docker 작동 원리
- Docker는 리눅스 커널의 기술이 기반되고 있음
Container Namespace
- Docker는 컨테이너별로 논리적인 공간을 가지고 있음
- Linux 커널의 namespace를 사용하고 있기 때문에 가능한 것
- namespace는 논리적으로 이름을 붙여 참조할 수 있도록하여 충돌을 피하는 방식
- Linux는 아래의 오브젝트에 namespace를 붙일 수 있음
- PID(Process ID)
- UID(User ID)
- Network
- mount(file system mount)
- UTS(hostname)
- IPC(프로세스간의 통신)
- 위와 같이 namespace를 사용하면 Host OS나 다른 컨테이너와 같은 PID를 갖는 프로세스를 띄우거나 같은 포트에 서비스를 띄우는 작업들을 할 수 있음
- Docker는 namespace 처럼 리눅스 커널의 기술을 기반으로하고 있지만 Windows에서 Docker는 Hyper-V를 이용한 Linux VM에 Docker를 실행하는 방법을 이용하고 있어서 Linux에서 실행될 수 있음
리소스 관리
- Docker에서 컨테이너를 실행하면 논리적인 namespace를 갖지만, Host OS의 물리적인 리소스는 공유해야함
- 리눅스 커널의 cgroups를 활용하면 아래 리소스들을 제어할 수 있음
- CPU
- Memory
- Network
- I/O
- cgroups는 프로세스와 쓰레드를 그룹화해서 관리하기 위한 기능이고 꼭 필요한 부분임
'프로그래밍 기초 공부' 카테고리의 다른 글
직렬화와 역직렬화 (0) 2023.04.04 쿠버네티스란? (0) 2023.04.02 Kafka란? (0) 2023.03.31 JPQL 이란? (0) 2023.03.30 DAO, DTO, VO란? (0) 2023.03.23