๐ Springboot ํ๋ก์ ํธ ์ค์
๋์ปค ํ๊ฒฝ์์ DB๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ๋์ ๋ชฉํ๋ก ํ๋ฏ๋ก ์ต๋ํ ๊ฐ๋จํ๊ฒ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํด๋ณผ๊ป์.
springboot ํ๋ก์ ํธ๋ ์ฌ์ฉ์์๊ฒ ๊ธ์ ์ ๋ ฅ๋ฐ์ผ๋ฉด DB์ ์ ์ฅํ๊ณ ๋ชฉ๋ก์ ํ์ธํ ์ ์๋ ์์ฃผ ๊ฐ๋จํ ๊ตฌ์กฐ์ ๋๋ค.
๐ springboot ์ค์ ํ์ผ (application.yml)
datasource์ url ๋ถ๋ถ์์ ํธ์คํธ ๋ถ๋ถ ์ค์ ์ ์ ํด์ฃผ์ ์ผ ํฉ๋๋ค.
ํ์ฌ ํธ์คํธ๊ฐ db-mysql๋ก ๋์ด ์๋๋ฐ ์ด ํธ์คํธ๋ช ์ ์์ผ๋ก ๋์ปคํ๊ฒฝ์์ mysql์ด ๊ตฌ๋๋๋ ์ปจํ ์ด๋์ ์ด๋ฆ์ ๋๋ค.
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://db-mysql:3306/mydb?useSSL=false
username: user
password: user
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
format_sql: true
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
๐ ๋์ปค ์ด๋ฏธ์ง ๋น๋๋ฅผ ์ํ Dockerfile ์์ฑ
FROM openjdk:11
COPY ./build/libs/docker-compose-test-0.0.1-SNAPSHOT.jar app.jar
ENV TZ=Asia/Seoul
CMD ["java", "-jar", "/app.jar"]
- FROM: ๋ฒ ์ด์ค ์ด๋ฏธ์ง ๋น๋ํ๊ณ ์ ํ๋ ์ด๋ฏธ์ง์ ๊ธฐ๋ณธ ๊ณจ๊ฒฉ์ด ๋๋ ์ด๋ฏธ์ง์ ๋๋ค.
- ARG: ์ผ์ข ์ ๋ณ์์ ์ธ์ด๋ผ๊ณ ์ดํดํด๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํจํค์ง๋ jar ํ์ผ์ ์ ์ฅํฉ๋๋ค.
- COPY: ์คํ๊ฐ๋ฅํ ํจํค์ง๋ ํ์ผ(jar)์ ์ปจํ ์ด๋ ๋ด๋ถ๋ก ๋ณต์ฌํฉ๋๋ค.
- ENTRYPOINT: ์ด๋ฏธ์ง ๋น๋์ ์คํ๋๋ ๋ช ๋ น์ด์ ๋๋ค. ๋ก์ปฌ์์ jarํ์ผ์ ๊ตฌ๋ํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ช ๋ น์ด๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
๐ springboot ํ๋ก์ ํธ ํจํค์ง
ํ์ฌ ํ๋ก์ ํธ๋ gradle์ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ gradle๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
gradlew clean build --exclude-task test์ด๊ฑฐ ๊ผญ ๋ฃ์ด์ฃผ์ธ์..
yml์์ ๋์ปค์์ ๊ตฌ๋๋ mysql์ ์ปจํ
์ด๋๋ช
์ ๋ฃ์ด์ฃผ๋๋ฐ ์ด ๋ถ๋ถ ๋๋ฌธ์ ํจํค์ง ์ ํ
์คํธ์ ์คํจํ๋ ๊ฒ ๊ฐ์ต๋๋ค..
์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์ target์ด ์์ฑ๋๊ณ ๊ทธ ์์ jar ํ์ผ์ด ์์ฑ๋ ๊ฒ ์ ๋๋ค.
์ด ๋ ์์ฑ๋๋ jar ํ์ผ์ ๋์ปค ์ปจํ ์ด๋ ์์ผ๋ก ๋ณต์ฌํด์ค์ ์ปจํ ์ด๋๊ฐ ์คํ์ํฌ ์ ์๋๋ก ํ๋ ๊ฒ ์ ๋๋ค.
๐ ๋์ปค ๋คํธ์ํฌ ์์ฑ
๋์ปค ํ๊ฒฝ์์ ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ๋์ผํ ํ๊ฒฝ์์ ์ฐ๋์ํค๊ธฐ ์ํด์ ๋คํธ์ํฌ ์ค์ ์ด ํ์ํฉ๋๋ค.
์ฌ๊ธฐ์๋ MySQL ๊ณผ springboot app์ด ๋์ผํ ๋คํธ์ํฌ์์ ๊ตฌ๋๋๋๋ก ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ผ๋จ ๋คํธ์ํฌ๋ถํฐ ํ๋ ์์ฑํด์ค๋๋ค.
$ docker network create springboot-mysql-net
์์ฑ๋ ๋คํธ์ํฌ๋ ์๋ ๋ช
๋ น์ด๋ก ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
$ docker network ls
๐ ๋์ปค ํ๊ฒฝ์์ MySQL ๊ตฌ๋
๋์ปค ํ๋ธ์์ mysql ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ
$ docker pull mysql:5.7
mysql ๊ตฌ๋
--name: ์ปจํ
์ด๋๋ช
์ค์
-p: ํฌํธ๋งคํ
--network: ๋คํธ์ํฌ ์ค์
-e: ํ๊ฒฝ๋ณ์ ์ค์
-d: ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ปจํ
์ด๋ ์คํ
docker run --name db-mysql -p 3306:3306 --network springboot-mysql-net -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=mydb -e MYSQL_USER=user -e MYSQL_PASSWORD=user -d mysql:5.7
๐ ๋์ปค ํ๊ฒฝ์์ springboot app ๊ตฌ๋
Dockerfile์ ์ด์ฉํ ์ด๋ฏธ์ง ๋น๋
$ docker build -t springboot-mysql:1.0
๋น๋๋ ์ด๋ฏธ์ง๋ก ์ปจํ ์ด๋ ๊ตฌ๋
$ docker run -p 8080:8080 --name springboot-mysql --network springboot-mysql-net -d springboot-mysql:1.0
๐ก ํ ์คํธ
๋ ๊ฐ ์ปจํ ์ด๋ ๋ชจ๋ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ ์คํ๋๊ณ ์์ต๋๋ค.
์์ฒญ ๋ฐ DB ํ ์คํธ
์์ฒญ ํ๋๋ก ์ ๋จ๋ค์ !
๐ก 2๋ฒ์งธ Docker Compose ๋ฅผ ์ด์ฉํด์ ํ๋ฒ์ ๋์ฐ๊ธฐ ํ ์คํธ
Docker-compose.yml ์์ฑ
์ด์ ์ Docker-compose ์์ด ๋ฉํฐ์ปจํ ์ด๋๋ฅผ ๊ตฌ๋ํ๋ ์ค์ ์ ๊ทธ๋๋ก Docker-compose์ ์ ์ฉํ ๊ฒ ์ ๋๋ค.
version: "3.7"
services:
db-mysql:
image: mysql:5.7
environment:
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: user
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
ports:
- 3306:3306
networks:
- springboot-mysql-net
test-app:
image: kimminwoo1234/simple-spring-boot:11
ports:
- 8080:8080
depends_on:
- db-mysql
networks:
- springboot-mysql-net
networks:
springboot-mysql-net:
driver: bridge
Docker-compose๋ services ๋ฐ์ ์ฌ๋ฌ ์ปจํ
์ด๋๋ค์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์์ฑ๋๋ ์ปจํ
์ด๋๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ๋คํธ์ํฌ์์ ๊ตฌ๋๋๊ฒ ๋ฉ๋๋ค.(default network)
ํ์ง๋ง ์ด์ ์ ํ๋ ์์ ์ ์์ ๋์ผํ๊ฒ ํ๊ธฐ ์ํด ๋คํธ์ํฌ๋ ์ค์ ํด์ฃผ์์ต๋๋ค.
ํ๋์ฉ ์์ธํ ๋ณผ๊ป์.
db-mysql
mysql ์ ์ปจํ
์ด๋๋ก ๊ตฌ๋์ํค๊ธฐ ์ํ ์ค์ ์
๋๋ค.
- image: ๋์ปคํ๋ธ์์ ๊ฐ์ ธ์ฌ ์ด๋ฏธ์ง (docker pull mysql:5.7 ๋์ผ)
- environment: mysql ๊ตฌ๋์ ํ์ํ ํ๊ฒฝ๋ณ์ ์ค์
(์ฌ์ฉํ db์ด๋ฆ, ์ ์ํ user์ด๋ฆ, password) - ports: ํฌํธ๋งคํ (๋ก์ปฌ์ ํฌํธ์์ ์ ๊ทผํ ํฌํธ์ ์ปจํ ์ด๋ ๋ด๋ถ์ ํฌํธ์ ๋ง์ถค)
- networks: ์ปจํ ์ด๋๊ฐ ๊ตฌ๋๋ ๋คํธ์ํฌ ์ค์
test-app
springboot ๋ฅผ ์ปจํ
์ด๋๋ก ๊ตฌ๋์ํค๊ธฐ ์ํ ์ค์ ์
๋๋ค.
- port: ์ด์ ๊ณผ ๋์ผ
- depend_on: db-mysql ์ปจํ ์ด๋์ ์์กดํ๋ค๋ ์๋ฏธ์ธ๋ฐ ์ฌ๊ธฐ์ ์์กด์ ๋ฐ๋์ db-mysql์ปจํ ์ด๋๊ฐ ๊ตฌ๋๋ ํ์ test-app ์ปจํ ์ด๋๋ฅผ ๊ตฌ๋์ํค๊ฒ ๋ค๋ ์๋ฏธ์ ๋๋ค.
- networks: ์ด์ ๊ณผ ๋์ผ
networks
์ด์ ์์ ์ ๋์ผํ๊ฒ ๋คํธ์ํฌ๋ฅผ ๊ตฌ์ฑํ์์ต๋๋ค.
๐ ์ปจํ ์ด๋ ๊ตฌ๋
docker-compose up or docker-compose up -d
์๋ฒ๊ฐ ์ ์์ ์ผ๋ก ๊ตฌ๋๋์ด ๋ก์ปฌ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ํ ps ๋ช
๋ น์ด๋ก ๊ตฌ๋์ค์ธ ์ปจํ
์ด๋๋ฅผ ๋ณด๋ฉด mysql๊ณผ springboot ๋ ๊ฐ ์ปจํ
์ด๋๊ฐ ๊ตฌ๋๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ปจํ
์ด๋ ์ค์ง
docker-compose down
๐ ํ ์คํธ๊ฒฐ๊ณผ ์ ๋๋ค์!
๐ก 3๋ฒ์งธ Docker Compose ๋ฐ ๋ถ๋ฅจ ๋ง์ดํธ๋ฅผ ์ด์ฉํด์ ํ๋ฒ์ ๋์ฐ๊ธฐ ํ ์คํธ
springboot์ MySQL์ ๋์ปค ์ปจํ ์ด๋ ํ๊ฒฝ์์ ๊ตฌ๋๊น์ง๋ ์ฑ๊ณตํ์ต๋๋ค. ๊ทผ๋ฐ ์ปจํ ์ด๋๊ฐ ๋ด๋ ค๊ฐ๋ ์๊ฐ DB์ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์ด๊ธฐํ ๋์ด ๋ฒ๋ฆฝ๋๋ค.
์ปจํ ์ด๋ ๊ตฌ๋ ์ค์ DB์ ์์ด๋ ๋ฐ์ดํฐ๋ ์ปจํ ์ด๋ ๋ด๋ถ์ ์์ผ ๋ฟ ๋ก์ปฌ ํ์ผ์์คํ ์ ๋ชจ๋ฅด๋ ์ผ ์ ๋๋ค.
mysql์ด ๊ตฌ๋๋๋ ์ปจํ ์ด๋์ ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ ํ์ผ์์คํ ๊ณผ ์ฐ๊ฒฐํด์ฃผ์ด์ผ ํฉ๋๋ค.
docker๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ์ฐพ์๋ณธ ๊ฒฐ๊ณผ volume์ ๊ฐ์ฅ ๋ง์ด ์ฐ๊ณ ๊ถ์ฅํ๋ ๊ฒ ๊ฐ์ volume์ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
Docker-compose.yml ์์ฑ
version: "3.7"
services:
db-mysql:
image: mysql:5.7
environment:
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: user
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
ports:
- 3306:3306
volumes:
- ./db:/var/lib/mysql
command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
networks:
- springboot-mysql-net
test-app:
image: kimminwoo1234/simple-spring-boot:11
ports:
- 8080:8080
depends_on:
- db-mysql
networks:
- springboot-mysql-net
networks:
springboot-mysql-net:
driver: bridge
db-mysql ๋ถ๋ถ์ volumes๋ง ์ถ๊ฐ๋ก ์ค์ ํฉ๋๋ค.
:๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ชฝ์ด ๋ก์ปฌ ํ์ผ์์คํ ์ ๊ฒฝ๋ก์ด๊ณ ๋ค์ชฝ์ด ์ปจํ ์ด๋ ๋ด๋ถ์ ๊ฒฝ๋ก์ ๋๋ค.
์ค์ ํด์ค ์ปจํ ์ด๋์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ๋ก์ปฌ ๊ฒฝ๋ก๋ก ๋ง์ดํธ ์ํค๋ ๊ฒ ์ ๋๋ค.
docker-compose up ์ผ๋ก ์คํํ๋ฉด ํ๋ก์ ํธ์ ๋ฃจํธ๊ฒฝ๋ก์ db ํด๋๊ฐ ์๊ธธ ๊ฒ ์ ๋๋ค.
๐ง ....
์์ง ๋์ปค์ ๋ํ ์ดํด๊ฐ ๋ถ์กฑํด์ ๋ณผ๋ฅจ์ ์ถ๊ฐํ๊ณ ๋ ์์ํ๊ฐ ๋์ง ์๋ ํ์์ ๊ฒช์์ต๋๋ค.
ํน์ ๊ฐ์ ํ์์ ๊ฒช๋ ๋ถ์ด ์์๊น๋ด ์ ์ฉ๋ฐฉ๋ฒ๋ ํจ๊ป ์จ๋ณผ๊ป์.
์ผ๋จ ํ ์คํธ๋ฅผ ์ํด application.yml์ JPA ์ต์ ์ธ ddl-auto๋ create์์ update ํน์ none์ผ๋ก ํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ ๋ณ๊ฒฝ๋ ์ฌํญ์ ์ ์ฉํ๊ธฐ ์ํด ๋ค์ ํ๋ก์ ํธ๋ฅผ ํจํค์งํฉ๋๋ค.
gradlew clean build --exclude-task test
์ด์ ์ด๋ฏธ์ง ์ฌ๋น๋์ ํจ๊ป ์ปจํ
์ด๋๋ฅผ ๊ตฌ๋ํฉ๋๋ค.
docker-compose up --build
docker compose ๋ฅผ ์ด์ฉํด์ db ์ springboot jpa๋ฅผ ์ด์ฉํ๊ณ ๋ธ๋ฃธ ๋ง์ดํธ๋ฅผ ์ด์ฉํด์
์ปจํ ์ด๋๊ฐ ๋ด๋ ค๊ฐ๋ ์๊ฐ DB์ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์ด๊ธฐํ ๋์ด ๋ฒ๋ฆฌ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์์ต๋๋ค.
db๋ผ๋ ํด๋์ ์ปจํ ์ด๋์ db์ ๋ณด๋ฅผ ๋ด์์ฃผ์์ต๋๋ค.
'Docker,Jenkins' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[jenkins] docker build ํ amazon ECR๋ก ์ด๋ฏธ์ง ์ ๋ก๋ํ๊ธฐ (0) | 2023.07.25 |
---|---|
JenkinsFile๋ก pipeline ๊ตฌ์ถ (1) | 2023.07.11 |
Container Volume ์ด๋ ? (0) | 2023.03.31 |
Container Monitoring Tool (0) | 2023.03.31 |
Docker ๋ฆฌ์์ค ๊ด๋ฆฌ (0) | 2023.03.31 |