๐Ÿณ Docker ๋ฐฐํฌ ๊ฐ€์ด๋“œ

โš ๏ธ ์ฐธ๊ณ : ์ด ๋ฌธ์„œ์˜ ์˜ˆ์‹œ์—์„œ doll_gacha๋ผ๋Š” ์ด๋ฆ„์ด ์‚ฌ์šฉ๋˜์ง€๋งŒ, ์ด๋Š” ์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์ ธ์˜จ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์‚ฌ์šฉ ์‹œ ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” ์ด๋ฆ„(container_name, network ๋“ฑ)์œผ๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”.

๐Ÿ“‹ ๋ชฉ์ฐจ

  1. Docker๋ž€?
  2. ์ƒ์„ฑ๋œ ํŒŒ์ผ ์„ค๋ช…
  3. ์ž‘์—… ์ˆœ์„œ ๋ฐ ๋ช…๋ น์–ด
  4. ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” Docker ๋ช…๋ น์–ด
  5. ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

1. Docker๋ž€?

๐Ÿค” Docker๊ฐ€ ๋ญ”๊ฐ€์š”?

Docker๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปจํ…Œ์ด๋„ˆ๋ผ๋Š” ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

์™œ Docker๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜์š”?

ํ•ต์‹ฌ ๊ฐœ๋…

| ์šฉ์–ด | ์„ค๋ช… | ๋น„์œ  | |โ€”โ€”|โ€”โ€”|โ€”โ€”| | Image (์ด๋ฏธ์ง€) | ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ๋‹ด๊ธด ํ…œํ”Œ๋ฆฟ | ๋ถ•์–ด๋นต ํ‹€ | | Container (์ปจํ…Œ์ด๋„ˆ) | ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•œ ์ธ์Šคํ„ด์Šค | ๋ถ•์–ด๋นต | | Dockerfile | ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๋ ˆ์‹œํ”ผ | ๋ถ•์–ด๋นต ๋ ˆ์‹œํ”ผ | | docker-compose | ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•œ๋ฒˆ์— ๊ด€๋ฆฌ | ์„ธํŠธ ๋ฉ”๋‰ด ์ฃผ๋ฌธ์„œ |


2. ์ƒ์„ฑ๋œ ํŒŒ์ผ ์„ค๋ช…

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

project/
โ”œโ”€โ”€ Dockerfile              โ† ์•ฑ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ ˆ์‹œํ”ผ
โ”œโ”€โ”€ docker-compose.yml      โ† ์ „์ฒด ์„œ๋น„์Šค ๊ตฌ์„ฑ
โ”œโ”€โ”€ .dockerignore           โ† Docker ๋นŒ๋“œ ์‹œ ์ œ์™ธํ•  ํŒŒ์ผ
โ”œโ”€โ”€ .env                    โ† ์‹ค์ œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ (๋น„๋ฐ€!)
โ”œโ”€โ”€ settings.gradle         โ† Gradle ํ”„๋กœ์ ํŠธ ์„ค์ •
โ””โ”€โ”€ src/main/resources/
    โ”œโ”€โ”€ application.yml     โ† ๊ฐœ๋ฐœ์šฉ ์„ค์ •
    โ””โ”€โ”€ application-prod.yml โ† ํ”„๋กœ๋•์…˜์šฉ ์„ค์ •

๐Ÿ“„ Dockerfile - ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ ˆ์‹œํ”ผ

# ===== Stage 1: ๋นŒ๋“œ ์Šคํ…Œ์ด์ง€ =====
FROM gradle:8-jdk17 AS builder
# โ†’ Gradle + JDK 17์ด ์„ค์น˜๋œ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ์ž‘
# โ†’ "builder"๋ผ๋Š” ์ด๋ฆ„์„ ๋ถ™์—ฌ์„œ ๋‚˜์ค‘์— ์ฐธ์กฐ

WORKDIR /build
# โ†’ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ /build๋กœ ์„ค์ •

