멘붕
학습시간 09:00~22:00(당일13H/누적1831H)
컴퓨터의 물리적 하드웨어를 보다 효율적으로 활용할 수 있도록 해주는 리소스를 추상화하는 개념
운영체제나 애플리케이션을 하나의 물리적 시스템에서 독립적으로 실행되도록 하는 기술
하나의 실물 컴퓨팅 자원을 마치 여러 개인 것처럼 가상으로 쪼개서 사용할 수 있다.
즉, 물리적인 컴퓨터 내부에 또 하나의 가상 컴퓨터 환경을 만들어 운영하는 것.
각 물리 서버에 Windows/Linux 등 하나의 운영체제가 설치되어 직접 애플리케이션을 실행
서버 자원이 독립적으로 분리되지 않아 자원의 활용도가 낮음
자원이 공유되므로 애플리케이션 설치시 버전이나 환경에 충돌이 발생할 수 있음
일반적으로 사용하는 컴퓨터에 소프트웨어를 바로 설치하여 사용하는 방식.
하나의 물리적 호스트에서 여러 개의 가상 머신을 생성하고 관리할 수 있도록 해주는 기술.
가상화 계층을 구현해주는 소프트웨어인 ‘하이퍼바이저(Hypervisor)’ 기술을 활용
Windows/Linux 등 다양한 선택 가능하지만 초기 부팅 시간이 길고, 설치 용량이 GB 단위로 크다.
각 머신마다 OS가 존재하여 무겁고, Host 컴퓨터에 많은 부하를 줄 수 있다.
일반적으로 Linux 환경에서 작동하며 초기화 시간이 짧고, MB 단위의 용량이 요구됨
Host의 운영체제(OS) 위에서 실행되며 운영체제의 소프트웨어를 공유.
가상 머신보다 가볍고 빠르며, 여러 개의 컨테이너를 하나의 시스템에서 독립적으로 실행 가능.
1964년 - IBM, 메인프레임 가상화 기술 도입 (하이퍼바이저 개념 등장)
1972년 - IBM, VM/370 발표 (최초의 상용 하이퍼바이저)
1999년 - VMware, x86 서버 가상화 기술 발표 (가상 머신 대중화)
2006년 - KVM(Kernel-based Virtual Machine) 등장 (리눅스 커널 기반 가상화)
2008년 - LXC(Linux Containers) 발표 (리눅스 커널에서 컨테이너 지원 시작)
2013년 - Docker 오픈소스 공개 (컨테이너 기술 대중화)
2014년 - Google의 Kubernetes 프로젝트 발표
2014년 - Docker 1.0 정식 릴리즈
2015년 - Kubernetes 1.0 정식 릴리즈
2020년대 - Kubernetes를 활용한 컨테이너 오케스트레이션이 업계 표준으로 자리 잡음.
2013년 3월, 솔로몬 하익스가 설립한 DotCloud라는 회사에서 개발 후 오픈소스로 출시
2014년 6월, Docker 1.0 버전 출시
서버들 간에 흔히 일어나는 종속성 문제 해결을 위해 등장
컨테이너(원할 때 빌려 쓰고 반납할 수 있는 소규모 서버)를 관리해주는 도구
애플리케이션과 그 실행에 필요한 모든 것을 포함한 가볍고 독립적인 실행 환경
코드, 설치 소프트웨어, 환경 설정 파일, 데이터베이스 등 실행에 필요한 다양한 요소들이 포함될 수 있다.
가상의 리눅스 서버라고 생각하면 이해가 조금 더 쉽다.
실행 코드, 라이브러리, 데이터베이스, 소프트웨어, 환경 설정 파일 포함
기기나 환경에 상관없이 동일한 개발 환경 제공
기기나 환경에 상관없이 동일한 개발 환경 제공
서비스 리소스에 대한 확장 가능성 및 유연성 보장
한 대의 물리 서버에 여러가지 서비스 배포 가능
코드, 라이브러리, 런타임 환경 등 컨테이너 실행에 필요한 모든 파일과 설정들을 포함한 템플릿
도커 이미지를 통해 동일한 기능을 하는 컨테이너를 여러 대 생성 가능
도커에서 이미지를 생성하기 위한 용도로 작성하는 파일
베이스 이미지, 환경 설정 등의 필요 단계가 순차적으로 정의되어, 도커 이미지를 일관되게 생성 가능
도커 이미지를 저장하고 배포하는 중앙 저장소(Registry)
Docker Hub는 공개 저장소이며, 개인 또는 조직의 프라이빗 저장소 구축도 가능하다.
같은 팀 내에 협업이 필요하고, 서로 다른 환경에서 프로그램이 실행될 때
확장 가능한 App 배포를 원할 때
마이크로서비스 아키텍처 구축을 고려할 때
호스팅된 컴퓨터에 머지않아 많은 환경이 변경될 때 (데이터 이행, OS 업그레이드, 등)
하지만!
리눅스용 소프트웨어만 지원 가능
호스트 서버에 문제 생기면 모든 컨테이너에 영향을 미침
서비스가 작은 경우, 컨테이너 하나만 장기간 걸쳐 사용할 경우 큰 장점을 느끼기 어려움
네트워크 및 스토리지 관리의 복잡성
옵션 설명
--name 컨테이너 이름 설정
-d detached mode (백그라운드 실행 모드)
-p 호스트와 컨테이너의 포트를 연결
-v 호스트와 컨테이너의 폴더를 연결
-it 컨테이너 터미널 입력을 위한 옵션
-e 컨테이너 내에서 사용할 환경변수 설정
port forwarding (-p)
docker run –d –p {host port}:{cnt port} --name nginx_cnt nginx
docker run -d -p 8080:80 --name nginx_cnt nginx
volume mount (-v)
docker run –d –p 8080:80 –v {host_dir}:{cnt_dir} --name nginx_cnt nginx
docker run -d -p 8080:80 -v /user/codeit:/home/dev --name nginx_cnt nginx
volume mount (-v)
docker run –d –p 8080:80 –v {host_dir}:{cnt_dir} --name nginx_cnt nginx
docker run -d -p 8080:80 -v /user/codeit:/home/dev --name nginx_cnt nginx
Docker를 통한 DB Connection
도커의 옵션들
사용자 서버
localhost host.docker.internal
host.docker.internal
localhost
localhost
로컬 컴퓨터에서 Docker Container 내부 서비스에 접속 → localhost
Docker Container에서 다른 Container 내부 서비스에 접속 → host.docker.internal
여러 개의 도커 컨테이너를 정의하고 관리하기 위한 도구
컨테이너 생성을 위한 정보들을 YAML 파일에 정의하여 여러 컨테이너들을 한 번에 실행
다수의 컨테이너들이 필요한 마이크로 서비스를 쉽게 관리할 수 있도록 도와줌
여러 Docker 어플리케이션 간 상호작용 혹은 의존적일 때 관리 가능
다수의 컨테이너화 된 워크로드와 서비스를 효율적으로 다루기 위한 오픈소스 기술/플랫폼
일반적으로 여러대의 서버가 하나의 컴퓨터처럼 동작되는 ‘클러스터 환경’에서 동작
컨테이너의 배포와 확장, 로드 밸런싱, 자동 복구 등의 기능을 제공하여 복잡한 분산 시스템의 운영을 단순화, 효율화
2020년대 클라우드 기술의 발전과 함께, 다양한 IT 분야에서 업계 표준으로 자리 잡음
Pod : 하나 이상의 컨테이너를 그룹화한 최소 배포 단위로, 쿠버네티스에서 관리되는 가장 작은 단위
Node : 파드가 동작하고 실행되는 서버
Cluster : 여러 노드로 구성된 집합체