๐Ÿš€DevOps

[Deploy] Spring & MySql & docker-compose ํ™œ์šฉ EC2์— ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐฐํฌํ•˜๊ธฐ

junbin2 2025. 1. 27. 19:10

๋ฐฐํฌ ์ „ ์•Œ์•„์•ผ ํ•  ์‚ฌํ•ญ

- ์ด ๊ณผ์ •์€ EC2์— Docker ๋ฐ Docker Compose๋ฅผ ์„ค์น˜ํ•˜๋Š” ์ž‘์—…๊ณผ EC2 ๋‚ด๋ถ€์— Docker๋ฅผ ๋„์›Œ์„œ Docker Compose๋ฅผ ํ™œ์šฉํ•ด Docker-Hub๋กœ ๋ถ€ํ„ฐ image๋ฅผ ๋ฐ›์•„์™€ ์„œ๋ฒ„๋ฅผ ๋ฐฐํฌํ•˜๋Š” ์ž‘์—…์„ ๋‹ด๊ณ  ์žˆ์Œ.
- ์ƒˆ๋กœ์šด AWS EC2 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ (์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๋นˆ ํด๋ผ์šฐ๋“œ ์ปดํ“จํ„ฐ์—ฌ์•ผํ•จ )
- Docker-Hub์— ๊ณ„์ •์„ ๋งŒ๋“ค์–ด์„œ Spring ํ”„๋กœ์ ํŠธ๋ฅผ Hub๋กœ ์˜ฌ๋ฆด Repository๋ฅผ ๋งŒ๋“ค์–ด ๋‘ฌ์•ผํ•จ.
- Docker์™€ Docker Desktop์ด ๋กœ์ปฌ์— ๊น”๋ ค ์žˆ์–ด์•ผ ํ•จ.
- spring ํ”„๋กœ์ ํŠธ์— env์„ค์ •์ด ๋˜์–ด์žˆ์–ด์•ผํ•จ. env์„ค์ •์€ ํ•„์ˆ˜ !
 

1. EC2) Docker ์„ค์น˜

# 1. ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜ ์ „ ์šฐ๋ถ„ํˆฌ ์‹œ์Šคํ…œ ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ
$ sudo apt-get update
 
# 2. ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
 
# 3. Docker์˜ ๊ณต์‹ GPG ํ‚ค ์ถ”๊ฐ€
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
 
# 4. Docker์˜ ๊ณต์‹ apt ์ €์žฅ์†Œ ์ถ”๊ฐ€
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# 5. ์‹œ์Šคํ…œ ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ
$ sudo apt-get update
 
# 6. Docker ์„ค์น˜
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

 
 

2. EC2) Docker Compose ์„ค์น˜

# 1. Docker Compose ์„ค์น˜
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 2. ๋‹ค์šด๋กœ๋“œ ํ•œ ํŒŒ์ผ์— ๊ถŒํ•œ ์„ค์ •
$ sudo chmod +x /usr/local/bin/docker-compose

Docker Compose๋Š”

3. Spring) Dockerfile ์ž‘์„ฑ

๋‚ด๊ฐ€ ๋ฐฐํฌํ•  Spring ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— Dockerfile์„ ๋งŒ๋“ค์–ด์„œ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

# ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€: OpenJDK 17์˜ Slim ๋ฒ„์ „ ์‚ฌ์šฉ (๊ฒฝ๋Ÿ‰ํ™”๋œ Java ํ™˜๊ฒฝ ์ œ๊ณต)
FROM openjdk:17-jdk-slim

# ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •: ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ /app์„ ๊ธฐ๋ณธ ์ž‘์—… ๊ฒฝ๋กœ๋กœ ์ง€์ •
WORKDIR /app

