๊ธฐ์กด์ ๊ฐ๋ฐํ๋ ํ๋ก์ ํธ์ docker-compose๋ฅผ ์ ์ฉ์์ผ๋ณด์๋ค. ์ถ๊ฐ๋ก Nginx๋ฅผ ๋์ 3๊ฐ์ spring server์ ๋ก๋๋ฐธ๋ฐ์ฑ๋ ํด๋ณด์๋ค.
๊ทธ ์ ์ docker compose ์คํ ์ข ๋ฃ ๋ช ๋ น์ด์ ๋ํด ์ ๋ฆฌํด๋ณด์๋ค.
๋์ปค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์บ์ฑ์ ์ํํ๊ธฐ ๋๋ฌธ์ docker compose๋ฅผ ์คํํ์ ๋ ์์ ์ฌํญ์ด ์ ์ฉ๋์ง์๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์๋ค. ๋ฐ๋ผ์ ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ก ์คํ, ์ข ๋ฃ๋ฅผ ๊ถ์ฅํ๋ค.
- ์คํ: docker compose up --force-recreate
- ์ข ๋ฃ: docker compose down --rmi all
Spring boot + MariaDb
application.yml
spring:
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://database:3306/colony
username: root
password: 1234
servlet:
multipart:
max-file-size: 30MB
max-request-size: 30MB
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
default_batch_fetch_size: 1000
dialect: org.hibernate.dialect.MySQL8Dialect
mvc:
async:
request-timeout: -1
docker-compose.yml
version: "3.8" # ํ์ผ ๊ท๊ฒฉ ๋ฒ์
services: # ์ด ํญ๋ชฉ ๋ฐ์ ์คํํ๋ ค๋ ์ปจํ
์ด๋๋ค์ ์ ์
database:
container_name: database
build:
dockerfile: Dockerfile
context: ./database
image: dgjisnu/database
environment:
- MARIADB_DATABASE=colony
- MARIADB_ROOT_PASSWORD=1234
volumes:
- ./database/config:/etc/mysql/conf.d
- ./database/data:/var/lib/mysql
ports:
- "13306:3306" # ์ ๊ทผ ํฌํธ ์ค์ (์ปจํ
์ด๋ ์ธ๋ถ:์ปจํ
์ด๋ ๋ด๋ถ)
colony-app:
container_name: colony-app
build: .
depends_on: # DB, REDIS ์ปจํ
์ด๋๊ฐ ์คํ๋ ๋ค์ WEB์ ์คํ์ํจ๋ค.
- database
image: dgjinsu/colony-app
environment:
- MAIL_PASSWORD=${MAIL_PASSWORD}
- MAIL_USERNAME=${MAIL_USERNAME}
- S3_ACCESS_KEY=${S3_ACCESS_KEY}
- S3_SECRET_KEY=${S3_SECRET_KEY}
ports:
- "80:8080"
restart: always # depends on์ ์คํ ์์๋ง ์ปจํธ๋กค ํ ๋ฟ,
์ฌ๊ธฐ์ ์ฝ์ง์ ๊ฝค๋ ํ๋ค.
์ด๋ฐ์ DB๋ง ๋์ปค๋ก ๋์๋๊ณ ์๋ฒ๋ ๋ก์ปฌ๋ก ์คํํ๋ ํํ๋ก ๊ฐ๋ฐ์ ์งํํ๋ค. ์ด๋ DB ports ๋ถ๋ถ์ "3306:3306" ์ผ๋ก ํ๊ฒ ๋๋ฉด local์ ๊น๋ฆฐ mysql ๋๋ฌธ์ ํฌํธ ์ถฉ๋์ด ๋๋ค. ๋ฐ๋ผ์ ์ธ๋ถ ํฌํธ๋ฅผ 13306์ผ๋ก ๋ฐ๊ฟ์ฃผ์๊ณ application.yml ํ์ผ ์์ DB์ฐ๊ฒฐ ๋ก์ง์ url: jdbc:mariadb://localhost:13306/ ์ผ๋ก ์์ ํด์ฃผ์๋ค.
๊ฐ๋ฐ์ด ๋๋๊ณ ์คํ๋ง๋ ์ปจํ ์ด๋๋ก ๋์ฐ๊ธฐ ์ํด ์์ ํ์๊ณ db์ฐ๊ฒฐ ๋ถ๋ถ ์ฝ๋๋ฅผ url: jdbc:mariadb://database:13306/ ์ผ๋ก ๋ฐ๊ฟ์ฃผ์๋ค. ํ์ง๋ง docker compose up ์ ํ์ ๋ ์๊พธ db์ฐ๊ฒฐ์ ์คํจํ๋ค.
์์ธ์ ํฌํธ์๋ค. ๊ธฐ์กด์๋ ๋์ปค ์ธ๋ถ์์ ๋์ปค ๋ด๋ถ ์ปจํ ์ด๋๋ก ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ 13306 ํฌํธ๋ฅผ ์ฌ์ฉํ๋๊ฒ ๋ง์์ง๋ง ์ปจํ ์ด๋๋ก ๋์์ง ์คํ๋ง์์ db ์ปจํ ์ด๋๋ก ์ ๊ทผํ๊ธฐ ์ํด์ 3306 ํฌํธ๋ก ์ ๊ทผํด์ผํ๋ค.
์กฐ๊ธ๋ง ์๊ฐํ๋ฉด ํด๊ฒฐ๋ ๋ฌธ์ ์์ง๋ง ๋์ปค์ ๋ํ ๊ฐ๋ ์ด ๋ถ์กฑํ์๋ค.
environment ๊ฐ์ ๊ฒฝ์ฐ๋ docker-compose.yml ํ์ผ๊ณผ ๋์ผ ๊ฒฝ๋ก์ .env ํ์ผ์ ๋ง๋ค์ด ํ๊ฒฝ๋ณ์๋ฅผ ์ค์ ํด์ฃผ์๋ค.
์ปจํ ์ด๋๋ฅผ ์ง์ ๋ค ๋ค์ ๋์๋ DB ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๊ธฐ ์ํด์ ๋ณผ๋ฅจ ์ค์ ์ด ํ์ํ๋ค. ./database/data:/var/lib/mysql ์ฝ๋๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ง์ดํธ ์์ผ์ฃผ์๋ค.
Spring Dockerfile
FROM openjdk:17-jdk
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
database Dockerfile
FROM mariadb:10
ENV TZ=Asia/Seoul
database conf
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
[mysqldump]
default-character-set=utf8mb4
Nginx + 3 * Spring boot + mariaDB
์ ๊ทธ๋ฆผ์ฒ๋ผ Nginx์์ 80ํฌํธ๋ก ๋ค์ด์ค๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์คํ๋ง ์ปจํ ์ด๋ 3๊ฐ๋ก ๋ถ์ฐ์์ผ์ค๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
application.yml์ ์ ์ ๊ฐ๋ค.
docker-compose.yml
version: "3.8" # ํ์ผ ๊ท๊ฒฉ ๋ฒ์
services: # ์ด ํญ๋ชฉ ๋ฐ์ ์คํํ๋ ค๋ ์ปจํ
์ด๋๋ค์ ์ ์
database:
container_name: database
build:
dockerfile: Dockerfile
context: ./database
image: dgjisnu/database
environment:
- MARIADB_DATABASE=colony
- MARIADB_ROOT_PASSWORD=1234
volumes:
- ./database/config:/etc/mysql/conf.d
- ./database/data:/var/lib/mysql
ports:
- "13306:3306" # ์ ๊ทผ ํฌํธ ์ค์ (์ปจํ
์ด๋ ์ธ๋ถ:์ปจํ
์ด๋ ๋ด๋ถ)
colony-app1:
container_name: colony-app1
build: .
depends_on: # DB, REDIS ์ปจํ
์ด๋๊ฐ ์คํ๋ ๋ค์ WEB์ ์คํ์ํจ๋ค.
- database
image: dgjinsu/colony-app1
environment:
- MAIL_PASSWORD=${MAIL_PASSWORD}
- MAIL_USERNAME=${MAIL_USERNAME}
- S3_ACCESS_KEY=${S3_ACCESS_KEY}
- S3_SECRET_KEY=${S3_SECRET_KEY}
restart: always # depends on์ ์คํ ์์๋ง ์ปจํธ๋กค ํ ๋ฟ,
ports:
- '8080:8080'
colony-app2:
container_name: colony-app2
build: .
depends_on: # DB, REDIS ์ปจํ
์ด๋๊ฐ ์คํ๋ ๋ค์ WEB์ ์คํ์ํจ๋ค.
- database
image: dgjinsu/colony-app2
environment:
- MAIL_PASSWORD=${MAIL_PASSWORD}
- MAIL_USERNAME=${MAIL_USERNAME}
- S3_ACCESS_KEY=${S3_ACCESS_KEY}
- S3_SECRET_KEY=${S3_SECRET_KEY}
restart: always # depends on์ ์คํ ์์๋ง ์ปจํธ๋กค ํ ๋ฟ,
ports:
- '8081:8080'
colony-app3:
container_name: colony-app3
build: .
depends_on: # DB, REDIS ์ปจํ
์ด๋๊ฐ ์คํ๋ ๋ค์ WEB์ ์คํ์ํจ๋ค.
- database
image: dgjinsu/colony-app3
environment:
- MAIL_PASSWORD=${MAIL_PASSWORD}
- MAIL_USERNAME=${MAIL_USERNAME}
- S3_ACCESS_KEY=${S3_ACCESS_KEY}
- S3_SECRET_KEY=${S3_SECRET_KEY}
restart: always # depends on์ ์คํ ์์๋ง ์ปจํธ๋กค ํ ๋ฟ,
ports:
- '8082:8080'
proxy-be:
image: nginx:1.21.5-alpine
container_name: colony-nginx
restart: always
depends_on:
- colony-app1
- colony-app2
- colony-app3
ports:
- "80:80"
volumes:
- ./proxy/nginx-be.conf:/etc/nginx/nginx.conf
nginx-be.conf
events { worker_connections 1024; }
http{
upstream colony-app {
server colony-app1:8080;
server colony-app2:8080;
server colony-app3:8080;
}
server {
listen 80;
location / {
proxy_pass http://colony-app;
}
}
}
์์์ ์ฝ์งํ ๋๋ถ์ ์ฌ๊ธฐ์ ๋ฐ๋ก ์ฑ๊ณตํ ์ ์์๋ค. app1, 2, 3์ 8080, 8081, 8082 ํฌํธ๋ฅผ 8080ํฌํธ๋ก ํฌ์๋ฉ ์์ผ์ฃผ์ง๋ง nginx์์ ์ ๊ทผํ ๋ ์ ๋ถ 8080ํฌํธ๋ก ์ ๊ทผํด์ผ ํ๋ค.