클라우드응용SW개발

[Cloud] 11주차-1. 컨테이너 기술과 Docker의 이해

tryinto_gmlt 2026. 6. 3. 23:05

⭐ Docker란?

개발을 하다 보면 이런 상황을 겪게 된다. 내 컴퓨터에서는 잘 돌아가던 코드가 서버에 올리면 갑자기 오류가 난다. 원인을 보면 대부분 실행 환경 차이다. OS 환경이 다르거나, 설치된 라이브러리 버전이 다르거나, Python 버전이 달라서 생기는 문제들이다.

Docker는 이 문제를 해결하기 위해 등장했다. 애플리케이션 코드뿐 아니라 실행에 필요한 라이브러리, 설정, 실행 환경 등을 하나의 패키지로 묶어 어디서든 동일하게 실행할 수 있게 해주는 오픈소스 컨테이너 플랫폼이다.

이 패키지 단위를 컨테이너(Container)라고 부른다.

 

⭐ 가상 머신(VM) vs 컨테이너

Docker 이전에는 실행 환경을 분리하기 위해 가상 머신(VM)을 사용했다. VM과 컨테이너는 모두 애플리케이션 실행 환경을 격리하지만, 동작 방식에는 차이가 있다.
VM은 애플리케이션마다 별도의 Guest OS를 포함하여 실행된다. 격리 수준은 높지만, OS를 여러 개 실행해야 하므로 메모리와 디스크 사용량이 크고 시작 속도가 느리다.
반면 컨테이너는 호스트 OS의 커널을 공유하고, 애플리케이션 실행에 필요한 라이브러리와 설정만 포함한다. 따라서 VM보다 가볍고 빠르며, 배포와 이동이 쉽다.

항목 가상 머신 (VM) 컨테이너
OS 구조 앱마다 Guest OS 포함 호스트 OS 커널 공유
자원 사용 많음 적음
실행 속도 느림 빠름
격리 수준 높음 상대적으로 낮음
이식성 보통 매우 높음

⭐ Docker 동작 흐름

Docker를 사용하는 흐름은 크게 세 단계다. 

1. Dockerfile 작성

어떤 환경에서 앱을 실행할지를 텍스트 파일로 정의한다.

베이스 OS, 설치할 패키지, 실행 명령어 등을 적는다. 일종의 환경 설계도라고 생각하면 된다.

2. docker build → Docker Image 생성

Dockerfile을 기반으로 docker build 명령을 실행하면 Docker Image가 만들어진다.

Image는 컨테이너를 찍어낼 수 있는 틀(템플릿)이다. 한 번 만들어두면 몇 개의 컨테이너든 동일하게 찍어낼 수 있다.

3. docker run → Docker Container 실행

docker run 명령으로 Image를 실제로 실행하면 Container가 생성된다.

컨테이너는 Image가 메모리 위에서 살아 움직이는 상태다. 같은 Image에서 여러 컨테이너를 동시에 띄우는 것도 가능하다.

 

⭐ Docker Layer 구조

Docker Image는 단일 파일이 아니라, 여러 개의 Layer가 순서대로 쌓인 구조다.

Dockerfile의 명령어 한 줄이 실행될 때마다 새로운 Layer가 추가된다고 보면 된다.

예를 들어 ubuntu 베이스 이미지(Layer A, B, C) 위에 nginx를 설치하면 nginx Layer가 추가되고, 거기에 web app 소스를 올리면 또 하나의 Layer가 쌓인다. 컨테이너가 실제로 실행될 때는 맨 위에 R/W(읽기·쓰기) Layer가 하나 더 추가되어, 실행 중 발생하는 변경사항은 이 레이어에만 기록된다. 아래 Image Layer들은 항상 읽기 전용으로 유지된다.

Layer 구조가 주는 실질적인 이점

  • 빌드 속도 향상: 변경되지 않은 Layer는 캐시를 그대로 재사용하기 때문에, 전체를 다시 빌드하지 않아도 된다.
  • 저장 공간 절약: 여러 Image가 동일한 베이스 Layer를 공유하므로 중복 저장이 없다.
  • 다운로드 효율: 이미 가지고 있는 Layer는 다시 받지 않아 pull 속도가 빠르다.

 

⭐ Docker Image 경로 (Registry)

빌드한 Image를 혼자만 쓰지 않고 다른 서버나 팀원과 공유하려면 Registry에 올려야 한다.

Registry는 Docker Image를 저장하고 배포하는 저장소로, Git과 GitHub의 관계와 비슷하다고 보면 된다.

  • Docker Hub: Docker에서 공식 운영하는 공개 Registry. 누구나 이미지를 올리고 내려받을 수 있다.
  • Private Registry: 조직 내부에서 운영하는 비공개 저장소. 보안이 필요한 이미지를 관리할 때 사용한다.

Image 이름 구조

Docker Image의 전체 경로는 아래 네 가지 요소로 구성된다.

구성 요소 역할 예시
Registry 이미지 저장소 주소 docker.io
Namespace 사용자 또는 조직명 library
Image name 이미지 이름 nginx
TAG 버전 정보 latest, 1.12.1
# Docker Hub 공식 이미지 (Registry/Namespace/이름:태그)
docker.io/library/nginx:latest
docker.io/library/nginx:1.12.1

# Private Registry 이미지
private_reg_Ksh/Temp-app:1.0
private_reg_Ksh/Temp-app:1.1
💡 TAG는 버전을 구분하는 레이블이다. 지정하지 않으면 기본값으로 latest가 사용된다.