Docker 시작하기

이해하기

Docker(도커)란?

도커(Docker)는 애플리케이션을 어디서나 동일하게 실행할 수 있도록 ‘컨테이너’라는 표준화된 실행 환경을 만들어주는 기술이에요.

설치

windows
docker desktop 설치 https://www.docker.com/products/docker-desktop/

WSL이란? (Windows Subsystem for Linux)

WSL = 윈도우 안에서 리눅스를 실행할 수 있게 해주는 기능이에요.
예전에는 리눅스 개발하려면, 듀얼 부팅, 가상머신(VMware, VirtualBox) 같은 무거운 방법이 필요했는데

✨ WSL은 Windows 안에서 리눅스 환경을 아주 가볍게 바로 실행할 수 있는 기술입니다.

wsl -l -v

  NAME              STATE           VERSION
* docker-desktop    Running         2
용어 설명
WSL Windows에서 리눅스를 실행 가능한 기능
WSL2 최신, 더 빠르고 정확한 리눅스 커널 기반 버전

왜 Docker가 WSL2를 필요로 할까?

도커는 원래 Linux 기술(컨테이너, cgroup, namespace) 기반이에요. Windows는 리눅스가 아니라서 바로 실행할 수 없음.

Docker Image(도커 이미지) 란?

앱을 실행하기 위한 ‘설계도 + 재료 세트’

도커 이미지 안에는 다음이 들어 있어요:
– 운영체제의 기본 틀 (예: 리눅스 최소 버전)
– 실행 언어/런타임 (Python, Node.js 등)
– 라이브러리, 패키지
– 앱 소스코드
– 환경 설정

Container(컨테이너)란?

컨테이너 = Docker 이미지가 실제로 실행되고 있는 독립된 공간(환경) 즉,
👉 이미지는 설계도,
👉 컨테이너는 그 설계도로 만든 실제 실행 중인 애플리케이션.

이미지로부터 실제 실행된 인스턴스(프로세스) 하나의 이미지로 컨테이너 여러 개 만들 수 있음 상태를 가짐 (로그, 파일, 실행 상태)

Docker Compose(도커 컴포즈)가 뭐야?

Docker Compose = 여러 개의 컨테이너를 한 번에 관리하는 도구

한 프로젝트 안에는 보통:

Spring Boot backend 컨테이너

PostgreSQL DB 컨테이너

Redis 컨테이너

프론트엔드(React/Next.js) 컨테이너

Nginx 컨테이너

이 여러 개가 동시에 연결되어 돌아가야 하죠?

✨ 이걸 docker run으로 일일이 실행하려면 너무 복잡해요.

그래서 나온 게 docker-compose.yml!

여러 컨테이너를 로컬에서 한 번에 띄우는 도구 어떤 이미지를 쓸지 환경변수 볼륨 포트 컨테이너 간 관계 로컬 개발용 오케스트레이션 기능 없음 컨테이너 죽으면 자동 재시작 안 함

Image(이미지)

docker desktop 실행

이미지 확인

$ docker images

IMAGE                   ID             DISK USAGE   CONTENT SIZE   EXTRA
spring-backend:latest   ef859d384cda        416MB          115MB

이미지 빌드

sptring boot 프로젝트 준비 후 root 경로에 Dockerfile 생성
(확장명 없이 파일명은 반드시 Dockerfile)

# Dockerfile

# 1단계: Build
FROM eclipse-temurin:17-jdk AS builder
WORKDIR /app

COPY . .
RUN ./gradlew bootJar

# 2단계: Runtime
FROM eclipse-temurin:17-jre
WORKDIR /app

COPY --from=builder /app/build/libs/*.jar app.jar

ENTRYPOINT ["java", "-jar", "app.jar"]

이미지 빌드

$ docker build -t spring-backend ./springbackend

이미지 삭제

$ docker rmi spring-backend:latest

이미지 다운로드

$ docker pull postgres:15

Container(컨테이너)

컨테이너 확인

$ docker ps
$ docker ps -a (종료된 것도 포함)

CONTAINER ID   IMAGE            COMMAND               CREATED          STATUS          PORTS                                         NAMES
08a3470db291   spring-backend   "java -jar app.jar"   49 seconds ago   Up 49 seconds   0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp   bold_hopper

컨테이너 실행

$ docker run -d --name spring-backend -p 8080:8080 spring-backend:latest
$ docker run --name my-postgres -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=1234 -p 5432:5432 -d postgres:15

컨테이너 로그 확인

$ docker logs -f 08a3470db291

컨테이너 삭제

$ docker rm 08a3470db291

Docker Compose(도커 컴포즈)

프로젝트 기본 구조

project-root/
 ├─ docker-compose.yml
 ├─ spring/
 │   ├─ src/
 │   ├─ build.gradle
 │   └─ ...
 └─ (기타 파일)

컴포즈 실행

# docker-compose.yml
version: "3.9"

services:
  db:
    image: postgres:15
    container_name: postgres-db
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 1234
      POSTGRES_DB: postgres
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data

  spring:
    image: spring-backend:latest # 이미 빌드된 이미지 사용
    container_name: spring-backend
    ports:
      - "8080:8080"
    depends_on:
      - db

volumes:
  pgdata:

$ docker compose up

컴포즈 종료

$ docker compose down

Contents