COPY ../../build.gradle settings.gradle ./
COPY ../../gradle ./gradle
# โ†’ Gradle ์„ค์ • ํŒŒ์ผ๋“ค์„ ๋จผ์ € ๋ณต์‚ฌ (์บ์‹ฑ ํ™œ์šฉ)

RUN gradle dependencies --no-daemon || true
# โ†’ ์˜์กด์„ฑ ๋‹ค์šด๋กœ๋“œ (๋ณ€๊ฒฝ ์—†์œผ๋ฉด ์บ์‹œ ์‚ฌ์šฉ)

COPY ../../src ./src
# โ†’ ์†Œ์Šค์ฝ”๋“œ ๋ณต์‚ฌ

RUN gradle bootJar --no-daemon -x test
# โ†’ JAR ํŒŒ์ผ ๋นŒ๋“œ (ํ…Œ์ŠคํŠธ ์Šคํ‚ต)

# ===== Stage 2: ์‹คํ–‰ ์Šคํ…Œ์ด์ง€ =====
FROM eclipse-temurin:17-jre-alpine
# โ†’ ๊ฐ€๋ฒผ์šด JRE ์ด๋ฏธ์ง€ ์‚ฌ์šฉ (์•ฝ 200MB vs ์ „์ฒด JDK 800MB)

WORKDIR /app

ENV TZ=Asia/Seoul
RUN apk add --no-cache tzdata curl && \
    cp /usr/share/zoneinfo/$TZ /etc/localtime
# โ†’ ์‹œ๊ฐ„๋Œ€ ์„ค์ • + curl ์„ค์น˜ (ํ—ฌ์Šค์ฒดํฌ์šฉ)

RUN mkdir -p /app/uploads
# โ†’ ์—…๋กœ๋“œ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ

