๊ฐ๋ฐ์ผ์ง
[๋์ปค] ๋์ปค๋ฅผ ์ฌ์ฉํด์ ์คํ๋ง ์๋ฒ AWS EC2 ๋ฐฐํฌํ๊ธฐ (1) ๋ณธ๋ฌธ
[๋์ปค] ๋์ปค๋ฅผ ์ฌ์ฉํด์ ์คํ๋ง ์๋ฒ AWS EC2 ๋ฐฐํฌํ๊ธฐ (1)
doublejune 2025. 4. 3. 23:43[๋์ปค๋ฅผ ๋์ ํ๊ฒ ๋ ์ด์ ]
https://doublejune.tistory.com/64
[๋์ปค] ๋์ปค๋ฅผ ์ฌ์ฉํด์ ์คํ๋ง ์๋ฒ AWS EC2 ๋ฐฐํฌํ๊ธฐ (0)
๊ณผ๊ฑฐ ์งํํ๋ ํ๋ก์ ํธ์ ๋์ปค๋ฅผ ๋์ ํด์ผ๊ฒ ๋ค๊ณ ๋๊ผ๋ค. Java, ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ๊ณ , AWS EC2์ ๋ฐฐํฌํ ํ๋ก์ ํธ์ด๋ค.๋์ปค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ EC2 ์ธ์คํด์ค์ ์ง์ java์ Mysq
doublejune.tistory.com
์ฐ์ ์ฒซ ๋ฒ์งธ ํ๋ก์ธ์ค
1. ๋ก์ปฌ์์ dockerfile์์ฑ ๋ฐ docker-compose์์ฑ. ๋ก์ปฌ์์ ๋์ปค ๋ฐฐํฌ ํ ํ ์คํธ.
2. AWS EC2 ์ธ์คํด์ค๋ฅผ ์๋ก ๋ง๋ค๊ณ , ๋์ปค๋ก ๋ฐฐํฌ ํ ํ ์คํธ.
3. CD ์๋ํ. ๊น์์ ๋ฉ์ธ๋ธ๋์น ๋จธ์ง ์ EC2์ ๋์ปค์ด๋ฏธ์ง ์ ๋ฌ ํ ๋ฐฐํฌ.
๋ฅผ ์งํํด๋ณด์.
์ธํ ๋ฆฌ์ ์ด๋ฅผ ์ฌ์ฉํ๊ณ , ์๋์ฐํ๊ฒฝ์์ ๋์ปค๋ฅผ ์ค์นํ๋ค. ํฐ๋ฏธ๋์ Git Bash๋ฅผ ์ฌ์ฉํ๋ค.
1. ๋์ปคํ์ผ ์์ฑ
๋ก์ปฌ์์ ๋์ปค๋ก ๋ฐฐํฌ๋ฅผ ํ๊ธฐ์ํด, ๋์ปคํ์ผ์ ์์ฑํด์ค๋ค.
๋์ปคํ์ผ์ด๋?
: ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ฒ ํด์ฃผ๋ ํ์ผ์ด๋ค.
๋์ปค ์ด๋ฏธ์ง๋ ๋ํ ๋์ ๊ฝ์ ์ ์๋ ๊ฒ์ ์นฉ๊ฐ์๊ฑฐ๋ค. ๊ฒ์์ ์คํํ ์ ์๋ ์ค์น ํ์ผ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ๋ํ ๋์ ๊ฝ์ผ๋ฉด ๋ฐ๋ก ์คํํ ์ ์๋ค. ๋์ปค๋ ์ด๋ฏธ์ง๋ฅผ ์ปจํ ์ด๋๋ก ์คํํ๋ค.
# ๋น๋ ๋จ๊ณ
FROM eclipse-temurin:21-jdk AS builder
WORKDIR /back
COPY . .
RUN ./gradlew clean build
# ์คํ ๋จ๊ณ
FROM eclipse-temurin:21-jre
WORKDIR /back
COPY --from=builder /back/build/libs/weddy-0.0.1-SNAPSHOT.jar /back/weddy.jar
# ๋์ปค ์ปจํ
์ด๋๊ฐ 8080ํฌํธ๋ฅผ ์ฌ์ฉํ ๊ฒ์์ ์ ์ธ
EXPOSE 8080
# ๋์ปค ์ปจํ
์ด๋๊ฐ ์์๋ ๋ ์คํ๋ ๊ธฐ๋ณธ ๋ช
๋ น์ด
CMD ["java", "-Dspring.profiles.active=local", "-jar", "weddy.jar"]
์์๊ฐ์ด Dockerfile-dev์ฉ์ ์์ฑํ๋ค.
๋์ปค ํ์ผ์ ๋ถ๋ฆฌํ ์ด์
Dockerfile-prod์ ํ์ผ์ ๋๋์๋๋ฐ, application.ymlํ์ผ์ด ๊ฐ๋ฐ์ฉ๊ณผ ์ด์์ฉ ๋ฐ๋ก์ด๊ธฐ ๋๋ฌธ์ ๋ถ๋ฆฌํ๋ค.
๊ฐ๋ฐ์ฉ๊ณผ ์ด์์ฉ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์, ๊ฐ๋ฐํ๊ฒฝ์์ ํ ์คํธ ์์๋ h2 db(์ผํ์ฑ)๋ฅผ ์ฌ์ฉํ๊ณ ์ด์ํ๊ฒฝ์์๋ mysql db๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
๋์ปคํ์ผ ๋ด์ฉ
- /back์ ํ๋ก์ ํธ root์ด๋ค. back์ ์๋ ์์ค๋ค์ ๊ฐ์ ธ์ ๋น๋ํ๋ค.
- EXPOSE 8080์ ๋์ปค ์ปจํ ์ด๋๊ฐ 8080 ํฌํธ๋ฅผ ์ฌ์ฉํ ๊ฒ์์ ์ ์ธํ๋ค. (์ค์ ์คํ๋๋ Spring Boot์๋ฒ์ ์ปจํ ์ด๋๊ฐ์ ๋งคํ์ ์ปจํ ์ด๋ ์คํ ์ ํ๋ค)
- CMD๋ ๋์ปค ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ์คํ๋ ๊ธฐ๋ณธ ๋ช ๋ น์ด๋ฅผ ์ง์ ํ๋ค.
- Dspring.profiles.active=local ์ต์ ์ appication.yml ํ์ผ์ด ๋ก์ปฌ์ฉ์ผ๋ก ์คํ๋๋๋ก ํ๋ค. Dockerfile-prod ์ฉ์๋
2. ๋ก์ปฌ์์ ๋์ปคํ์ผ ์คํ ํ ์คํธ
์์์ ์์ฑํ ๋์ปคํ์ผ์ ์คํํด๋ณธ๋ค.
๋์ปค ์ด๋ฏธ์ง ์์ฑ ๋ช ๋ น์ด
docker build -f Dockerfile-dev -t weddy:dev .
-f Dockerfile-dev: Dockerfile๋ช ์ dev๋ฅผ ๋ถ์๊ธฐ ๋๋ฌธ์ ๋ช ์์ ์ผ๋ก ์ด๋ฆ์ ์ผ๋ค. ๊ทธ๋ฅ ํ์ผ ์ด๋ฆ์ด Dockerfile์ด๋ฉด ์๋ต ๊ฐ๋ฅ.
-t : ํ๊ทธ. ์ด๋ฆ๊ณผ ํ๊ทธ๋ช ์ ์๋ฏธํ๋ค.
weddy:dev: ์ด๋ฏธ์ง ์ด๋ฆ
. : ๋์ปคํ์ผ์ด ์์นํ ๊ฒฝ๋ก. ์๋๊ฒฝ๋ก์ด๋ . ์ ์ด๋ค.
๋น๋๊ฐ ์๋ฃ๋์๋ค.
์ด๋ฏธ์ง๊ฐ ์์ฑ๋๊ฑธ ํ์ธํ์.
docker image ls
๋ค์์ ์ด๋ฏธ์ง๋ฅผ ์คํ์์ผ๋ณด์.
docker run -d weddy:dev
๊ทธ๋ฆฌ๊ณ ์ ์คํ๋์๋์ง ํ์ธํด๋ณธ๋ค.
$ docker ps
์ปจํ ์ด๋๊ฐ ์ ์คํ๋๋์ง ๋ก๊ทธ๋ฅผ ํ์ธํ ์๋ ์๋ค.
docker logs a3f #์ปจํ
์ด๋ ID ์์๋ฆฌ
๋๋ ์คํ ํ ์ค๋ฅ๊ฐ ๋ฌ๋๋ฐ, ์๋น์ค์์ ์ฌ์ฉ๋ ํ๊ฒฝ๋ณ์๋ฅผ ์ ๋ ฅํ์ง ์์์ ๊ทธ๋ฌ๋ค.
์ฐ์ ๊ฐ๋ฐ ํ๊ฒฝ์ด๋ .envํ์ผ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ค์ ํด์คฌ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์คํํ๋ค.
docker run --env-file .env -d weddy:dev
์ ์ ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
3. ๋์ปค ์ปดํฌ์ฆ(Docker compose) ์์ฑ
๋์ปค ์ปดํฌ์ฆ๋?
: ์ฌ๋ฌ๊ฐ์ ๋์ปค ์ปจํ ์ด๋๋ค์ ํ๋์ ์๋น์ค๋ก ์ ์ํ๊ณ ๊ตฌ์ฑํด ํ๋์ ๋ฌถ์์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ๋์์ฃผ๋ ๋๊ตฌ๋ค.
ํ์ฌ ์๋น์ค์์๋ ์คํ๋ง ๋ถํธ ์๋ฒ์ MySQL์๋ฒ ๋ ๋ค ์คํํด์ผ ํ๋ค. ์ด๋ ๊ฒ ์ฌ๋ฌ ์ปจํ ์ด๋(์๋ฒ) ๋ค์ ์คํํด์ผ ํ ๋ compose๋ฅผ ์ฌ์ฉํ๋ค.
์ฐ์ , ์ปดํฌ์ฆ ํ์ผ์ ์์ฑํด๋ณด์
version: '3.8'
services:
app:
# ์ด๋ฏธ์ง ์ด๋ฆ ์ค์
image: weddy:latest
# ๋น๋ ์ค์ ์ด ์์ผ๋ฉด ํด๋น์ค์ ์ผ๋ก ์ด๋ฏธ์ง ๋น๋. ์์ ๊ฒฝ์ฐ Doker Hub์์ ์ด๋ฏธ์ง ๊ฐ์ ธ์ด.
build:
context: .
dockerfile: Dockerfile-prod # ๊ฐ๋ฐํ๊ฒฝ์ Dockerfile-dev๋ก ์ค์
ports:
- "8080:8080"
# ์๋น์ค ๊ฐ ์์กด์ฑ ์ค์ (mysql ์๋น์ค ์คํ ํ ์คํ)
depends_on:
mysql:
condition: service_healthy
# ํ๊ฒฝ๋ณ์ ์ค์
env_file:
- .env
mysql:
image: mysql:latest
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DBNAME}
- MYSQL_USER=${MYSQL_USERNAME}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
ports:
- "3306:3306"
# DB๋ฐ์ดํฐ ์ ์ฅ ์ค์ - ๋ณผ๋ฅจ
volumes:
- ./mysql-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping"]
interval: 5s
timeout: 5s
retries: 5
ํฌ๊ฒ ์คํ๋ง๋ถํธ ์๋ฒ, Mysql์๋ฒ 2๊ฐ์ ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ๋ด์ฉ์ด๋ค.
์์์ ์ค์ํ ์ค์ ๋ค.
volume
: ๋์ปค ์ปจํ ์ด๋์ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ๊ธฐ ์ํ ๋งค์ปค๋์ฆ์ด๋ค.
MySQL DB๋ฐ์ดํฐ๋ฅผ ์ญ์ ๋์ง ์๊ณ ๋ณด์กดํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค. MySQL ์๋ฒ๋ฅผ ์ปจํ ์ด๋๋ก ์คํํ๊ณ ๋์ค์ ์ข ๋ฃํ๋ฉด ์ปจํ ์ด๋ ๋ด์ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋๋ DB๋ฐ์ดํฐ๋ ์ญ์ ๋๊ฒ ๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ์ํด volumes:์ ๊ฒฝ๋ก์ ํธ์คํธ์ ๋๋ ํ ๋ฆฌ๋ฅผ ์ง์ ํ๊ณ , ํด๋น ๋๋ ํ ๋ฆฌ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
build
๋น๋ ์ค์ ์ด ์์ผ๋ฉด ํด๋น์ค์ ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ง๋ ๋ค. ์์ ๊ฒฝ์ฐ Doker Hub์์ ์ด๋ฏธ์ง ๊ฐ์ ธ์ด.
๋์ปค ์ปดํฌ์ฆ๋ฅผ ๋น๋ํด๋ณด์.
$ docker-compose build
์ ์ ์๋ฃ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
4. ๋ก์ปฌ์์ ๋์ปค ์ปดํฌ์ฆ ์คํ
์ด์ ๋์ปค ์ปดํฌ์ฆ๋ฅผ ์คํํด๋ณด์.
docker-compose up -d
์ ์์คํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
docker ps๋ก ํ์ธ.
5. ์คํ๋ง ์๋ฒ์ MySQL DB ์ ์ ์คํ ํ์ธ
์คํ๋ง ์๋ฒ ํ์ธ:
๋ธ๋ผ์ฐ์ ์์ localhost:8080 ์ ์ํ๋ฉด ์ ๋จ๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
MySQL DB๋ ์ ๋ด์๊น?
๋๋ DBeaver๋ฅผ ์ฌ์ฉํ๋ค. Composeํ์ผ์์ ์ค์ ํ MySQL ์๋ฒํธ์คํธ, DB๋ช , ์ ์ ๋ค์๊ณผ ํจ์ค์๋๋ฅผ ์ ๋ ฅํ๊ณ ์ฐ๊ฒฐํ๋ค.
์ ์์ด ์ ๋๋ค.
์ฟผ๋ฆฌ ์คํ ํ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒ์ ํ์ธํ๋ค.