인프라 · Docker

Docker

내 앱과 그 실행 환경(OS·라이브러리·설정)을 하나의 상자(컨테이너)로 묶어, 어디서든 똑같이 실행되게 해주는 도구입니다. "내 컴퓨터에선 되는데요?" 문제를 없애줍니다.

한 줄로

Docker? 는 앱을 이미지로 굽고, 그 이미지를 컨테이너로 실행합니다. 가상머신(VM)보다 가볍고 빠르게 뜨며, 같은 이미지는 노트북·서버·클라우드 어디서나 동일하게 동작해요.

이미지는 "요리 레시피", 컨테이너는 "그 레시피로 만든 실제 요리 한 그릇". 레시피 하나로 같은 요리를 몇 그릇이든 똑같이 만들 수 있습니다.
왜 / 어디에 쓰나
  • 개발 환경 통일 — 팀원 모두 같은 DB·버전으로 시작(설치 지옥 제거)
  • 의존 서비스 띄우기 — PostgreSQL·Redis·Kafka를 명령 한 줄로 로컬 실행
  • 배포 — 빌드한 이미지를 그대로 서버/클라우드에 올림(환경 차이 없음)
  • CI — 빌드·테스트를 깨끗한 컨테이너에서 재현 가능하게

핵심 개념 4가지

개념설명
이미지(Image)앱+환경을 굳혀 만든 읽기전용 템플릿. 레지스트리에서 받거나 직접 빌드.
컨테이너(Container)이미지를 실행한 인스턴스. 가볍게 뜨고 지울 수 있음.
Dockerfile이미지를 어떻게 만들지 적은 레시피 파일.
레지스트리(Registry)이미지 저장소(Docker Hub 등). pull로 받고 push로 올림.

핵심 명령

# 이미지 받고 컨테이너 실행 (예: PostgreSQL)
docker run --name pg -e POSTGRES_PASSWORD=secret -p 5432:5432 -d postgres:16

docker ps                 # 실행 중인 컨테이너 목록
docker logs -f pg         # 로그 보기
docker exec -it pg bash   # 컨테이너 안으로 들어가기
docker stop pg && docker rm pg   # 중지 후 삭제

# 내 앱을 이미지로 빌드 → 실행
docker build -t myapp:1.0 .
docker run -p 8080:8080 myapp:1.0

Dockerfile 예시

# Spring Boot jar를 담는 간단한 이미지
FROM eclipse-temurin:17-jre
COPY build/libs/study.jar app.jar
EXPOSE 8084
ENTRYPOINT ["java", "-jar", "app.jar"]

여러 컨테이너는 Compose로

앱 + DB처럼 여러 컨테이너를 한 번에 정의·실행하려면 docker compose 를 씁니다.

# docker-compose.yml
services:
  db:
    image: postgres:16
    environment: { POSTGRES_DB: studydb, POSTGRES_PASSWORD: secret }
    ports: ["5432:5432"]
# 실행: docker compose up -d
이 프로젝트와의 관계

이 프로젝트의 PostgreSQL을 직접 설치하는 대신 docker run ... postgres 로 띄우면 환경 세팅이 훨씬 간단합니다. 더 나아가 백엔드(Spring Boot)를 이미지로 빌드해 배포할 수 있어요. 여러 서비스를 묶는 다음 단계는 Kubernetes입니다.

다음 단계

  • 컨테이너 여러 개를 자동으로 배치·복구·확장 → Kubernetes
  • 이미지가 도는 바탕 OS·명령 → Linux