Docker는 애플리케이션을 컨테이너라는 단위로 포장해서 실행할 수 있게 해주는 플랫폼이다.
- 컨테이너는 OS 수준 가상화로, 애플리케이션과 실행 환경을 함께 패키징 한다.
- 이렇게 하면 다른 환경에서도 “한 번 만든 이미지를 어디서든 똑같이 실행”할 수 있다.
Docker를 사용할 때, 이미지와 컨테이너라는 개념이 등장하는데 이 개념에 대한 설명과 이름이 와닿지는 않았기에 이해하려고 많은 노력을 기울였다.
✅ 1. Docker 이미지(Image)란?
이미지는 애플리케이션과 실행 환경이 포함된 ‘설치 패키지’이다.
📦 정의:
- 애플리케이션 실행에 필요한 모든 것(코드, 라이브러리, 시스템 설정 등)을 포함한 읽기 전용 파일이다.
- 하나의 이미지 파일로 어디서든 실행 가능하도록 만들어 놓은 일종의 템플릿이다.
위 정의와 같이 말할 수 있지만 글로 읽어서는 이해하기 어렵기에 비유해서 이해하는 것이 더욱 좋다.
🧠 비유:
이미지는 레시피 + 재료가 미리 들어 있는 냉동 도시락이라고 생각해 보자.
- 도시락(= 이미지)은 냉장고에 저장되어 있음.
- 전자레인지에 돌리면 → 완성된 음식이 됨 (= 컨테이너)
✅ 2. Docker 컨테이너(Container)란?
컨테이너는 이미지로부터 실행된 ‘프로세스’이다.
📦 정의:
- 이미지를 기반으로 실제 실행 중인 인스턴스
- 독립된 환경에서 돌아가는 애플리케이션의 실시간 프로세스
🧠 비유:
이미지는 냉동 도시락이고,
컨테이너는 전자레인지에서 데운 도시락이다.
- 도시락은 이미지로 여러 번 만들 수 있음
- 데워서 꺼내면 그게 실행 중인 컨테이너
- 컨테이너는 시작하고, 정지하고, 삭제할 수 있음
✅ 3. 이미지와 컨테이너의 차이점
항목 | 이미지(Image) | 컨테이너(Containner) |
상태 | 정적 (변하지 않음) | 동적 (실행 중, 종료될 수 있음) |
역할 | 실행 환경 저장소 | 실행 단위 |
생성 방식 | Dockerfile로 docker build | 이미지로부터 docker run |
저장 위치 | 로컬 디스크, Docker Hub 등 | 메모리/디스크 상의 실행 영역 |
수명 | 영구적 | 일시적 (정지, 삭제 가능) |
관계 요약
- 하나의 이미지를 가지고 여러 개의 컨테이너 생성 가능.
- 컨테이너는 이미지의 복사본을 실행시키는 것.
✅ 4. Volume: 컨테이너의 외부 저장소
컨테이너는 기본적으로 휘발성. 컨테이너 삭제 = 데이터 삭제 → 데이터를 유지하려면 Volume을 사용한다.
📌 Volume이란?
- 컨테이너 외부에 데이터를 저장하는 공간.
- 컨테이너가 삭제되어도 데이터는 유지됨.
📌 언제 필요한가?
- DB 데이터 저장
- 로그 저장
- 소스코드 실시간 반영 (개발 중) 등
✅ 5. 관련 명령어 요약
📌 이미지 & 컨테이너 명령어 설명
docker build -t [이름:태그] . # Dockerfile을 이용해 이미지 빌드
docker run -d --name [이름] [이미지] # 컨테이너 실행
docker ps -a # 모든 컨테이너 목록
docker rm [이름(id)] # docker 컨테이너 삭제
docker rmi [이름(id)] # docker 이미지 삭제
🗂️ 전체 구성 디렉토리
📁 my-project/
├── Dockerfile ← 이미지 정의 (앱 하나용)
├── docker-compose.yml ← 여러 컨테이너 연결/실행 설정
├── app.js ← 실제 실행될 애플리케이션 코드 (Node.js 예시)
├── package.json ← Node.js 프로젝트 정보, 의존성
└── .dockerignore ← Docker 빌드시 제외할 파일 목록
🔍 각 파일의 역할과 작동 흐름
파일명 | 역할 | 사용 시점 |
Dockerfile | 이미지를 어떻게 만들지 정의 실행 환경, 패키지 설치, 명령어 등을 포함 |
docker build 시 읽힘 |
app.js | 실제 실행되는 애플리케이션 코드 | Dockerfile의 CMD 또는 ENTRYPOINT로 실행됨 |
package.json | Node.js 앱의 의존성 정보 (express, dotenv 등) | Dockerfile 내 npm install 단계에서 사용 |
.dockerignore | Docker가 빌드 시 무시할 파일 목록 (node_modules, .git, logs 등) | docker build 시 COPY 전에 적용 |
docker-compose.yml | 여러 개의 컨테이너를 한꺼번에 실행하고 네트워크로 연결 | docker-compose up 시 사용 |
위와 같이 Docker에 대해 학습하였고 로컬 개발 환경에서 시작하여 클라우드 VM에 2-Tier 아키텍처 실습을 진행하였다.
2-Tier 아키텍처라고 되어있지만 App Tier에 프론트엔드와 백엔드가 함께 포함되어 있고, DB Tier에 데이터베이스가 속해있기에 완벽한 2 Tier 아키텍처라고 말하기도, 3 Tier 아키텍처라고 말하기도 애매한 그 중간 어딘가의 실습이다.
1️⃣ 2-Tier 아키텍처란?
2-Tier 아키텍처는 애플리케이션을 두 개의 주요 계층(Layer) 으로 분리하여 구성한 구조이다.
- 1 계층 (App Tier): 사용자 인터페이스와 로직을 담당하는 웹 애플리케이션 (Node.js)
- 2 계층 (DB Tier): 데이터를 저장하고 관리하는 데이터베이스 서버 (MySQL)
✅ 확장성, 관리 용이성, 보안 측면에서 유리하며, 실무에서도 많이 활용된다.
🔍 장점:
- 유지보수 용이 (역할 분리가 명확함)
- 보안 강화 (DB 접근 제한 가능)
- 확장성 향상 (각 계층 독립적으로 확장 가능)
Docker를 사용해서 위와 같은 실습을 진행하기 위해서는 Docker Compose라는 개념도 알아야 한다.
2️⃣ Docker Compose
Docker Compose는 여러 개의 컨테이너 서비스를 정의하고 실행하기 위한 도구이다. docker-compose.yml 파일로 정의하며, 단일 명령으로 애플리케이션 전체 구성을 시작/종료할 수 있다.
📂 예시 구성:
services:
app:
build: ./app
ports:
- "80:3000"
db:
image: mysql
ports:
- "3306:3306"
🛠️ 명령어:
- docker-compose up -d: 백그라운드 실행
- docker-compose down: 종료
- docker-compose ps: 상태 확인
실제로 간단하지만 기능이 수행되는 서비스를 구축해 만드는 과정을 해보니 개념과 이론이 이해되는 깊이가 달라지는 것을 느끼고 있다.
본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 (B-log) 리뷰로 작성되었습니다.