개발로그

Docker란 무엇인가? (컨테이너, 이미지, 볼륨)

pizzalist 2024. 4. 15. 21:31

1. 컨테이너

가상화

가상화는 하드웨어 자원을 논리적으로 분리하여 여러 개의 가상 환경을 만드는 기술입니다. 이를 통해 하나의 물리적 서버에서 여러 개의 가상 서버를 구축하여 자원을 공유하고, 유연하게 서버를 구성할 수 있습니다.

가상화를 통해서 가상머신(VM)을 만들어 낼 수 있습니다. VM은 호스트 운영체제에서 구동되며 그 바탕이 되는 하드웨어에 가상으로 액세스하는 Guest 운영체제를 가지는 일종의 격리된 머신 입니다. 쉽게 생각하면 하나의 컴퓨터입니다. (물리적인 컴퓨터 자원을 가상화시켜 별도의 컴퓨터를 만든 뒤 거기에 필요한 운영체제를 올렸다고 생각합시다.)

컨테이너

컨테이너는 가상머신과 마찬가지로 애플리케이션을 관련 라이브러리 및 모든 종속항목과 패키지(그냥 APP에 필요한 모든 파일, 설치파일들, 필요한 모든 것들)로 묶어 소프트웨어 서비스 구동을 위한 격리환경을 마련해 주지만 큰 차이점이 있습니다.

바로 가상화 방식이 다르다는 점입니다. 기존의 VM을 생성하는 가상화 방식은 주로 OS를 가상화하였습니다. Host OS가 존재하고 그 위에 Guest OS 전체를 가상화하는 방식이었습니다. 그러므로 OS가 가상머신 이미지에 포함되어야만 하고 이는 용량이 매우 클 수밖에 없는 구조입니다. 가상화 기술의 발전으로 성능이 좋아졌다고는 하지만, 전가상화와 반가상화 등 Guest OS를 포함하여 운영하는 방식은 여전히 하드웨어 성능을 100% 뽑아낼 수 없습니다.

하지만 컨테이너 기술은 다릅니다. 컨테이너는 별도의 하드웨어 에뮬레이션 없이 리눅스 커널을 공유하여 컨테이너를 실행하며 Guest OS가 존재하지 않습니다. 이런 가상화를 '운영체제 수준의 가상화'라고 부릅니다. 이게 가능한 까닭은 바로 리눅스 컨테이너를 통해 '프로세스를 격리' 하는 것이 가능하기 때문입니다.

컨테이너의 장점

  • 경량화된 가상화 기술을 사용하기 때문에 빠른 구동 속도와 적은 메모리 사용량을 보인다.
  • 애플리케이션을 패키징하여 이식성을 높일 수 있다.
  • 서로 격리된 환경에서 애플리케이션이 실행되기 때문에 보안성이 높아진다.
  • 애플리케이션의 라이브러리 및 종속성을 포함하여 패키징하기 때문에 애플리케이션의 이식성이 높아진다.

2. Docker란 무엇인가?

도커(Docker)란 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 컨테이너 기술을 이용하여 애플리케이션을 더 쉽게 생성, 배포, 실행할 수 있습니다.

도커 이미지(Docker Image)

도커 이미지는 컨테이너를 생성하는데 필요한 파일과 설정값 등을 포함하고 있는 것으로, 컨테이너를 생성하기 위한 템플릿입니다. 이러한 도커 이미지는 도커 허브(Docker Hub)와 같은 저장소에 저장되어 있으며, 사용자는 이러한 이미지를 내려받아 컨테이너를 생성 및 실행할 수 있습니다.

 

이미지는 특정 프로세스(프로그램)을 실행하기 위한 모든, 정말 모든 파일과 설정값 등을 지닌 것으로 더 이상의 의존성(dependent) 파일을 컴파일 하거나 설치할 필요가 없습니다.

도커 이미지 경로

도커 이미지는 URL과 태그를 이용하여 관리 됩니다.

도커의 이미지 이름은 문자열 입니다. 도커허브를 기준으로 도커 이미지의 이름은 <NAMESPACE>/<IMAGE_NAME>:<TAG> 형식입니다.

이미지 생성방식

도커는 이미지를 만들기 위해서 Docker File 이라는 파일에 자체 DSL(Domain-Specific-Language)를 이용하여 이미지 생산 과정을 명시합니다.의존성 패키지를 설치하고 설정파일을 만들지 않고 Dockerfile을 통해 관리할 수 있습니다. 이 파일은 소스와 함께 버전이 관리되고 누구나 이미지 생산 과정을 볼 수 있어 수정 및 배포가 용이합니다.

 

이미지 저장소(Registry)

도커는 빌드한 이미지를 서버에 배포하기 위해서, 직접 파일을 복사하는 방법 대신 도커 레지스트리(Docker Registry)를 이용합니다.

도커 명령어를 이용하여, 이미지를 레지스트리에 push 하고 필요할 때는 레지스트리에서 pull하여 간편하게 사용 가능합니다.

Layer 저장방식

도커의 이미지는 여러 개의 layer로 구성됩니다. 새로운 이미지가 생성될 때, 이전 이미지의 layer를 그대로 사용하고, 변경된 layer만 새로 생성하여 추가합니다. 이렇게 하면 이전 이미지와의 차이점만 새로운 이미지에서 저장하므로, 이미지 생성 시간과 용량을 크게 줄일 수 있습니다.

이미지 하나는 여러개의 immutable layer로 구성됩니다.

 

3. 도커 볼륨 (Docker Volume)

도커 컨테이너 내부와 호스트 OS의 디렉토리를 공유할 수 있는 방법입니다. 컨테이너를 삭제하더라도 볼륨은 삭제되지 않고 유지되며, 다른 컨테이너에서도 사용이 가능합니다.

볼륨 생성 방법

볼륨을 생성하는 방법은 크게 두 가지로 나눠집니다.

 

1. 명령어를 이용하여 생성하는 방법

docker volume create <VOLUME_NAME>

 

2. Dockerfile을 이용하여 생성하는 방법

VOLUME /path/to/volume

 

볼륨 삭제 방법

  1. 컨테이너 삭제
  2. 현재 volume 확인
docker volume ls
  1. 삭제
docker volume rm <VOLUME_NAME>   

 

 

 

//도커 실행 종료후 삭제
docker run --rm image_name
 
//중지된 컨테이너 사용하지 않는 이미지 전부 삭제
docker system prune -a
 
// 캐시 없이 빌드
docker build --no-cache -t u12_core -f u12_core .
 
 
//docker 오브젝트 전부 삭제
docker system prune --volumes

'개발로그' 카테고리의 다른 글

[Python] Logging  (0) 2024.04.15
[Python] Argparser  (0) 2024.04.15
자동 파일 삭제 cron 만들기  (0) 2024.04.15
[Linux] shell 명령어  (0) 2024.04.15
[MySQL] MySQL 용량 확인 방법  (0) 2024.04.15