๊ฐœ๋ฐœ์ผ์ง€

[๋„์ปค] ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์Šคํ”„๋ง ์„œ๋ฒ„ AWS EC2 ๋ฐฐํฌํ•˜๊ธฐ (1) ๋ณธ๋ฌธ

Backend๐Ÿงฑ/์ธํ”„๋ผ

[๋„์ปค] ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์Šคํ”„๋ง ์„œ๋ฒ„ 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๋ช…, ์œ ์ €๋„ค์ž„๊ณผ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์—ฐ๊ฒฐํ•œ๋‹ค.

 

์ ‘์†์ด ์ž˜ ๋œ๋‹ค.

์ฟผ๋ฆฌ ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.