COPY --from=builder /build/build/libs/*.jar app.jar
# โ†’ builder ์Šคํ…Œ์ด์ง€์—์„œ ๋นŒ๋“œํ•œ JAR๋งŒ ๊ฐ€์ ธ์˜ด

EXPOSE 8080
# โ†’ 8080 ํฌํŠธ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ฌธ์„œํ™” (์‹ค์ œ ์—ด๋ฆฌ๋Š” ๊ฑด ์•„๋‹˜)

HEALTHCHECK --interval=30s --timeout=3s --start-period=60s --retries=3 \
  CMD curl -f http://localhost:8080/actuator/health || exit 1
# โ†’ 30์ดˆ๋งˆ๋‹ค ํ—ฌ์Šค์ฒดํฌ, ์‹คํŒจํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "app.jar"]
# โ†’ ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์‹œ ์‹คํ–‰ํ•  ๋ช…๋ น (ํ”„๋กœ๋•์…˜ ํ”„๋กœํŒŒ์ผ๋กœ ์‹คํ–‰)

๐Ÿ’ก ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ๋ž€?


๐Ÿ“„ docker-compose.yml - ์„œ๋น„์Šค ๊ตฌ์„ฑ

services:
  # ===== MariaDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค =====
  db:
    image: mariadb:10.11           # MariaDB ๊ณต์‹ ์ด๋ฏธ์ง€ ์‚ฌ์šฉ
    container_name: doll_gacha_db  # ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ ์ง€์ •
    restart: unless-stopped        # ์ˆ˜๋™ ์ค‘์ง€ ์ „๊นŒ์ง€ ์ž๋™ ์žฌ์‹œ์ž‘
    environment:                   # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-rootpassword}
      MYSQL_DATABASE: doll_gacha   # ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  DB
      MYSQL_USER: doll_gacha       # ์ƒ์„ฑํ•  ์‚ฌ์šฉ์ž
      MYSQL_PASSWORD: ${DB_PASSWORD:-ckdlsk13!}
      TZ: Asia/Seoul
    ports:
      - "3407:3306"                # ํ˜ธ์ŠคํŠธ:์ปจํ…Œ์ด๋„ˆ ํฌํŠธ ๋งคํ•‘
    volumes:
      - db_data:/var/lib/mysql     # ๋ฐ์ดํ„ฐ ์˜๊ตฌ ์ €์žฅ
    networks:
      - doll_gacha_network         # ๊ฐ™์€ ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ
    healthcheck:                   # DB ์ค€๋น„ ์ƒํƒœ ํ™•์ธ
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 5

  # ===== Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ =====
  app:
    build:
      context: .                   # ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ Dockerfile ์‚ฌ์šฉ
      dockerfile: Dockerfile
    container_name: doll_gacha_app
    restart: unless-stopped
    ports:
      - "8080:8080"                # ์›น ์ ‘์† ํฌํŠธ
    environment:
      # DB ์—ฐ๊ฒฐ (db๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„, ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ๋กœ ์—ฐ๊ฒฐ)
      SPRING_DATASOURCE_URL: jdbc:mariadb://db:3306/doll_gacha
      SPRING_DATASOURCE_USERNAME: doll_gacha
      SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD:-ckdlsk13!}
      
      # OAuth2, JWT ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” .env์—์„œ ๊ฐ€์ ธ์˜ด
      KAKAO_CLIENT_ID: ${KAKAO_CLIENT_ID}
      KAKAO_CLIENT_SECRET: ${KAKAO_CLIENT_SECRET}
      GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
      GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET}
      JWT_SECRET_KEY: ${JWT_SECRET_KEY}
      APP_BASE_URL: ${APP_BASE_URL:-http://localhost:8080}
    volumes:
      - ./uploads:/app/uploads     # ์—…๋กœ๋“œ ํŒŒ์ผ ์˜๊ตฌ ์ €์žฅ
    depends_on:
      db:
        condition: service_healthy # DB๊ฐ€ ์ค€๋น„๋œ ํ›„์— ์•ฑ ์‹œ์ž‘
    networks:
      - doll_gacha_network

networks:
  doll_gacha_network:
    driver: bridge                 # ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„

volumes:
  db_data:                         # ์ด๋ฆ„ ์žˆ๋Š” ๋ณผ๋ฅจ (Docker๊ฐ€ ๊ด€๋ฆฌ)

๐Ÿ’ก ์ฃผ์š” ๊ฐœ๋…

๐Ÿ“„ .dockerignore - ๋นŒ๋“œ ์ œ์™ธ ํŒŒ์ผ

Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์‹œ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. .gitignore์™€ ๋น„์Šทํ•œ ์—ญํ• ์ž…๋‹ˆ๋‹ค.

build/           # ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ (Docker์—์„œ ์ƒˆ๋กœ ๋นŒ๋“œํ•จ)
.gradle/         # Gradle ์บ์‹œ
.idea/           # IDE ์„ค์ •
*.iml
logs/            # ๋กœ๊ทธ ํŒŒ์ผ
.git/            # Git ํžˆ์Šคํ† ๋ฆฌ
.env             # ํ™˜๊ฒฝ๋ณ€์ˆ˜ (๋ณด์•ˆ!)
์„ค๊ณ„/            # ์„ค๊ณ„ ๋ฌธ์„œ (๋นŒ๋“œ์— ๋ถˆํ•„์š”)

๐Ÿ“„ .env.example / .env - ํ™˜๊ฒฝ๋ณ€์ˆ˜

# ===== ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ • =====
DB_ROOT_PASSWORD=your_root_password_here
DB_PASSWORD=your_db_password_here

# ===== OAuth2 ์„ค์ • =====
KAKAO_CLIENT_ID=your_kakao_client_id
KAKAO_CLIENT_SECRET=your_kakao_client_secret
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret

# ===== JWT ์„ค์ • =====
JWT_SECRET_KEY=your_super_secret_jwt_key_at_least_32_characters_long

# ===== ์•ฑ ์„ค์ • =====
APP_BASE_URL=http://localhost:8080

โš ๏ธ ์ค‘์š”!


๐Ÿ“„ application-prod.yml - ํ”„๋กœ๋•์…˜ ์„ค์ •

๊ฐœ๋ฐœ ์„ค์ •(application.yml)๊ณผ ๋‹ค๋ฅธ ์ : | ํ•ญ๋ชฉ | ๊ฐœ๋ฐœ | ํ”„๋กœ๋•์…˜ | |โ€”โ€”|โ€”โ€”|โ€”โ€”โ€”-| | ddl-auto | create (๋งค๋ฒˆ ํ…Œ์ด๋ธ” ์žฌ์ƒ์„ฑ) | update (๋ณ€๊ฒฝ๋งŒ ์ ์šฉ) | | sql.init.mode | always (์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…) | never (์‹คํ–‰ ์•ˆํ•จ) | | show_sql | true (SQL ๋กœ๊ทธ ์ถœ๋ ฅ) | false (์„ฑ๋Šฅ ํ–ฅ์ƒ) | | thymeleaf.cache | false (์ฆ‰์‹œ ๋ฐ˜์˜) | true (์„ฑ๋Šฅ ํ–ฅ์ƒ) | | devtools | enabled | disabled | โ€”

๐Ÿ“„ settings.gradle - Gradle ํ”„๋กœ์ ํŠธ ์„ค์ •

rootProject.name = 'test'

Gradle ๋นŒ๋“œ ์‹œ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. Docker ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ์—์„œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. โ€”

3. ์ž‘์—… ์ˆœ์„œ ๋ฐ ๋ช…๋ น์–ด

๐Ÿ”ง ์‚ฌ์ „ ์ค€๋น„

Step 1: Docker Desktop ์„ค์น˜ ํ™•์ธ - ์‚ฌ์ดํŠธ์—์„œ ์„ค์น˜ํ•ด์•ผ๋จ

# Docker ๋ฒ„์ „ ํ™•์ธ
docker --version
# ์˜ˆ์ƒ ์ถœ๋ ฅ: Docker version 24.x.x

# Docker Compose ๋ฒ„์ „ ํ™•์ธ
docker-compose --version
# ์˜ˆ์ƒ ์ถœ๋ ฅ: Docker Compose version v2.x.x

Step 2: Docker Desktop ์‹คํ–‰

Windows์—์„œ Docker Desktop ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  ์šฐ์ธก ํ•˜๋‹จ ํŠธ๋ ˆ์ด์—์„œ ๐Ÿณ ์•„์ด์ฝ˜์ด โ€œDocker Desktop is runningโ€ ์ƒํƒœ์ธ์ง€ ํ™•์ธ


๐Ÿš€ ๋ฐฐํฌ ์‹คํ–‰

Step 3: ํ”„๋กœ์ ํŠธ ํด๋”๋กœ ์ด๋™

cd C:\workspace\your-project-folder

Step 4: ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํŒŒ์ผ ์ƒ์„ฑ

# ํ…œํ”Œ๋ฆฟ ๋ณต์‚ฌ
Copy-Item .env.example .env

# .env ํŒŒ์ผ ํŽธ์ง‘ (๋ฉ”๋ชจ์žฅ์œผ๋กœ ์—ด๊ธฐ)
notepad .env

.env ํŒŒ์ผ ์ˆ˜์ • ์˜ˆ์‹œ:

DB_ROOT_PASSWORD=mySecureRootPass123!
DB_PASSWORD=ckdlsk13!
KAKAO_CLIENT_ID=abc123...
KAKAO_CLIENT_SECRET=def456...
GOOGLE_CLIENT_ID=ghi789...
GOOGLE_CLIENT_SECRET=jkl012...
JWT_SECRET_KEY=mySuperSecretJWTKeyThatIsAtLeast32CharactersLong
APP_BASE_URL=http://localhost:8080

5,6,7 ์š”์•ฝ ์ด๋ฏธ์ง€ ์žฌ๋นŒ๋“œ (์ฝ”๋“œ ๋ณ€๊ฒฝ ๋ฐ˜์˜) docker-compose build โ€“no-cache ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€ ๋ฐ ์ƒˆ๋กœ ์‹œ์ž‘ docker-compose down docker-compose up -d

Step 5: Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ

# ์ด๋ฏธ์ง€ ๋นŒ๋“œ (์ฒ˜์Œ์—๋Š” 5-10๋ถ„ ์†Œ์š”)
docker-compose build

# ๋นŒ๋“œ ๊ณผ์ • ์ƒ์„ธ ๋ณด๊ธฐ
docker-compose build --progress=plain

์ด ๋ช…๋ น์ด ํ•˜๋Š” ์ผ:

  1. Dockerfile ์ฝ๊ธฐ
  2. Gradle ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ (์ฒ˜์Œ๋งŒ)
  3. ์˜์กด์„ฑ ๋‹ค์šด๋กœ๋“œ
  4. JAR ํŒŒ์ผ ๋นŒ๋“œ
  5. ์ตœ์ข… ์‹คํ–‰ ์ด๋ฏธ์ง€ ์ƒ์„ฑ

Step 6: ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

# ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ (-d = detached)
docker-compose up -d

์ด ๋ช…๋ น์ด ํ•˜๋Š” ์ผ:

  1. MariaDB ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘
  2. DB ํ—ฌ์Šค์ฒดํฌ ๋Œ€๊ธฐ (์•ฝ 30์ดˆ)
  3. Spring Boot ์•ฑ ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘
  4. ์•ฑ ์‹œ์ž‘ ์™„๋ฃŒ (์•ฝ 30-60์ดˆ)

Step 7: ์‹คํ–‰ ์ƒํƒœ ํ™•์ธ

# ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ
docker-compose ps

# ์˜ˆ์ƒ ์ถœ๋ ฅ:
# NAME              STATUS                   PORTS
# doll_gacha_app    Up 2 minutes (healthy)   0.0.0.0:8080->8080/tcp
# doll_gacha_db     Up 2 minutes (healthy)   0.0.0.0:3407->3306/tcp

Step 8: ๋กœ๊ทธ ํ™•์ธ

# ์ „์ฒด ๋กœ๊ทธ ๋ณด๊ธฐ
docker-compose logs

# ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ๋ณด๊ธฐ (Ctrl+C๋กœ ์ข…๋ฃŒ)
docker-compose logs -f

# ์•ฑ ๋กœ๊ทธ๋งŒ ๋ณด๊ธฐ
docker-compose logs -f app

# DB ๋กœ๊ทธ๋งŒ ๋ณด๊ธฐ
docker-compose logs -f db

Step 9: ์ ‘์† ํ…Œ์ŠคํŠธ

# ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด๊ธฐ
Start-Process "http://localhost:8080"

# ๋˜๋Š” curl๋กœ ํ…Œ์ŠคํŠธ
curl http://localhost:8080/actuator/health

๐Ÿ›‘ ์„œ๋น„์Šค ์ค‘์ง€/์‚ญ์ œ

์„œ๋น„์Šค ์ค‘์ง€ (๋ฐ์ดํ„ฐ ์œ ์ง€)

docker-compose stop

์„œ๋น„์Šค ์žฌ์‹œ์ž‘

docker-compose start

์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ (๋ฐ์ดํ„ฐ ์œ ์ง€)

docker-compose down

์™„์ „ ์‚ญ์ œ (๋ฐ์ดํ„ฐ ํฌํ•จ)

# ๋ณผ๋ฅจ(DB ๋ฐ์ดํ„ฐ)๊นŒ์ง€ ์‚ญ์ œ
docker-compose down -v

# ์ด๋ฏธ์ง€๊นŒ์ง€ ์‚ญ์ œ
docker-compose down -v --rmi all

๐Ÿ”„ ์—…๋ฐ์ดํŠธ ๋ฐฐํฌ

์ฝ”๋“œ ์ˆ˜์ • ํ›„ ์žฌ๋ฐฐํฌ:

# 1. ์ƒˆ๋กœ ๋นŒ๋“œํ•˜๋ฉด์„œ ์‹คํ–‰
docker-compose up -d --build

# ๋˜๋Š” ๋‹จ๊ณ„๋ณ„๋กœ:
# 1. ์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€
docker-compose down

# 2. ์ƒˆ๋กœ ๋นŒ๋“œ
docker-compose build

# 3. ๋‹ค์‹œ ์‹คํ–‰
docker-compose up -d

4. ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” Docker ๋ช…๋ น์–ด

๐Ÿ“Š ์ƒํƒœ ํ™•์ธ

# ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก
docker ps

# ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ (์ค‘์ง€๋œ ๊ฒƒ ํฌํ•จ)
docker ps -a

# ์ด๋ฏธ์ง€ ๋ชฉ๋ก
docker images

# ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰
docker system df

๐Ÿ” ๋””๋ฒ„๊น…

# ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ์ ‘์† (bash)
docker exec -it doll_gacha_app sh

# ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋ช…๋ น ์‹คํ–‰
docker exec doll_gacha_app ls -la /app

# DB ์ปจํ…Œ์ด๋„ˆ ์ ‘์†
docker exec -it doll_gacha_db mysql -u doll_gacha -p

๐Ÿงน ์ •๋ฆฌ

# ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ
docker system prune

# ๋ชจ๋“  ๋ฏธ์‚ฌ์šฉ ์ด๋ฏธ์ง€ ์‚ญ์ œ
docker image prune -a

# ๋ชจ๋“  ๋ณผ๋ฅจ ์‚ญ์ œ (์ฃผ์˜!)
docker volume prune

5. ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

โŒ โ€œport is already allocatedโ€

# ํฌํŠธ ์‚ฌ์šฉ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค ํ™•์ธ
netstat -ano | findstr :8080

# ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ (PID ํ™•์ธ ํ›„)
taskkill /PID <PID๋ฒˆํ˜ธ> /F

# ๋˜๋Š” docker-compose.yml์—์„œ ํฌํŠธ ๋ณ€๊ฒฝ
# ports:
#   - "8081:8080"  โ† 8081๋กœ ๋ณ€๊ฒฝ

โŒ โ€œCannot connect to the Docker daemonโ€

# Docker Desktop์ด ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธ
# ์‹œ์Šคํ…œ ํŠธ๋ ˆ์ด์—์„œ Docker ์•„์ด์ฝ˜ ํ™•์ธ

# Docker Desktop ์žฌ์‹œ์ž‘
# ๋˜๋Š” ์„œ๋น„์Šค ์žฌ์‹œ์ž‘
Restart-Service docker

โŒ โ€œdatabase connection failedโ€

# DB ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ
docker-compose logs db

# DB๊ฐ€ ์™„์ „ํžˆ ์‹œ์ž‘๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ (์ฒ˜์Œ ์‹คํ–‰ ์‹œ 1-2๋ถ„)
docker-compose logs -f db

# ์•ฑ๋งŒ ์žฌ์‹œ์ž‘
docker-compose restart app

โŒ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์‹คํŒจ

# ์บ์‹œ ์—†์ด ์ƒˆ๋กœ ๋นŒ๋“œ
docker-compose build --no-cache

# ๋นŒ๋“œ ๋กœ๊ทธ ์ƒ์„ธ ํ™•์ธ
docker-compose build --progress=plain 2>&1 | Tee-Object build.log

โŒ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ

Docker Desktop ์„ค์ •์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋Š˜๋ฆฌ๊ธฐ:

  1. Docker Desktop โ†’ Settings โ†’ Resources
  2. Memory๋ฅผ 4GB ์ด์ƒ์œผ๋กœ ์„ค์ •
  3. Apply & Restart

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ


โœ… ์ฒดํฌ๋ฆฌ์ŠคํŠธ

๋ฐฐํฌ ์ „ ํ™•์ธ์‚ฌํ•ญ:

๋ฐฐํฌ ํ›„ ํ™•์ธ์‚ฌํ•ญ:


๋ฌธ์„œ ์ž‘์„ฑ์ผ: 2026-01-20 ํ”„๋กœ์ ํŠธ: Doll Gacha