[Spring boot] ์ ํ๋ฆฌ์ผ์ด์ ์ Docker ์ด๋ฏธ์ง๋ก ๋ง๋ค๊ธฐ Old & New
Spring boot๋ก ๊ฐ๋ฐํ ์๋ฒ๋ฅผ ์ด์ํ๊ธฐ ์ํด์๋ ์ธ์คํด์ค์ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํด์ผ ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์๋ WAS๋ก ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง Docker ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด์ Docker ์ด๋ฏธ์ง๋ก ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ๋ ์กด์ฌํฉ๋๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ Spring boot์์ ๊ฐ๋ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ Docker๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Install Docker
๋จผ์ Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ๋ด ์ปดํจํฐ์ Docker๊ฐ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค. ์๋์ ํฌ์คํธ๋ฅผ ์ฐธ๊ณ ํ์ฌ Docker๋ฅผ ์ค์นํด์ฃผ์ธ์.
2016/07/06 - [Infrastructure/Docker] - Docker, ๊ทธ๊ฒ์ ๋ฌด์์ด๊ณ , ์ค์น๋ ์ด๋ป๊ฒํ ๊น?
Create Dockerfile
Docker ์ค์น๊ฐ ๋๋ฌ๋ค๋ฉด, ์ด์ ๋ด๊ฐ ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค์ด ์๋ Docker Image๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. Docker Image๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ง ์์ ์ ์งํํด์ผ ํฉ๋๋ค.
- gradlew ๋ช ๋ น์ด ๋ฑ์ ์ด์ฉํ์ฌ jar ํ์ผ๋ก ๋น๋
- Dockerfile ์์ฑ
Jar ํ์ผ์ Docker ์ด๋ฏธ์ง์์ ๋ด๊ฐ ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Dockerfile์์ ์ปจํ ์ด๋ ํ๊ฒฝ์ ๊ตฌ์ฑํ๊ฒ ๋จ์ผ๋ก์จ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณ๋์ ํ๊ฒฝ ์ค์ ์ ์๋์ผ๋ก ์งํํ ํ์์์ด ์๋์ผ๋ก ์ด๋ฏธ์ง๊ฐ ์์ฑ๋๋ ๋ฐฉ์์ ๋๋ค.
FROM openjdk:8-jdk-alpine
RUN addgroup -S neonkid && adduser -S neonkid -G neonkid
USER neonkid:neonkid
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
์๋น์คํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฐ์ด ๋ ์ด๋ฏธ์ง๋ฅผ FROM ์์ ์ ์ผ์๋ฉด ๋๋๋ฐ, ๋ง์ฝ ์๋์ผ๋ก Java ์ค์ ์ ์งํํ๊ณ ์ ํ๋ค๋ฉด, ubuntu, centos ๋ฑ์ ๋ฏธ๋๋ฉ ์ด์์ฒด์ ์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ ์ผ ํ์ง๋ง, ์ฌ๊ธฐ์๋ ๊ธฐ๋ณธ ์ค์ ๊ฐ์ผ๋ก ์งํํ์ฌ ๋ง๋ค์ด์ง openjdk8 ๋ฒ์ ์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Docker๋ root ๊ณ์ ์์ ์คํ์ด๋ฉ๋๋ค. ๋ค๋ฅธ ์ฌ์ฉ์๋ฅผ ์ด์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ณ ์ ์ํ๋ ๊ฒฝ์ฐ, adduser ๋ช ๋ น์ด ๋ฑ์ ์ด์ฉํ์ฌ ์ฌ์ฉ์๋ฅผ ์์ฑํ๊ณ , USER๋ฅผ ์ด์ฉํด ์ํ๋ ์ฌ์ฉ์ ์ด๋ฆ์ ์ ๋ ฅํ๋ฉด ํด๋น ์ฌ์ฉ์ ์ด๋ฆ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ฉ๋๋ค.
์ ๋ฐฉ๋ฒ์ Docker ์ด๋ฏธ์ง ๋ด์์ ๋จ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฆด ๋ ์ฌ์ฉํ์ง ์๊ณ , ๋ ๊ฐ ์ด์์ ๋ฏธ๋ค์จ์ด ๋ฑ์ ๋์์ ์ด์ํ ๋ ์คํ ์์ญ ๊ณต๊ฐ์ ๋๋๊ธฐ ์ํด์ ๋ณดํต ๋๋๋ ํธ์ด์ง๋ง, Docker ์ด๋ฏธ์ง์์๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋ ์ง๋ง ์ฐ๋ฆฌ๋ ์ฐ์ต์ ์ํด ์งํํ๋ ๊ฒ์ด๋ฏ๋ก ์ด๋ฐ ๊ฒ๋ ์๋ค. ๋ผ๋ ์๊ฐ์ผ๋ก ์งํํ์๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค์.
๋ง์ง๋ง์ผ๋ก ํ๋ก์ ํธ์์ jar ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ARG์ ๋ฃ๊ณ , Docker ์ด๋ฏธ์ง์ ๋ณต์ฌํ ์ด๋ฆ์ ์ ํด์ค ๋ค์ ENTRYPOINT์ java ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด ์คํ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด Docker ์ด๋ฏธ์ง๊ฐ ์์ฑ๋์์ ๋ ์๋์ผ๋ก ์๋ฒ๊ฐ ์คํ๋ฉ๋๋ค.
Build Application
IDEA๋ฅผ ์ด์ฉํ์ฌ Spring boot ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋๋ Run ๊ธฐ๋ฅ์ ์ด์ฉํด์ Embedded Tomcat์ ์ด์ฉํด ๊ฐ๋ฐ ์๋ฒ๋ก ํ ์คํธ ์ ๋๋ง ์ฌ์ฉํ ์ ์์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ, IDEA๊ฐ ์๋ ์ผ๋ฐ Gradle ํ๊ฒฝ์ ์๋์ผ๋ก ๋ง๋ค๊ณ ํ๋ค๋ฉด ์ด๋ป๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ ํ ์ ์์๊น์?
๋ง์ฝ, Spring Initializr๋ฅผ ์ด์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์ด๊ธฐํ ํ๋ค๋ฉด, gradlew ๋ช ๋ น์ด๋ mvnw ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ gradlew๋ฅผ ์ด์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํด๋ณด๋ก ํ๊ฒ ์ต๋๋ค.
$ ./gradlew build
์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ๋น๋ ์์ ์ ์งํํ๊ฒ ๋๋ฉด ${PROJECT_NAME}/build/libs/*.jar ํํ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋น๋๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ด์ฉํด์ Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
Build Docker Image
์ด์ ๋ ๊ฐ์ง ์์ ์ ๋ชจ๋ ๋๋ง์ณค์ผ๋, ๋ณธ๊ฒฉ์ ์ผ๋ก Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ Spring boot ํ๋ก์ ํธ ๋ฃจํธ์ Dockerfile์ ๋ง๋ค์๊ณ , ์ฌ๊ธฐ์์ ์์ ์ ์งํํ๋ฉด ๋ฉ๋๋ค.
# docker build -t neonkid/dockerexample .
๋ก์ปฌ์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ๋๋ root ๊ถํ์ ์ด์ฉํด์ผ ํฉ๋๋ค. ์ฒ์ ๋น๋ํ๋ค๋ฉด, ์๊ฐ์ด ์กฐ๊ธ ์ค๋ ๊ฑธ๋ฆด ์๋ ์์ต๋๋ค.
๋ชจ๋ ์์ ์ด ๋๋ฌ๋ค๋ฉด ์์ ๊ฐ์ด neonkid/dockerexample ์ด๋ฏธ์ง๊ฐ ์์ฑ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
Run Server
์ด์ ๊ทธ๋ผ ์๋ฒ๋ฅผ ์คํํด๋ณผ๊น์? ๋ง๋ค์ด์ง Docker ์ด๋ฏธ์ง๋ฅผ ์คํํ๊ธฐ ์ํด์๋ ์๋์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ๋ฉด ๋ฉ๋๋ค.
# docker run -d -p 1412:1412 --name dockerexample neonkid/dockerexample:latest
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ -p ์ธ์ ๋ค์์ ๋์ค๋ ํฌํธ ๋ฒํธ์ ๋๋ค. ์ฌ๊ธฐ์ ํฌํธ ๋ฒํธ๋ ์ปจํ ์ด๋์์ ์คํ๋๋ ํฌํธ ๋ฒํธ์ ํ์ฌ ์ด์์ฒด์ ์ ํฌํธ ๋ฒํธ๋ฅผ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ๋งํน ์์ ์ ๋๋ค. ๋ฐ๋ผ์ Spring boot์์ ๋ด๊ฐ ์ค์ ํ ํฌํธ ์ฃผ์๊ฐ ๋ค์ ๋์์ผ ํ๋ฉฐ, ํ์ฌ ์ธ์คํด์ค์ ๋งํนํ๊ณ ์ ํ๋ ํฌํธ ์ฃผ์๋ฅผ ์ ๋ ฅํด์ค์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- Spring boot์์ 8080์ผ๋ก ์ค์ ํ ์๋น์ค๋ฅผ 80 ํฌํธ์ ์๋น์คํ๊ณ ์ ํ๋ค๋ฉด, => -p 80:1412
- nginx ์น ์๋ฒ์ ์ฌ๋ผ๊ฐ ์๋น์ค๋ฅผ ๋ค๋ฅธ ์๋น์ค ํฌํธ๋ก ์๋น์คํ๊ณ ์ ํ๋ค๋ฉด, => -p 1412:80
Spring Boot 2.3 ๋ฒ์ ์์ Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
์ต๊ทผ ์ถ์๋ Spring boot 2.3 ๋ฒ์ ์์๋ ์ ๋ฐฉ๋ฒ๋ณด๋ค ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด ๋ณผ ์ ์์ต๋๋ค. ๊ฐ๋จํ ๋ช ๋ น์ด ํ ์ค ๋ง์ผ๋ก๋ Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด ๋ณด๋๋ก ํ์ฃ .
# ./gradlew bootBuildImage
๋ก์ปฌ ํ๊ฒฝ์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ์์ ์ด๋ฏ๋ก ๋ฐ๋์ root ๊ถํ์ ์ด์ฉํ์ฌ ์งํํ๋๋ก ํฉ์๋ค.
์ฒ์ ์ด๋ฏธ์ง ๋น๋ ์์ ์ ์๋์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋นํด ์์ฒญ ์ค๋ ๊ฑธ๋ฆฐ๋ค๋ ๋จ์ ์ด ์์ง๋ง, Docker๋ฅผ ๋ฐฐ์ธ ์๊ฐ์ด ๋ชจ์๋ผ๋ค๊ฑฐ๋ ๋ฌ๋ ์ปค๋ธ๊ฐ ์ข ๋ฎ์ ๋ ๋ฒจ์ ์์ ์ ์ํ์ ๋ค๋ฉด, ์ ์ด ๋ฐฉ๋ฒ๋ ๋์์ง ์์ ๋ณด์ด๋ค์..
์์ ์ด ๋๋๋ฉด ์์ ๊ฐ์ด ๋น๋๋ Docker ์ด๋ฏธ์ง์ ์ด๋ฆ์ด ๋์ค๊ฒ ๋ฉ๋๋ค. dockerexample:0.0.1-SNAPSHOT์ด๊ตฐ์.
# docker run --tty -p 1412:1412 dockerexample:0.0.1-SNAPSHOT
์ด๋ฒ์ ๋ฐ๋ชฌ ๋ชจ๋๊ฐ ์๋ tty ๋ชจ๋๋ก ์คํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ ์ฐจ์ด๊ฐ ๋ฌด์จ ์ฐจ์ด๋๊ตฌ์? ๋ฐ๋ชฌ ๋ชจ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ์๋น์ค ๋ชจ๋๋ก ๋์ํ์ฌ ํฐ๋ฏธ๋์ด๋ ์์์ ๋น ์ ธ๋๊ฐ๋ ๋์ํ์ง๋ง tty ๋ชจ๋๋ ํ์ฌ ๋ด๊ฐ ์คํ๋๊ณ ์๋ ํฐ๋ฏธ๋ ํน์ ์์์ ๋์ํ๊ธฐ ๋๋ฌธ์ ํฐ๋ฏธ๋์ด๋ ์์ ์ข ๋ฃํ๋ฉด ์ปจํ ์ด๋๋ ๊ฐ์ด ์ข ๋ฃ๋๋ ๋ฐฉ์์ ๋๋ค.
๋ง์น๋ฉฐ...
์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ๋ WAS๋ก ๋น๋ํ๊ณ , Tomcat์ ์ฌ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด์์ต๋๋ค. ๊ทธ๋ฌ๋ Spring boot๊ฐ ๋ฑ์ฅํ๋ฉด์ Jar ํ์ผ์ ๋น๋๊ฐ ๊ฐ๋ฅํด์ก๊ณ , ๊ทธ๋ผ์ ๋ฐ๋ผ ์ผ๋ฐ Java ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด์๋ ๋ฐฐํฌํ ์๊ฐ ์๋ค๋ ๊ฒ์ ํฐ ๋ฉ๋ฆฌํธ์ ๋๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก Docker ์ด๋ฏธ์ง๋ฅผ ์ฝ๊ฒ ๋ง๋ค์ด์ ๊ฐ๋ฐํ์์ ๋ ํ ์คํธ๋ฅผ ์ฉ์ดํ๊ฒ ํ๋ค๋ ๊ฒ์ ๋งค์ฐ ํฐ ์ฅ์ ์ ๋๋ค. ๋ฌผ๋ก ์ง๊ธ์ Docker ํ๋๋ง์ ๊ฐ์ง๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฏธ์ง ํ๋ ์ ๋๋ฅผ ๋ง๋๋ ๊ฒ์ ๊ทธ์ณค์ง๋ง Docker Compose, Docker Swarm์ ์ด์ฉํ๋ฉด ๋ด๊ฐ ๋ง๋ ์๋ฒ์์ ์ฌ์ฉํ๋ ๋ฏธ๋ค์จ์ด(DB, MQ) ๋ฑ๋ ์ข ํฉ์ ์ผ๋ก ํ ์คํธ ํ๊ฒฝ์ ๋ง๋ค ์ ์๋ค๋ ์ฅ์ ๋ ์์ต๋๋ค. ์ด ๋ถ๋ถ์ ๋ํ ํฌ์คํธ๋ ๋ค์์ ๋ค๋ค๋ณผ ์์ ์ ๋๋ค.
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] JPA ์์์ฑ ์ปจํ ์คํธ ๊ตฌ์กฐ๋ก ๋ณด๋ ์ด์ (2) | 2020.06.24 |
---|---|
[Spring] JPA์ ์์์ฑ ์ปจํ ์คํธ์ ์๋ช ์ฃผ๊ธฐ (0) | 2020.06.23 |
[Spring boot] DAO์ DTO (6) | 2020.05.27 |
[Spring Data] Hibernate, JPA ๊ทธ๋ฆฌ๊ณ Spring Data JPA (0) | 2020.05.23 |
[Spring boot] JDBC์ Spring JDBC ๊ทธ๋ฆฌ๊ณ MyBatis (0) | 2020.05.22 |