Post

๐Ÿณ Docker ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ

๐Ÿณ Docker ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ

์™œ Docker๋ฅผ ๋„์ž…ํ–ˆ๋Š”๊ฐ€?

๊ฐ€๋ น ๋ฐฑ์—”๋“œ, ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ํ˜‘์—…์„ ์œ„ํ•ด ๋™๋ฃŒ ๊ฐœ๋ฐœ์ž์˜ PC์— JDK, IDE, DB ๋“ฑ์„ ์ง์ ‘ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ๋ฒˆ๊ฑฐ๋กœ์šด๊ฐ€. ๋‹จ์ˆœํžˆ ๋ฒ„์ „์„ ๋งž์ถ”๋Š” ๊ฒƒ๋งŒ ํ•ด๋„ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ๊ท€์ฐฎ์€ ์—…๋ฌด๊ฐ€ ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค. ๊ทธ๋ƒฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ž์ฒด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด ์ •๋ง ํŽธํ•˜์ง€ ์•Š์„๊นŒ? ์ด๋•Œ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์ด๋‹ค.

ํ•„์ž๋„ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ์ ํŠธ ์‹คํ–‰ ํ›„ React๋ฅผ ํ†ตํ•ด ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ, ๋ฐฑ์—”๋“œ์˜ ์†Œ์Šค ์ฝ”๋“œ๋‚˜ DB๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์— ๋ถˆํŽธํ•จ์„ ๊ฒช์—ˆ๋‹ค. ์ด ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด Docker๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ ๋นŒ๋“œ ํ•ด๋ณด์•˜๋‹ค.

์ ˆ์ฐจ

  1. Spring Boot ํ”„๋กœ์ ํŠธ Jar ํŒŒ์ผ๋กœ ๋นŒ๋“œ
  2. dockerfile ์ž‘์„ฑ
  3. docker-compose.yml ์ž‘์„ฑ ๋ฐ ์‹คํ–‰
โœ… application.yml ์ž‘์„ฑ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
spring:
ย ย datasource:
ย ย ย ย url: ${ENV_DB:jdbc:oracle:thin:@localhost:xe}?oracle.jdbc.timezoneAsRegion=false
ย ย ย ย username: ${ENV_USERNAME:DB_์•„์ด๋””}
ย ย ย ย password: DB_ํŒจ์Šค์›Œ๋“œ

ย ย jpa:
ย ย ย ย hibernate:
ย ย ย ย ย ย ddl-auto: update
ย ย ย ย properties:
ย ย ย ย ย ย hibernate:
ย ย ย ย ย ย ย ย format_sql: true

logging:
ย ย level:
ย ย ย ย org.hibernate.SQL: debug
ย ย ย ย org.hibernate.orm.jdbc.bind: trace
ย ย ย ย ํ”„๋กœ์ ํŠธ_๋„๋ฉ”์ธ: debug
  • ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๋‚ด DB๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋ฏ€๋กœ ${ํ™˜๊ฒฝ๋ณ€์ˆ˜}๋ฅผ ํ†ตํ•ด DB URL ๊ฐ’์„ ์ฃผ์ž…ํ•ด์•ผ ํ•œ๋‹ค.
  • Jar ํŒŒ์ผ์„ ๋นŒ๋“œ ํ•  ๋•Œ๋Š” Docker์™€ ๊ด€๋ จ ์—†์ด ์—ฐ๊ฒฐ๋  DB URL์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ${ํ™˜๊ฒฝ๋ณ€์ˆ˜:๊ธฐ๋ณธ๊ฐ’} ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.
  • ํ•„์ž๋Š” ํƒ€์ž„์กด ๊ด€๋ จ ์˜ค๋ฅ˜๋กœ DB ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•ด์„œ ?oracle.jdbc.timezoneAsRegion=false ์˜ต์…˜์„ DB URL์— ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.
  • ์ƒ๊ธฐ ํŒŒ์ผ์—๋Š” jpa.hibernate.ddl-auto ๊ฐ’์ด update๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š”๋ฐ, ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ๋Š” none ๋˜๋Š” validate๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.
