๋ฐฐํฌ ์ ์์์ผ ํ ์ฌํญ
- ์ด ๊ณผ์ ์ 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์ ์ด๋ฏธ์ง๋ก ๋ฐ์์์ ์ปจํ ์ด๋๋ก ๋์์ ์คํ์ ํ ์ ์๊ฒ ๋๋ค. ์ด๋ฌ๋ฉด ์ธ๋ถ ์ ์ ๋ค์ด ํด๋น ์๋ฒ์ ์ ์์ ํ ์ ์๊ฒ ๋๋ค.