๐ณ Docker ๋ฐฐํฌ ๊ฐ์ด๋
โ ๏ธ ์ฐธ๊ณ : ์ด ๋ฌธ์์ ์์์์
doll_gacha๋ผ๋ ์ด๋ฆ์ด ์ฌ์ฉ๋์ง๋ง, ์ด๋ ์ด์ ํ๋ก์ ํธ์์ ๊ฐ์ ธ์จ ์์์ ๋๋ค. ์ค์ ์ฌ์ฉ ์ ํ๋ก์ ํธ์ ๋ง๋ ์ด๋ฆ(container_name, network ๋ฑ)์ผ๋ก ๋ณ๊ฒฝํ์ธ์.
๐ ๋ชฉ์ฐจ
- Docker๋?
- ์์ฑ๋ ํ์ผ ์ค๋ช
- ์์ ์์ ๋ฐ ๋ช ๋ น์ด
- ์์ฃผ ์ฌ์ฉํ๋ Docker ๋ช ๋ น์ด
-
ํธ๋ฌ๋ธ์ํ
1. Docker๋?
๐ค Docker๊ฐ ๋ญ๊ฐ์?
Docker๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋๋ผ๋ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์์ ์คํํ๊ฒ ํด์ฃผ๋ ๋๊ตฌ์ ๋๋ค.
์ Docker๋ฅผ ์ฌ์ฉํ๋์?
- โ๋ด ์ปดํจํฐ์์๋ ๋๋๋ฐโฆโ ๋ฌธ์ ํด๊ฒฐ โ ์ด๋์๋ ๋์ผํ ํ๊ฒฝ
- ์ค์น ๊ฐํธ โ Java, DB ๋ฑ์ ์ผ์ผ์ด ์ค์นํ ํ์ ์์
- ๋ฐฐํฌ ์ฌ์ โ ์ด๋ฏธ์ง๋ง ์์ผ๋ฉด ์ด๋์๋ ์คํ ๊ฐ๋ฅ
ํต์ฌ ๊ฐ๋
| ์ฉ์ด | ์ค๋ช | ๋น์ | |โโ|โโ|โโ| | 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"]
# โ ์ปจํ
์ด๋ ์์ ์ ์คํํ ๋ช
๋ น (ํ๋ก๋์
ํ๋กํ์ผ๋ก ์คํ)
๐ก ๋ฉํฐ์คํ ์ด์ง ๋น๋๋?
- Stage 1์์ ๋น๋ํ๊ณ , Stage 2์์๋ ๊ฒฐ๊ณผ๋ฌผ(JAR)๋ง ๊ฐ์ ธ๊ฐ
- ์ต์ข ์ด๋ฏธ์ง์ Gradle, ์์ค์ฝ๋ ๋ฑ ๋ถํ์ํ ๊ฒ์ด ํฌํจ๋์ง ์์
- ์ด๋ฏธ์ง ํฌ๊ธฐ ๋ํญ ๊ฐ์ (1GB โ 200MB)
๐ 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๊ฐ ๊ด๋ฆฌ)
๐ก ์ฃผ์ ๊ฐ๋
${๋ณ์:-๊ธฐ๋ณธ๊ฐ}: ํ๊ฒฝ๋ณ์๊ฐ ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉdepends_on: ์์กด์ฑ ์์ ์ง์ (DB ๋จผ์ โ ์ฑ ๋์ค์)volumes: ์ปจํ ์ด๋๊ฐ ์ญ์ ๋์ด๋ ๋ฐ์ดํฐ ์ ์ง-
networks: ์ปจํ ์ด๋๋ผ๋ฆฌ ํต์ ํ ์ ์๋ ๊ฐ์ ๋คํธ์ํฌ
๐ .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
โ ๏ธ ์ค์!
.env.example: ํ ํ๋ฆฟ (Git์ ์ฌ๋ ค๋ ๋จ).env: ์ค์ ๋น๋ฐํค (์ ๋ Git์ ์ฌ๋ฆฌ๋ฉด ์ ๋จ!)
๐ 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
์ด ๋ช ๋ น์ด ํ๋ ์ผ:
- Dockerfile ์ฝ๊ธฐ
- Gradle ์ด๋ฏธ์ง ๋ค์ด๋ก๋ (์ฒ์๋ง)
- ์์กด์ฑ ๋ค์ด๋ก๋
- JAR ํ์ผ ๋น๋
- ์ต์ข ์คํ ์ด๋ฏธ์ง ์์ฑ
Step 6: ์ปจํ ์ด๋ ์คํ
# ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ (-d = detached)
docker-compose up -d
์ด ๋ช ๋ น์ด ํ๋ ์ผ:
- MariaDB ์ปจํ ์ด๋ ์์
- DB ํฌ์ค์ฒดํฌ ๋๊ธฐ (์ฝ 30์ด)
- Spring Boot ์ฑ ์ปจํ ์ด๋ ์์
- ์ฑ ์์ ์๋ฃ (์ฝ 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 ์ค์ ์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋๋ฆฌ๊ธฐ:
- Docker Desktop โ Settings โ Resources
- Memory๋ฅผ 4GB ์ด์์ผ๋ก ์ค์
- Apply & Restart
๐ ์ฐธ๊ณ ์๋ฃ
โ ์ฒดํฌ๋ฆฌ์คํธ
๋ฐฐํฌ ์ ํ์ธ์ฌํญ:
- Docker Desktop ์คํ ์ค
.envํ์ผ์ ๋ชจ๋ ํ๊ฒฝ๋ณ์ ์ค์ - 8080 ํฌํธ ์ฌ์ฉ ๊ฐ๋ฅ
- 3407 ํฌํธ ์ฌ์ฉ ๊ฐ๋ฅ (DB)
๋ฐฐํฌ ํ ํ์ธ์ฌํญ:
docker-compose ps์์ ๋ชจ๋ ์๋น์ค healthy- http://localhost:8080 ์ ์ ๊ฐ๋ฅ
- ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ์ ์ ์๋
- ํ์ผ ์ ๋ก๋ ์ ์ ์๋
๋ฌธ์ ์์ฑ์ผ: 2026-01-20 ํ๋ก์ ํธ: Doll Gacha