최근 회사에서 배포 환경을 도커로 구성해 보라는 과제를 받게 되었다.
기존에는 로컬 환경에서만 Next.js 앱을 실행해 봤지만, 이번 기회를 통해 Docker에 대해 기초부터 학습하고 Next.js 앱을 실제로 컨테이너에 올려 실행하는 데 성공했다. 본 글에서 Docker의 개념, VM과의 차이, Dockerfile 작성 및 컨테이너 실행까지 전 과정을 정리하였다.
💡 Docker 기초 개념
컨테이너란?
컨테이너(Container)는 운영체제 수준의 가상화 기술로, 호스트 OS의 커널을 공유하면서 독립적인 실행 환경을 제공합니다.
전통적인 VM처럼 무거운 OS를 포함하지 않고, 애플리케이션과 그에 필요한 라이브러리만 포함하여 빠르고 가볍게 실행할 수 있는 것이 특징입니다.
- 대표적인 리눅스 기반 컨테이너 기술로 LXC (Linux Container) 가 있으며, Docker는 이 기술 위에서 동작합니다.
- "하나의 컨테이너는 하나의 프로세스" 원칙(One Process per Container)을 따르며, 이는 컨테이너의 역할 분리와 유지보수를 쉽게 해 줍니다.
- 컨테이너는 항상 특정 Docker Image로부터 생성되며, 해당 이미지를 기반으로 애플리케이션이 실행됩니다.
가상화란?
가상화(Virtualization)는 하드웨어나 소프트웨어 자원을 논리적으로 추상화하여 여러 환경에서 사용할 수 있도록 해주는 기술입니다. 가장 흔한 예는 VM(Virtual Machine)으로, 물리적인 하드웨어 하나 위에 여러 개의 운영체제를 동시에 실행할 수 있도록 합니다.
분류:
- 하드웨어 가상화 (예: VMware, VirtualBox)
- OS 수준 가상화 (예: Docker, LXC)
- 네트워크, 저장소 가상화 등
전통적인 가상화(VM) vs Docker 가상화 플랫폼
VM
- Host OS 위에 가상화를 위한 Hypervisor 엔진 위에 guest OS를 올려 사용한다.
- Host와 완전히 분리되는 장점이 있지만, OS위에 OS를 올리기 때문에 무겁고 느리다.
컨테이너
- Host OS 위에 도커 엔진 위에 애플리케이션 실행에 필요한 바이너리만 올려서 사용한다.
- Host 커널을 공유하여 IO처리 성능 효율성을 높일 수 있다.
- Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 한다.
요약정리
구조 | Hypervisor 위에 Guest OS 실행 | Docker Engine 위에 App 실행 |
성능 | 무거움 (OS 포함) | 가벼움 (커널 공유) |
속도 | 느림 (부팅 필요) | 빠름 (즉시 실행) |
자원 소모 | 많음 (OS 중복) | 적음 (커널 공유) |
환경 격리 | 강력함 (OS 단위) | 중간 수준 (프로세스 단위) |
용도 | 완전한 OS 격리 필요할 때 | CI/CD, 마이크로서비스 등 빠른 배포 필요할 때 |
정리 : Docker는 VM 보다 가볍고 빠르다.
Docker란?
Docker는 리눅스 컨테이너 기술을 바탕으로 애플리케이션을 패키징, 배포, 실행할 수 있도록 도와주는 오픈소스 플랫폼입니다.
Docker의 핵심 장점
- 성능 향상
- 가상머신(VM) 보다 가볍고 빠르다.
- OS 전체를 포함하지 않고 필요한 라이브러리, 의존성만 포함한다.
- 뛰어난 이식성
- 의존성 문제를 해결할 수 있다.
- 개발, 테스트, 운영 환경을 동일하게 구성할 수 있다.
- 확장성
- 이미지 기반 배포로 신속한 롤아웃이 가능하다.
- Kubernetes 등 오케스트레이션 도구와 연동 가능하다.
- 쉬운 유연성
- CICD 도구와 연동이 수월하다.
- 이미지 기반으로 빠르게 배포할 수 있다.
로컬 실행 vs Docker 환경 비교
설치 의존성 | 직접 설치 필요 (Node.js, DB 등) | 이미지로 통합 관리 |
충돌 가능성 | 포트, 버전 충돌 가능 | 네임스페이스, 포트 매핑으로 분리 |
배포 안정성 | 환경 차이로 실패할 수 있음 | 이미지 기반이므로 일관성 유지 |
협업 | 환경 맞추기 번거로움 | Dockerfile 공유로 즉시 재현 가능 |
Docker Image
Docker Image는 컨테이너 실행에 필요한 모든 정보(코드, 라이브러리, 의존성, 설정)를 담고 있는 불변의 템플릿이다.
- 컨테이너는 이미지를 기반으로 생성됩니다.
- 이미지 자체는 변경되지 않으며, 항상 동일한 환경을 제공합니다.
- 계층 구조로 이루어져 있어, 캐시 활용을 통한 빠른 빌드가 가능합니다.
DockerFile
Dockerfile은 Docker Image를 만들기 위한 스크립트 파일로, 어떤 환경에서 어떤 파일을 복사하고 어떤 명령어를 실행할지를 정의합니다.
- 이미지를 구성하기 위한 명령어들을 작성하여 이미지를 구성할 수 있다.
- DockerFile을 읽을 수 있다면 해당 이미지가 어떻게 구성되어 있는지도 알 수 있다.
DockerFile 주요 명령어 소개
# ===== 1단계: Build Stage =====
FROM node:18-alpine AS builder # 1️⃣ 베이스 이미지 지정 (빌드용)
WORKDIR /app # 2️⃣ 작업 디렉터리 설정
COPY package*.json ./ # 3️⃣ 의존성 설치를 위한 파일 복사
RUN npm install # 4️⃣ 의존성 설치
COPY . . # 5️⃣ 전체 소스코드 복사
RUN npm run build # 6️⃣ Next.js 빌드 실행
# ===== 2단계: Production Stage =====
FROM node:18-alpine # 7️⃣ 실행용 베이스 이미지 지정
WORKDIR /app # 8️⃣ 실행용 작업 디렉터리 설정
COPY --from=builder /app ./ # 9️⃣ 빌드 결과 복사 (최소 실행 환경만)
ENV NODE_ENV=production # 🔟 실행 환경 설정
EXPOSE 3000 # ⓫ 외부에 열 포트 설정
CMD ["npm", "start"] # ⓬ 컨테이너 시작 시 실행할 명령어
명령어 설명
FROM | 베이스 이미지 설정 |
WORKDIR | 작업 디렉터리 설정 |
COPY | 파일 복사 |
RUN | 명령어 실행 (npm install 등) |
ENV | 환경변수 설정 |
EXPOSE | 컨테이너가 사용할 포트 지정 |
CMD | 컨테이너 시작 시 실행할 명령 지정 |
Docker Hub
- Docker Image들을 저장, 배포, 공유할 수 있는 공식 이미지 저장소
- Docker CLI에서 docker pull, docker push 명령으로 손쉽게 이미지 업로드/다운로드 가능
- 조직 단위로 관리할 수 있는 Docker Hub Organization 기능도 제공
reference
https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90
[Docker] Docker의 개념 및 핵심 설명
Docker란 Go언어로 작성된 리눅스 컨테이너 기반으로하는 오픈소스 가상화 플랫폼이다.현재 Docker 0.9버전 부터는 직접 개발한 libcontainer 컨테이너를 사용하고 있다. 가상화를 사용하는 이유는?이제
khj93.tistory.com
'📂 BE' 카테고리의 다른 글
[데이터 저장 방식 2편] SHA256로 암호화된 로그인 시스템 만들기: Next.js부터 PostgreSQL, Docker 패키징까지 구현기 (3) | 2025.05.23 |
---|---|
[데이터 저장 방식 1편] 사용자 인증 시스템 제대로 이해하기 : 세션, 암호화, 쿠키, PostgreSQL 기초 정리 (2) | 2025.05.22 |