์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ์ฌ
์์ฉํ๋ก๊ทธ๋จ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ณ , ๋ฐฐํฌํ๊ณ ์คํํ ์ ์๋๋ก ์ค๊ณ๋ ๋๊ตฌ์ด๋ฉฐ
์ปจํ ์ด๋ ๊ธฐ๋ฐ์ ์คํ ์์ค ๊ฐ์ํ ํ๋ซํผ์ด๋ค.
์ผ๋ฐ ์ปจํ ์ด๋ ๊ฐ๋ ์์ ๋ฌผ๊ฑด์ ์์ฝ๊ฒ ์ด์กํด์ฃผ๋ ๊ฒ์ฒ๋ผ
์ดํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ์์ฝ๊ฒ ๋ฐฐํฌ ๊ด๋ฆฌ๋ฅผ ํ ์ ์๊ฒ ํด์ค๋ค.
์ปจํ ์ด๋ ๊ธฐ๋ฐ ๋ฐฐํฌ ๋ฐฉ์์
๊ตฌ๊ธ์ ๋น๋กฏํด ๋๋ถ๋ถ์ ์๋น์ค ํ์ฌ๊ฐ ์ปจํ ์ด๋๋ก ์๋น์ค ์ด์ ์ค์ด๋ค.
2๋์ ์๋ฒ๊ฐ ์์ ๋,
2๋์ ์๋ฒ ์ธํ ์๊ธฐ๊ฐ ๋ค๋ฅด๋ค๋ฉด ,
์ด์์ฒด์ ๋ฒ์ ๋ถํฐ ์ปดํ์ผ๋ฌ, ์ค์น๋ ํจํค์ง๊น์ง ์๋ฒฝํ๊ฒ ๊ฐ๊ฒ ํ๊ธฐ๊ฐ ์ฝ์ง ์๋ค.
์ด๋ฌํ ์ฐจ์ด๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด๋ฐ,
๋์ปค๋ ์๋ฒ๋ง๋ค ๋์ผํ ํ๊ฒฝ์ ๊ตฌ์ฑํด์ฃผ๊ธฐ ๋๋ฌธ์
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๋ํ,
docker๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ผํ ํ๊ฒฝ์ ๊ตฌ์ฑํ๊ธฐ ๋๋ฌธ์ auto scaling์ ์ ๋ฆฌํ๋ค.
Hypervisor๋ (VM)
ํธ์คํธ ์์คํ (์๋์ฐ, ๋ฆฌ๋ ์ค ๋ฑ)์์
๋ค์์ ๊ฒ์คํธ OS (๊ฐ์๋จธ์ ) ๋ฅผ ๊ตฌ๋ํ ์ ์๊ฒ ํ๋ ์ํํธ์จ์ด์ด๋ค.
๊ฐ VM ๋ง๋ค ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๋ค.
Container๋ (Docker)
ํ์ดํผ ๋ฐ์ด์ ๊ตฌ์กฐ๋ฅผ ํ ๋๋ก ๋ฑ์ฅํ์ผ๋ฉฐ,
VM๋ณด๋ค ํจ์ฌ ๊ฐ๋ณ๊ฒ ๋์ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ ๋ฆฌํ๋ค.
์ด๋ฏธ์ง๋
์ฝ๋, ๋ฐํ์, ์์คํ
๋๊ตฌ, ์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์ค์ ๊ณผ ๊ฐ์
์์ฉ ํ๋ก๊ทธ๋จ์ ์คํ ํ๋๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ ํฌํจํ๋ ํจํค์ง
์ด๋ค.
์ด๋ฏธ์ง๋ Github์ ์ ์ฌํ ์๋น์ค์ธ https://hub.docker.com ์ ํตํด ๋ฒ์ ๊ด๋ฆฌ๋๋ค.
์ปจํ ์ด๋๋
์ด๋ฏธ์ง ์ธ์คํด์ค
๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.๋์ปค ์ด๋ฏธ์ง๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด ์์ด์ผํ
ํจํค์ง, ์์กด์ฑ, ์์ค์ฝ๋ ๋ฑ์ ํ๋์ file๋ก ๊ธฐ๋กํ์ฌ
์ด๋ฏธ์งํ ์ํฌ ๋ช
๋ น ํ์ผ
์ด๋ค.
์ฆ,
์ด๋ฏธ์ง๋ ์ปจํ
์ด๋๋ฅผ ์คํํ๊ธฐ ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์,
๋ ์ด์ ์๋ก์ด ์๋ฒ๊ฐ ์ถ๊ฐ๋๋ฉด
์์กด์ฑ ํ์ผ์ ์ปดํ์ผํ๊ณ ์ด๊ฒ ์ ๊ฒ ์ค์นํ ํ์๊ฐ ์๋ค.
์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ ์ด๋ฏธ์ง๋ฅผ ์ง์ ์ด๋ฏธ์ง ์ด๋ฆ:ํ๊ทธ
# ex. jdk 11 ์ด ์๋ ์ปจํ
์ด๋ ์ฌ์ฉ
FROM openjdk:11
์ด๋ฏธ์ง ๋น๋ ์์ ์์ ์ฌ์ฉํ ๋ณ์ ์ง์
ARG JAR_FILE=build/libs/app.jar
ํธ์คํธ์ ์๋ ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๋ฅผ Docker ์ด๋ฏธ์ง์ ํ์ผ ์์คํ ์ผ๋ก ๋ณต์ฌ
COPY ${JAR_FILE} ./app.jar
์ปจํ ์ด๋์์ ์ฌ์ฉํ ํ๊ฒฝ ๋ณ์ ์ง์
# TimeZone ํ๊ฒฝ ๋ณ์
ENV TZ=Asia/Seoul
์ปจํ ์ด๋๊ฐ ์คํ๋์์ ๋ ํญ์ ์คํ๋์ด์ผ ํ๋ ์ปค๋งจ๋ ์ง์
ENRTYPOINT ["java", "-jar", "./app.jar"]
Docker Compose๋
๋ฉํฐ ์ปจํ
์ด๋
๋์ปค ์ดํ๋ฆฌ์ผ์ด์
์ ์ ์ํ๊ณ ์คํํ๋ ๋๊ตฌ์ด๋ค.
Application , Database , Redis , Nginx ๋ฑ
๊ฐ ๋
๋ฆฝ์ ์ธ ์ปจํ
์ด๋๋ก ๊ด๋ฆฌํ๋ค๊ณ ํ์ ๋
๋ค์ค ์ปจํ
์ด๋ ๋ผ์ดํ ์ฌ์ดํด์ ์ด๋ป๊ฒ ๊ด๋ฆฌํด์ผ ํ ๊น?
-> ๋์ปค ์ปดํฌ์ฆ๋ก ๊ด๋ฆฌ!
์ฌ๋ฌ๊ฐ์
๋์ปค ์ปจํ
์ด๋๋ก ๋ถํฐ ์ด๋ฃจ์ด์ง ์๋น์ค๋ฅผ ๊ตฌ์ถ
,
๋คํธ์ํฌ ์ฐ๊ฒฐ
, ์คํ ์์
๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌ
ํด์ค๋ค.
docker-compose.yml
ํ์ผ์ ์์ฑํ์ฌ 1ํ ์คํํ๋ ๊ฒ์ผ๋ก
์ค์ ๋ ๋ชจ๋ ์ปจํ
์ด๋๋ฅผ ์คํ.
windows : https://docs.docker.com/desktop/install/windows-install/
๊ท์ฌ์ด๊ฒ ์๊ฒผ๋ผใ
ใ
Linux Ubuntu
# ์ฐ๋ถํฌ ์์คํ
ํจํค์ง ์
๋ฐ์ดํธ
sudo apt-get update
# ํ์ํ ํจํค์ง ์ค์น
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# Docker์ ๊ณต์ GPGํค๋ฅผ ์ถ๊ฐ
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Docker์ ๊ณต์ apt ์ ์ฅ์๋ฅผ ์ถ๊ฐ
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# ์์คํ
ํจํค์ง ์
๋ฐ์ดํธ
sudo apt-get update
# Docker ์ค์น
sudo apt-get install docker-ce docker-ce-cli containerd.io
# version ํ์ธ
docker -v
docker compose ๋ Mac
๋๋ Windows
์ ๊ฒฝ์ฐ
Docker desktop
์ ์ค์นํ ๊ฒฝ์ฐ๋ผ๋ฉด
docker compose ์ค์น๋ฅผ ์งํํ ํ์๊ฐ ์์ผ๋ฉฐ,
Linux์ ๊ฒฝ์ฐ ์ถ๊ฐ์ ์ผ๋ก docker-compose ์ค์น๊ฐ ํ์ํ๋ค.
# https://github.com/docker/compose/releases ์์ ์ต์ ๋ฒ์ ํ์ธํ ์ค์น
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# ์คํ์ด ๊ฐ๋ฅํ๊ฒ ๊ถํ์ ์ธํ
sudo chmod +x /usr/local/bin/docker-compose
# ์ค์น ๋ฒ์ ํ์ธ
sudo docker-compose -v
windows์ ๊ฒฝ์ฐ power shell์ ์คํํ๊ณ ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ค.
ubuntu์์ shell์ ๋ฐ๋ก ์ ๋ ฅ
docker login
๋ก๊ทธ์ธ ์คํจ์ ์ข์ธก ํ๋จ์ ๋์ปค ๋ฐ์คํฌํ์ด ์คํ์ค์ธ์ง ํ์ธ!
๋ชฉํ : Spring Boot ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ฏธ์งํ ํ ์ปจํ ์ด๋์์ ์คํ
์ธํ ๋ฆฌ์ ์ด ๋ด์ฅ terminal์ ์ฌ์ฉํ๋ฉด
ํ๋ก์ ํธ ํ์ฌ ์์น์์ ์คํ๋์ด ํธํ๋ค.
์ธํ ๋ฆฌ์ ์ด๋ก ํ๋ก์ ํธ ์คํ ํ ๋ด์ฅ ํฐ๋ฏธ๋ ์ด๊ธฐ.
jar ํ์ผ ์ด๋ฆ์ app.jar
๋ก ์ง์ ํด์ ์์ฑ๋๋๋ก ํ๊ณ ์ ํ๋ค.
build.gradle ํ์ผ์ ์คํ ํ ๋ค์์ ์ฝ๋๋ฅผ ์์ฑํด์ค๋ค.
bootJar {
archiveFileName = 'app.jar'
}
(windows)
.\gradlew clean
.\gradlew build
ํ์ผ ์ด๋ฆ : Dockerfile
#Dockerfile
FROM openjdk:11
ARG JAR_FILE=build/libs/app.jar
COPY ${JAR_FILE} ./app.jar
ENV TZ=Asia/Seoul
ENTRYPOINT ["java", "-jar", "./app.jar"]
docker build -t {docker hub username}/{file name} {docker file ์์น}
docker build -t zhyun/jar-docker-file-test .
์์ฑ๋ docker images ํ์ธ!
docker images
docker run ๋ช ๋ น์ด ์ฌ์ฉ!
docker run zhyun/jar-docker-file-test -p 8080:8080
-p : {host port}:{์ปจํ ์ด๋ port}
docker ๊ฐ ์ ์ ๋์์ค์ธ์ง ํ์ธ์ ์ํด terminal์ ํ๋ ์๋ก ์ด๊ณ
์๋์ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ค.
docker ps
์คํ์ค์ธ docker images ํ์ธ ๊ฐ๋ฅ!
+ ์คํ์ค์ธ ์ปจํ ์ด๋์ ๋ค์ด๊ฐ๋ณด๊ธฐ
docker exec -it {container id} {shell}
docker exec -it 4d10189fd2a5 bash
์ฐ์ ๐
version
๋์ปค ์์ง๋ฒ์ ์ ๋ฐ๋ฅธ ์ปดํฌ์ฆ ๋ฒ์ ์ ํ
compose-v3
compose-v2
service
์ด๊ณณ์ ์คํํ๋ ค๋ ์ปจํ ์ด๋๋ค์ ์ ์
pharmacy-recommendation-app
์๋น์ค๋ช
( ๋คํธ์ํฌ ํธ์คํธ๋ช
) / ๊ฐ์ ๋คํธ์ํฌ์ ์ํ ์ปจํ
์ด๋๋ผ๋ฆฌ ์๋น์ค ๋ช
์ผ๋ก ์ ๊ทผ
๊ฐ๋ฅ
container_name
์ปจํ ์ด๋ ์ด๋ฆ
build
dockerfile ์ด ์๋ ์์น
depends_on
ํน์ ์ปจํ ์ด๋์ ๋ํ ์์กด๊ด๊ณ
image
์ปจํ ์ด๋ ์์ฑํ ๋, ์ฌ์ฉํ ๋์ปค ์ด๋ฏธ์ง ์ง์
environment
ํ๊ฒฝ ๋ณ์
volumnes
ํธ์คํธ ๋๋ ํ ๋ฆฌ : ์ปจํ ์ด๋ ๋๋ ํ ๋ฆฌ
ports
์ ๊ทผ ํฌํธ ์ค์ (์ปจํ
์ด๋ ์ธ๋ถ : ์ปจํ
์ด๋ ๋ด๋ถ)
--> docker run -p ์ต์
๊ณผ ๊ฐ์ผ๋ฉฐ, ๊ฐ๋ฐฉํ ํฌํธ๋ฅผ ์ง์ ํ๋ ๊ฒ
restart
์ปจํ ์ด๋ ์คํ ์คํจํ๋ ๊ฒฝ์ฐ ์ฌ์์ ์ฌ๋ถ
# /database/Dockerfile
FROM mariadb:10
ENV TZ=Asia/Seoul
# /redis/Dockerfile
FROM redis:6
ENV TZ=Asia/Seoul
version: "3.8"
services:
jar-docker-file-test-maria:
container_name: /jar-docker-file-test-maria
build:
dockerfile: Dockerfile
context: ./database
image: zhyun/jar-docker-file-test-maria
environment:
- MARIADB_DATABASE=fc-pharmacy-directions
- MARIADB_ROOT_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
volumes:
- ./database/config:/etc/mysql/conf.d
ports:
- "3303:3306" # localhost์์ 3306 port ๋ฅผ ์ฌ์ฉ์ค์ด๊ธฐ ๋๋ฌธ์ 3303์ผ๋ก ์ ๊ทผ
jar-docker-file-test-redis:
container_name: /jar-docker-file-test-redis
build:
dockerfile: Dockerfile
context: ./redis
image: zhyun/jar-docker-file-test-redis
ports:
- "6379:6379"
docker-compose -f docker-compose-local.yml up
์ปจํ ์ด๋ ๋์ ํ์ธ
docker ps
# ์คํ ํ ํ๊ฒฝ ์ ๋ณด ์์ฑ
spring:
profiles:
active: local
group:
local:
- common
prod:
- common
---
# profile ์ค์ 1 : common
spring:
config:
activate:
on-profile: common
---
# profile ์ค์ 2 : local
spring:
config:
activate:
on-profile: local
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://localhost:3303/fc-pharmacy-directions
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
redis:
host: localhost
port: 6379
jpa:
hibernate:
ddl-auto: create
show-sql: true
---
# profile ์ค์ 3 : prod
spring:
config:
activate:
on-profile: prod
๊ธ ์ ๋ดค์ต๋๋ค.