โœ… dockerfile ์ž‘์„ฑ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# JDK ์„ค์ • 
FROM openjdk:17-jdk-slim

# ๊ธฐ๋ณธ ํฌํŠธ ์„ค์ •
EXPOSE 8080

# JAR ํŒŒ์ผ ๋ณต์‚ฌ
COPY ./build/libs/ํ”„๋กœ์ ํŠธ๋ช…-๋ฒ„์ „-SNAPSHOT.jar /usr/local/app/ํ”„๋กœ์ ํŠธ๋ช…-๋ฒ„์ „-SNAPSHOT.jar

# ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
ENV ENV_DB=jdbc:oracle:thin:@oracle-db:1521:xe
ENV ENV_USERNAME=system

# ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ ์„ค์ •
WORKDIR /usr/local/app

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
ENTRYPOINT ["sh", "-c", "sleep 60 && java -jar ํ”„๋กœ์ ํŠธ๋ช…-๋ฒ„์ „-SNAPSHOT.jar"]
  • Spring Boot ํ”„๋กœ์ ํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” DB๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ docker-compose.yml ํŒŒ์ผ์—์„œ ์˜์กด ๊ด€๊ณ„ ์„ค์ •์„ ํ†ตํ•ด ๋นŒ๋“œ ์ˆœ์„œ๋ฅผ ์ •ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ์„œ๋น„์Šค๊ฐ€ ์‹ค์ œ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ๋งˆ์ณค๋Š”์ง€๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค.
  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด sh -c sleep 60 ๋ช…๋ น์–ด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ์ ์— ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.
โœ… docker-compose.yml ์ž‘์„ฑ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
services:
ย ย oracle-db:
ย ย ย ย image: gvenzl/oracle-xe:11-slim
ย ย ย ย environment:
ย ย ย ย ย ย ORACLE_USER: DB_์‚ฌ์šฉ์ž_ID
ย ย ย ย ย ย ORACLE_PASSWORD: DB_๋น„๋ฐ€๋ฒˆํ˜ธ
ย ย ย ย networks:
ย ย ย ย ย ย - oracle-network

ย ย spring-app:
ย ย ย ย build: .
ย ย ย ย image: spring-app
ย ย ย ย ports:
ย ย ย ย ย ย - "8080:8080"
ย ย ย ย depends_on:
ย ย ย ย ย ย - oracle-db
ย ย ย ย restart: on-failure:3
ย ย ย ย networks:
ย ย ย ย ย ย - oracle-network

networks:
ย ย oracle-network:
ย ย ย ย driver: bridge
  • ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ์ƒ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.

ํšŒ๊ณ 

  • dockerfile์„ ์ž‘์„ฑํ•  ๋•Œ sh -c sleep 60 ๋ช…๋ น์–ด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ์ ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์˜์กด ๊ด€๊ณ„์˜ ์ƒํƒœ ์ฒดํฌ๋ฅผ ํ•˜์˜€๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ docker-compose.yml ํŒŒ์ผ์—์„œ healthcheck ์„ค์ •์„ ํ†ตํ•ด ์˜์กด ๊ด€๊ณ„์˜ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋”์šฑ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ํ•ด๋‹น ์ž‘์—…์„ ํ•  ๋•Œ๋Š” Dockerfile๊ณผ docker-compose.yml ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ดˆ๊ธฐ ๋ชฉ์ ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์˜คํžˆ๋ ค ๋ฌด๊ฒ๊ณ , ๋ฒˆ๊ฑฐ๋กœ์šด ์ž‘์—…์œผ๋กœ๋งŒ ๋‹ค๊ฐ€์™”๋Š”๋ฐ, ํŒŒ์ผ ์ž‘์„ฑ์— ์ต์ˆ™ํ•ด์ง„ ์š”์ฆ˜์—๋Š” ๊ต‰์žฅํžˆ ํŽธ๋ฆฌํ•œ ๋„๊ตฌ๊ฐ€ ๋˜์—ˆ๋‹ค.
This post is licensed under CC BY 4.0 by the author.