# JAR ํŒŒ์ผ ๋ณต์‚ฌ: ํ˜ธ์ŠคํŠธ์˜ ๋นŒ๋“œ๋œ JAR ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ์˜ /app ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌ
COPY build/libs/*.jar app.jar

# ํฌํŠธ ์„ค์ •: ์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก 8888 ํฌํŠธ๋ฅผ ๊ฐœ๋ฐฉ
EXPOSE 8888

# JAR ํŒŒ์ผ ์‹คํ–‰: ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์‹œ Java๋กœ app.jar ์‹คํ–‰
ENTRYPOINT ["java", "-jar", "app.jar"]

 

4. Spring) ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ

build๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ž๋™์œผ๋กœ build test๋ฅผ ํ•ด์ฃผ๋ฉฐ, build๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋˜์—ˆ๋‹ค๋ฉด ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉด ๋œ๋‹ค.

 

5. Spring) Docker-Hub์— Spring ํ”„๋กœ์ ํŠธ Push

์ธํ…”๋ฆฌ์ œ์ด ํ„ฐ๋ฏธ๋„ ๋˜๋Š” cmd๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ root๋กœ ์ ‘๊ทผ ํ›„ ๋ช…๋ น์–ด ์ž…๋ ฅ

# ์ด๋ฏธ์ง€ ๋นŒ๋“œ : ๋กœ์ปฌ์—์„œ Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ช…๋ น์–ด
# ์ด๋ฏธ์ง€์ด๋ฆ„๊ณผ ํƒœ๊ทธ๋Š” ์›ํ•˜๋Š”๊ฑธ๋กœ ํƒœ๊ทธ๋Š” ๋ณดํ†ต ( latest, v1.0 ) ์ด๋Ÿฐ์‹์œผ๋กœ ์ด์šฉ ๋์— ์  ๊ผญ ๋„ฃ๊ธฐ
docker build -t ์ด๋ฏธ์ง€์ด๋ฆ„:ํƒœ๊ทธ .

# docker hub์— pushํ•˜๊ธฐ
# ๋„์ปคํ—ˆ๋ธŒ์‚ฌ์šฉ์ž๋ช…์€ ํ—ˆ๋ธŒ์— ๋“ค์–ด๊ฐ€๋ฉด ๋‚ด ์ด๋ฆ„์ด๋‹ค.
docker push ๋„์ปคํ—ˆ๋ธŒ์‚ฌ์šฉ์ž๋ช…/์ด๋ฏธ์ง€์ด๋ฆ„:ํƒœ๊ทธ

# docker hub์—์„œ pull๋ฐ›๊ธฐ
# ๋„์ปคํ—ˆ๋ธŒ์‚ฌ์šฉ์ž๋ช…์€ ํ—ˆ๋ธŒ์— ๋“ค์–ด๊ฐ€๋ฉด ๋‚ด ์ด๋ฆ„์ด๋‹ค. ํƒœ๊ทธ๋Š” ๋ณดํ†ต latest์ž„.
docker pull ๋„์ปคํ—ˆ๋ธŒ์‚ฌ์šฉ์ž๋ช…/์ด๋ฏธ์ง€์ด๋ฆ„:ํƒœ๊ทธ

docker build๋Š” ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๋ฅผ buildํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ dockerfile์„ ํ†ตํ•ด docker image๋กœ ๋นŒ๋“œ๋ฅผ ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
docker push๋Š” docker-hub์— ๋นŒ๋“œ ๋œ image๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๊ณผ์ •์ด๋‹ค.
 

6. EC2) docker compose ์ž‘์„ฑ

docker-compose.yml ํŒŒ์ผ์„ ec2 root ๋””๋ ‰ํ† ๋ฆฌ์— ๋งŒ๋“ค์–ด ์ค˜์•ผํ•จ.

# 1. ec2์— ์ ‘์†์„ ํ•œ ๋’ค ๋ฐ”๋กœ ๊ทธ ์ž๋ฆฌ(root)์— docker-compose.yml ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ
touch docker-compose.yml
# 2. docker-compose.yml ์ˆ˜์ •ํ•˜๊ธฐ vi๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ˆ˜์ • ํ™”๋ฉด์œผ๋กœ ์ „ํ™˜
vi docker-compose.yml

docker-compose.yml ์ˆ˜์ •ํŒŒ์ผ์— ๋“ค์–ด๊ฐ„ ๋’ค ํŒŒ์ผ์— ์„ค์ • ์ž‘์„ฑ

# docker-compose.yml
version: '3.8'

services:
  app:
    image: 
    container_name: spring-app
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    environment:
      MYSQL_URL: ${MYSQL_URL}
      MYSQL_USERNAME: ${MYSQL_USERNAME}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    depends_on:
      - db
    restart: always

  db:
    image: mysql:8.0
    container_name: mysql-db
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

๊ธฐ์กด Spring์—์„œ ๋ณด์•ˆ์„ ์œ„ํ•ด env๋ฅผ ํ™œ์šฉํ•ด์„œ properties๋ฅผ ์ •์˜ํ•ด๋‘์—ˆ๋Š”๋ฐ, docker-compose.yml์—์„œ๋Š” ์ด๋Ÿฌํ•œ env์— ๋Œ€ํ•œ ์„ค์ •์„ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด root์— .env ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’๋“ค์„ ๊ธฐ์žฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
 

7. EC2) docker-compose์— ๋Œ€ํ•œ .env ์ž‘์„ฑ

ec2 root์—์„œ .env๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊ธฐ์— ์ž‘์„ฑ์„ ํ•˜๋ฉด ๋œ๋‹ค.

# 1. ec2์— ์ ‘์†์„ ํ•œ ๋’ค ๋ฐ”๋กœ ๊ทธ ์ž๋ฆฌ(root)์— .env ์ƒ์„ฑ
touch .env
# 2. .env ์ˆ˜์ •ํ•˜๊ธฐ vi๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ˆ˜์ • ํ™”๋ฉด์œผ๋กœ ์ „ํ™˜
vi .env
MYSQL_URL=jdbc:mysql://db:3306/Databases์ด๋ฆ„
MYSQL_USERNAME=๊ธฐ์กด spring env์— ์„ค์ •ํ•œ ๋ณ€์ˆ˜๊ฐ’
MYSQL_PASSWORD=๊ธฐ์กด spring env์— ์„ค์ •ํ•œ ๋ณ€์ˆ˜๊ฐ’
MYSQL_ROOT_PASSWORD=MYSQL root๋กœ ์‚ฌ์šฉํ•  ํŒจ์Šค์›Œ๋“œ
MYSQL_DATABASE=MYSQL์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” DB์ด๋ฆ„ ์ง€์ •
# ๊ฐ๊ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ธํŒ…์„ ํ•ด์ค˜์•ผํ•จ.

ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ๋งž๊ฒŒ ๊ฐ๊ฐ ๋ณ€์ˆ˜๊ฐ’ ์„ธํŒ…์„ ํ•ด์ค˜์•ผํ•จ. ํ•ด๋‹น ์„ค์ •์€ docker-compose.yml environment์— ๊ฐ’์„ ์„ธํŒ…ํ•ด์ฃผ๋Š” ์ž‘์—…์ž„.
 

8. EC2) docker-compose ์‹คํ–‰ ( ์„œ๋ฒ„์— ํ”„๋กœ๊ทธ๋žจ์„ ๋„์›Œ์„œ ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด )

# docker compose ์‹คํ–‰ ๋ช…๋ น์–ด -> up -d ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์ง€์†์ ์œผ๋กœ ๋„์šฐ๊ธฐ ์œ„ํ•œ ์„ค์ •
sudo docker compose up -d

# docker compose ์ค‘๋‹จ ๋ช…๋ น์–ด
sudo docker compose down

# ๊ทธ๋ฐ–์˜ ๋ช…๋ น์–ด๋“ค

# docker ํ˜„์žฌ ๋„์›Œ์ง„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด
sudo docker ps -a

# docker ํ˜„์žฌ ๋„์›Œ์ง„ ์ปจํ…Œ์ด๋„ˆ์˜ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด
sudo docker logs -f ์ปจํ…Œ์ด๋„ˆ๋ช…

docker compose up -d ๋ฅผ ํ†ตํ•ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— docker compose.yml์— ์„ค์ •ํ•œ mysql๊ณผ backend app์„ ์ด๋ฏธ์ง€๋กœ ๋ฐ›์•„์™€์„œ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋„์›Œ์„œ ์‹คํ–‰์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌ๋ฉด ์™ธ๋ถ€ ์œ ์ €๋“ค์ด ํ•ด๋‹น ์„œ๋ฒ„์— ์ ‘์†์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.