도커(Docker)란?
Accelerate how you build, share, and run applications
: 컨테이너 가상화 기술을 이용해 개발자들이 프로그램을 더 쉽게 배포/공유/실행 할 수 있도록 설계된 컨테이너 기반 오픈 소스 가상화 플랫폼
각 애플리케이션을 컨테이너라 불리는 독립적 환경에 격리시켜, 한 컴퓨터에서 여러 애플리케이션을 동시에 실행하고 관리할 수 있도록 한다. 즉, 프로세스들을 마치 배에 실린 컨테이너처럼 각 컨테이너로 격리시켜 하나씩 관리하는 기술
기존 가상화 방식 vs 도커?
가상화 기술이 나오기 전에 1 서버, 1 OS 하나의 프로그램만 운영되고, 남는 공간은 방치 -> 안정적+비효율
하이퍼 바이저 기반 가상화 출현 -> 논리적으로 공간 분할 : VM(Virtual Machine) 독립된 가상 환경의 서버 이용 가능
*하이퍼 바이저 : 호스트 시스템에서 다수의 게스트 OS 구동할 수 있게 하는 SW, 하드웨어 가상화하면서 하드웨어+각VM을 모니터링하는 중간 관리자
네이티브 하이퍼 바이저 vs 호스트형 하이퍼 바이저
네이티브 : 하드웨어 직접 제어 - 효율적 자원 사용 가능/호스트OS X - overhead 낮음/하드위어 드라이브 세팅 필요
호스트형 : 호스트 OS 위에 실행, 하드웨어 자원을 VM 내부의 게스트 OS에 에뮬레이트하는 방식 - overhead 큼
하이퍼바이저에 구동되는 VM은 각 VM마다 독립된 가상 하드웨어 자원 할당 받아,
논리적으로 붙리되어 있어 한 VM에 오류 발생 시, 다른 VM 영향 X, 다양한 OS 설치 가능
=> 도커도 이러한 가상화 기술에서 나온 컨테이너 가상화 기술
애플리케이션 격리는 가상 머신 (VM) 을 통해 이루어졌다.
가상 머신은 각 애플리케이션을 위해 별도 OS를 설치해, 불필요한 작업이 있는데,
도커는 이러한 점을 개선하여, 하나의 운영 시스템을 공유하면서, 애플리케이션을 격리시킬 수 있도록 한다.
이로 인해 더 적은 자원을 사용하면서 빠른 실행이 가능해진다.
컨테이너 가상화 기술 vs 기존 가상화 기술(VM)
VM과 비교했을 때, 컨테이너는 하이퍼바이저와 게스트 OS가 필요하지 않아 가볍다.
실행 시, 컨테이너 방식은 호스트 OS위에 이미지 배포만 하면 됨 (VM은 VM띄우고, 자원할당, 게스트 OS 부팅 후, 실행필요)
도커 컨테이너와 가상 머신의 공통점으로는 기본 하드웨어를 격리된 환경내에서 애플리케이션을 배치한다는 것이고 가장 큰 차이점은 격리된 환경을 얼마나 격리 시키는지이다.
도커 컨테이너에서 애플리케이션은 컨테이너로 격리되어 있지만 같은 호스트의 다른 컨테이너와 동일한 커널을 공유한다. 결과적으로, 컨테이너 내부에서 실행되는 프로세스는 호스트 시스템에서 확인할 수 있다. 또한, 컨테이너가 전체 OS를 내장할 필요가 없는 결과 매우 가볍다.
가상 머신 같은 경우 호스트 운영 체제 또는 하피어바이저와 독립되어 있다. 그래서 이 특정 VM만을 위한 커널을 부팅하고 운영체제 프로세스를 시작해야 하기 때문에 응용 프로그램만 포함하는 컨테이너보다 VM의 크기를 훨씬 크게 만든다. 해당 방법은 비교적 사용법이 간단하지만 매우 느리다.
어떻게 컨테이너를 격리 시키는걸까?
먼저 Linux에서 사용되는 cgroup과 namespace에 대해 알아봐야 된다. cgroup은 CPU 메모리, Network BandWidth, HD io 등 프로세스 그룹의 시스템 리소스 사용량을 관리하는 기술이다. 즉, 어떤 애플리케이션의 사용량이 너무 많다면 cgroup을 이용해 사용량을 제한할 수 있다.
namespace는 하나의 시스템에서 프로세스를 격리시켜 별개의 독립된 공간을 사용하는 것처럼 격리된 환경을 제공하는 경량 프로세스 가상화 기술이다. 이러한 기술들을 이용하여 컨테이너를 격리시킨다.
우리의 환경은 MacOS/Windows 지만, 실제로 도커는 리눅스 환경에서 돌아갈 수 있다.
도커 주요 구성 요소
도커 파일(Dockerfile)
도커 파일은 도커 이미지를 만들기 위한 스크립트로, 애플리케이션을 실행하는데 필요한 모든 명령어 포함하고, 이미지를 빌드하는 과정을 자동화
도커 이미지(Docker image)
도커 이미지는 컨테이너를 실행하기 위한 기본 템플릿으로,
애플리케이션과 모든 종속성 및 라이브러리를 포함한(코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행) 파일 시스템의 스냅샷
모든 것을 포함하는 가볍고/독립적/실행가능한 SW package
이미지는 변경되지 않으며, 같은 이미지에서 여러 컨테이너를 생성할 수 있다.
도커 컨테이너(Docker Container)
도커 컨테이너는 이미지를 기반으로 생성된 실행 가능한 인스턴스
코드의 모든 종속성을 패키지화하여 응용 프로그램이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되게 된다.
=> 환경으로부터 격리되어 인프라에 관계없이 동일 실행 가능
(필요한 코드와 런타임, 시스템 도구, 시스템 라이브러리 등 실제 실행 환경을 모두 포함)
컨테이너는 독립적으로 실행되며, 애플리케이션을 시작/정지/이동/삭제 가능하다.
컨테이너는 이미지 기반으로 생성되어,
이미지를 실행한 상태로, 파일 시스템과 애플리케이션이 실행된 상태라고 보면 된다.
생성과정은 도커 파일 빌드 -> 도커 이미지 생성 -> 도커 컨테이너 생성
이미지로 컨테이너 만드는 과정
이미지를 이용하여 컨테이너를 생성한다고 했는데, 어떻게 이미지로 컨테이너를 만들까?
이미지는 프로그램을 실행하는데 필요한 모든 것(컨테이너가 시작될때 실행 명령어, 파일 스냅샷)을 가지고 있다.
- docker run <이미지> 명령어를 이용해 도커 이미지를 실행하게 되면
- 먼저 컨테이너가 생성되고 도커 이미지 파일 스냅샷에 있는 파일을 컨테이너 하드 디스크에 넣어준다.
- 그 후, 이미지에서 가지고 있는 명령어를 이용해서 해당 파일을 실행시키게된다
베이스 이미지로부터 다른 종속성이나 새로운 커맨드를 추가할 때 임시 컨테이너를 만든 후 그 컨테이너를 토대로 새로운 이미지를 만들고 그 임시 컨테이너는 삭제된다. => 재빌드 효율성을 높이기도 했다.
도커 사용 흐름
1. 도커 클라이언트(CLI)에서 명령어 입력 : docker run [이미지 이름]
2. 클라이언트에서 도커 서버로 요청
3. 서버에서는 [이미지 이름]이라는 이미지가 로컬에 cache 되어있는지 확인
4. 존재시, 그 이미지를 이용해 컨테이너 생성하고, 없으면 Docker hub 가서 이미지를 가져와 로컬에 cache로 보관
5. 생성된 컨테이너가 이미지에서 받은 설정이나 조건에 따라 프로그램 실행
도커의 장점 : 환경 일관성 + 이식성 + 보안
참고 및 출처
- https://parkmuhyeun.github.io/study/it%20infra/2024-02-11-docker/
'공부' 카테고리의 다른 글
ECS vs EKS (ing) (0) | 2025.04.18 |
---|---|
컨테이너 오케스트레이션 종류 (0) | 2025.04.18 |
[aws] aws ec2, ssm 명령어 사용기 (0) | 2025.04.16 |
AWS SSM(system manager) Parameter Store (0) | 2025.04.15 |
AWS System Manager(SSW) EC2 인스턴스 연결 설정(SSH 대체) (1) | 2025.04.11 |