๐ 0. Docker ๊ฐ๋
โ 0-1. ๊ฐ๋
Docker๋ ์์ฉ ํ๋ก๊ทธ๋จ๊ณผ ๊ทธ ์์กด์ฑ์ ํ๋์ ํจํค์ง๋ก ๋ฌถ์ด ์คํํ ์ ์๋ ์ปจํ ์ด๋ ๊ธฐ์
- Docker: ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉํ๋ ์ปจํ ์ด๋ ์์ง
- ์ปจํ ์ด๋ ์์ง: ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ณ ์คํํ๋ ์ํํธ์จ์ด (์ปจํ ์ด๋ ๊ตฌํ ๊ธฐ์ )
- ์ปจํ ์ด๋: ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํ ๊ฒฉ๋ฆฌ๋ ์คํ ํ๊ฒฝ (OS์ปค๋ ๊ณต์ , VM๋ณด๋ค ๊ฐ๋ณ๊ณ ๋น ๋ฆ)
*VM: OS๊น์ง ํฌํจํ ์์ ํ ๊ฐ์ํ๊ฒฝ
์ปจํ
์ด๋: OS ์์ด ์คํ ํ๊ฒฝ๋ง ๊ฒฉ๋ฆฌ
โ 0-2. ์ฌ์ฉ ์ด์
๐ ์ฑ๋ฅ ๋๋ฌธ โ
๐ ์ด์/๊ด๋ฆฌ ๋๋ฌธ โญ
- ํ๊ฒฝ ํต์ผ: ๋ด PC·ํ์·์๋ฒ ์ด๋์๋ ๋์ผํ ์คํ ํ๊ฒฝ ๋ณด์ฅ
- ๋ฒ์ ๊ด๋ฆฌ: ์ด๋ฏธ์ง๋ก ๋ฒ์ ์ ๊ณ ์ ํ์ฌ ํ๊ฒฝ ์ถฉ๋ ์์ด ์์ ์ ์ธ ์คํ ๊ฐ๋ฅ
- ํ ๋ฒ์ ์คํ: DB·Redis·์๋น์ค ๋ฑ์ ํ ๋ฒ์ ์คํํ์ฌ ์ธํ ์๊ฐ ์ต์ํ
- ๊ฒฉ๋ฆฌ (Isolation): ์๋น์ค๋ณ๋ก ๋ถ๋ฆฌ๋์ด ํฌํธ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถฉ๋ ๋ฐฉ์ง
- ์ญ์ /์ด๊ธฐํ ์ฌ์: ๋ช ๋ น์ด ํ ๋ฒ์ผ๋ก ํ๊ฒฝ์ ๋น ๋ฅด๊ฒ ์ด๊ธฐํํ๊ณ ์ฌ๊ตฌ์ฑ ๊ฐ๋ฅ
- ํ์ฅ์ฑ: ์๋น์ค๋ฅผ ์ฝ๊ฒ ์ถ๊ฐ·ํ์ฅํ๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ ๋ฐ ํ ์คํธ ๊ฐ๋ฅ
โญ Tip
๐นDocker ์ด๋ฏธ์ง๋ ๋ณดํต ์ธํฐ๋ท์์ ๋ค์ด๋ก๋
Docker Hub / ์ฌ์ค ๋ ์ง์คํธ๋ฆฌ → pull → ๋ก์ปฌ ์ ์ฅ
๐นํ์ ๋ง์์๋?
์ด๋ฏธ์ง ํ์ผ๋ก ์ฎ๊น
docker save -o mariadb.tar mariadb:10.6
docker load -i mariadb.tar
โ ์ธ๋ถ๋ง → ๋ด๋ถ๋ง ์ด๋ ๊ฐ๋ฅ
โ ํ์๋ง์์๋ ์ฌ์ฉ ๊ฐ๋ฅ
โ 0-3. ์ค์น ๊ฐ๋ฅ ์๋น์ค ์์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ์บ์ (RDBMS: MariaDB / NoSQL: MongoDB / ์บ์: Redis ๋ฑ)
- ๋ฉ์์ง ๋ธ๋ก์ปค (Kafka, RabbitMQ ๋ฑ)
- ์น ์๋ฒ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ (์น ์๋ฒ: Nginx / ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ: Tomcat ๋ฑ)
- ๊ฐ๋ฐ ๋๊ตฌ (CI/CD ํด: Jenkins / ์ฝ๋ ํ์ง ๋ถ์: ESLint / ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ: Adminer )
- ๋น ๋ฐ์ดํฐ ๋ฐ ๋ถ์ ( Hadoop / Elasticsearch + Kibana (ELK Stack) / Spark )
- ๋คํธ์ํฌ ๋ฐ ๋ณด์ (ํ๋ก์ ์๋ฒ / ๋ณด์ ์ค์บ๋)
- ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น
- ๋จธ์ ๋ฌ๋ ๋ฐ ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค
- ๊ธฐํ (๋ฒ์ ๊ด๋ฆฌ ๋ฐ ํ์ : Git, SVN / CMS / VPN ๋ฐ ๋คํธ์ํฌ ๊ด๋ฆฌ)
- ์ด์ ์๋ํ (Ansible AWX, Terraform)
๐ 1. Docker ๊ธฐ๋ณธ
โ 1-1. Docker ์ค์น (์๋์ฐ ๊ธฐ์ค) ๐
๐ Docker Desktop ์ค์น
https://www.docker.com/products/docker-desktop/
โ ๊ทธ๋ฅ Next Next ์ค์น
โ WSL2 ์๋ ์ค์
์ค์น ์๋ฃ ์ ์๋ ๋๊ฐ ์ฐฝ์ด ๋ธ. (๋ ๋ค ๋ซ์๋ ๋๋ค.)


๐น Docker Desktop => ์์ ํ์์ค์์ Docker Desktop์ด ์คํ์ค์ธ์ง ํ์ธ (๋ฏธ์คํ ์ค์ด๋ฉด docker ๋ช ๋ น์ด ์ ๋จน์)
๐น WSL(Windows Subsystem for Linux) => WSL ์ง์ ์ธ ํ์ ๊ฑฐ์ ์์, ๊ทธ๋ฅ Docker ์ฐ๋ฉด ์๋์ผ๋ก ๋์๊ฐ
๐ ํ์ธ ๋ฐฉ๋ฒ. Version์ด 2๋ฉด ์ ๋๋ก ์คํ์ค.
$ wsl -l -v
NAME STATE VERSION
* docker-desktop Running 2
*ํ์ ์ฑ๋ฅ ์ต์ ํ ํ์์ wsl์ ์ฐ๋ถํฌ๋ฅผ ๊น๊ณ , wsl ๋ด๋ถ์์ ๋์ปค ์คํ ๊ฐ๋ฅํ๋ ์ง๊ธ์ ๋์ด๊ฐ๋ค!
๐ ์ค์น ํ
# ์ค์น ๋ฒ์ ํ์ธ
docker --version
# Docker Desktop ์คํ ์ค์ธ์ง ํ์ธ
docker p
โ 1-2. ์ปจํ ์ด๋ ์คํ ํ์ธ

๐น ์ปจํ ์ด๋ ์คํ
docker run hello-world
โ Docker ์ค์นํ๋ฉด docker ๋ช ๋ น์ด๊ฐ ์์คํ PATH์ ๋ฑ๋ก๋จ ์ด๋ ๊ฒฝ๋ก์์๋ ๋ช ๋ น์ด ์คํ ๊ฐ๋ฅ
๐ ์ฑ๊ณตํ๋ฉด ๋์ปค ์ ์ ์๋ (์ฑ๊ณต ์ถ๋ ฅ)
$ docker run hello-world
Unable to find image 'hello-world:latest' locally # โ๏ธ์ด๋ฏธ์ง ๋ก์ปฌ์์ ์ฐพ์ ์ ์์ด์ ๋ค์ด๋ก๋ ์์
latest: Pulling from library/hello-world # โ๏ธDocker Hub์์ ์ด๋ฏธ์ง ๋ฐ์์ด
17eec7bbc9d7: Pull complete
ea52d2000f90: Download complete
Digest: sha256:85404b3c53951c3ff5d40de0972b1bb21fafa2e8daa235355baf44f33db9dbdd
Status: Downloaded newer image for hello-world:latest
Hello from Docker! # โ๏ธ์ปจํ
์ด๋ ์คํ์ฑ๊ณต
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/โ
๐2. ์ปจํ ์ด๋ ๊ด๋ฆฌ
โ 2-1. Docker ํต์ฌ ๋ช ๋ น์ด ์ ๋ฆฌ
| ๋ช ๋ น์ด | ์ค๋ช | ์ธ์ ์ | ์์ |
| docker ps | ์คํ ์ค ์ปจํ ์ด๋๋ง ์กฐํ | ์ง๊ธ ๋์๊ฐ๋ ๊ฒ ํ์ธ | docker ps |
| docker ps -a | ์ ์ฒด ์ปจํ ์ด๋ ์กฐํ (์ข ๋ฃ ํฌํจ) | ๊ณผ๊ฑฐ ์คํ ๊ธฐ๋ก ํ์ธ | docker ps -a |
| docker run | ์ปจํ ์ด๋ ์์ฑ + ์คํ | ์ฒ์ ์คํํ ๋ | docker run nginx |
| docker start | ์ค์ง๋ ์ปจํ ์ด๋ ๋ค์ ์์ | ์ฌ์ฌ์ฉ | docker start my-container |
| docker stop | ์คํ ์ค ์ปจํ ์ด๋ ์ข ๋ฃ | ์ข ๋ฃํ ๋ | docker stop my-container |
| docker restart | ์ฌ์์ | ์ค์ ๋ณ๊ฒฝ ํ | docker restart my-container |
| docker rm | ์ปจํ ์ด๋ ์ญ์ | ์์ ํ ์ ๊ฑฐ | docker rm my-container |
| docker images | ์ด๋ฏธ์ง ๋ชฉ๋ก ์กฐํ | ๋ค์ด๋ก๋๋ ์ด๋ฏธ์ง ํ์ธ | docker images |
| docker rmi | ์ด๋ฏธ์ง ์ญ์ | ์ฉ๋ ์ ๋ฆฌ | docker rmi nginx |
| docker logs | ์ปจํ ์ด๋ ๋ก๊ทธ ํ์ธ | ์๋ฌ/๋๋ฒ๊น | docker logs my-container |
| docker exec | ์ปจํ ์ด๋ ๋ด๋ถ ์ ์ | DB ํ์ธ, ํ ์คํธ | docker exec -it my-container bash |
| docker pull | ์ด๋ฏธ์ง ๋ค์ด๋ก๋ | ๋ฏธ๋ฆฌ ๋ฐ์๋ ๋ | docker pull nginx |
| docker build | ์ด๋ฏธ์ง ์ง์ ์์ฑ | Dockerfile ์ฌ์ฉ ์ | docker build . |
โ 2-2. ๊ฐ๋ณ ์ปจํ ์ด๋ ์คํ
๊ฐ ์ปจํ ์ด๋๋ฅผ ์ผ์ผ์ด docker run์ผ๋ก ์คํํด์ผ ํด์ ์ ์ฐ์ง ์๋๋ค!!
# MariaDB
docker run -d \
--name mariadb \
-e MYSQL_ROOT_PASSWORD=root \
-p 3306:3306 \
-v mariadb_data:/var/lib/mysql \
mariadb:10.6
# Redis
docker run -d \
--name redis \
-p 6379:6379 \
-v redis_data:/data \
redis
๐น ๋จ์
- ์ปจํ ์ด๋ ๊ฐ ์์กด์ฑ ๊ด๋ฆฌ ํ๋ฆ (depends_on ๊ฐ์ ๊ธฐ๋ฅ ์์)
- ๋คํธ์ํฌ ์ฐ๊ฒฐ ์ง์ ์ค์ ํ์
- ์๋น์ค ์ถ๊ฐ/์ญ์ ์ ๋ช ๋ น์ด ๊ธธ๊ฒ ๋ฐ๋ณต
- ๋ฉํฐ ์ปจํ ์ด๋ ํ๊ฒฝ์์ ์คํ ์์ ๊ด๋ฆฌ ์ด๋ ค์
๐ 3. Docker Compose
โ 3-1. Docker Compose ๊ฐ๋
Docker Compose = ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ํ ๋ฒ์ ์ ์ํ๊ณ ์คํํ๋ ๋๊ตฌ
- docker-compose.yml ํ ํ์ผ ์์์ ์๋น์ค(์ปจํ ์ด๋) ์ ์ + ํฌํธ + ํ๊ฒฝ ๋ณ์ + ๋ณผ๋ฅจ + ๋คํธ์ํฌ ๋ชจ๋ ๊ด๋ฆฌ
- ๋ช ๋ น์ด ํ ๋ฒ(docker-compose up -d)์ผ๋ก ์ฌ๋ฌ ์ปจํ ์ด๋ ์คํ, ์ฐ๊ฒฐ, ๋ฐ์ดํฐ ์์์ฑ๊น์ง ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ๊ฐ๋ฐ ํ๊ฒฝ์์ MSA/์ธํ๋ผ ์ ์ฒด ์คํ ๊ตฌ์ฑํ ๋ ๋งค์ฐ ์ ์ฉ
๐น ์ฅ์
| ํญ๋ชฉ | ์ฅ์ |
| ์๋ํ | ๋จ์ผ ๋ช ๋ น์ด๋ก ๋ชจ๋ ์๋น์ค ์คํ ๊ฐ๋ฅ |
| ์ฐ๊ฒฐ ๊ด๋ฆฌ | ์ปจํ ์ด๋๋ผ๋ฆฌ ๋คํธ์ํฌ ์ด๋ฆ์ผ๋ก ๋ฐ๋ก ํต์ ๊ฐ๋ฅ |
| ํ๊ฒฝ ๋ถ๋ฆฌ | dev/test/prod ํ๊ฒฝ ๋ณ Compose ํ์ผ ๊ฐ๋ฅ |
| ์ฌํ์ฑ | ํ์ ๋ชจ๋ ๋์ผ ํ๊ฒฝ ์ฌํ ๊ฐ๋ฅ |
โ 3-2. docker-compose.yml ์์ฑ
docker-compose.yml์ “ํ๋ก์ ํธ ํด๋ ๋ฃจํธ”์ ๋๋ค.
๐ Spring Boot(application.properties) ์์
# DB (3307)
spring.datasource.url=jdbc:mariadb://localhost:3307/mydb
# ๋ค๋ฅธ ์ปจํ
์ด๋๋ก ์ ๊ทผํ ๋ (localhost X → ์ปจํ
์ด๋ ์ด๋ฆ, 3306)
# spring.datasource.url=jdbc:mariadb://mariadb:3306/mydb
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update #ํ
์ด๋ธ ์๋ ์์ฑ
# Redis
spring.redis.host=localhost
spring.redis.port=6379
* mariadb๋ ์ด๋ฏธ ๋ก์ปฌ์์ 3306์ผ๋ก ์ํ ์ค.
ํ์ต์ ์ํด 3307๋ก ํ ์คํธ. ์ค์ ๋ก๋ ์ด๋ฏธ ๋ฐ์ดํฐ ๋ค์ด์์ด์ ๊ทธ๋ฅ ๋ก์ปฌ ์ผ์.
service.msc์์ ๋ก์ปฌ db ์ข ๋ฃํ๊ณ ๋์ปค์์ 3306์จ๋ ๋จ. (๋์ ์คํ ๋ถ๊ฐ)
๐ docker-compose.yml ์์
services:
mariadb:
image: mariadb:10.6
container_name: mariadb
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "3307:3306" # ๋ก์ปฌ PC์ mariaDB๊ฐ ์์ด์ ํฌํธ ๋ณ๊ฒฝ
volumes:
- mariadb_data:/var/lib/mysql # DB ๋ฐ์ดํฐ ์๊ตฌ ์ ์ฅ
redis:
image: redis
container_name: redis
ports:
- "6379:6379"
volumes:
- redis_data:/data # Redis ๋ฐ์ดํฐ ์ ์ฅ
volumes:
mariadb_data:
redis_data:โ
๐น ์ค์ ํญ๋ชฉ
| ํญ๋ชฉ | ์ญํ | ์์ |
| ํ๊ฒฝ ๋ณ์ | ์ปจํ ์ด๋ ๋ด๋ถ ์ค์ ์ ๋ฌ | MYSQL_ROOT_PASSWORD=root |
| ํฌํธ | ํธ์คํธ ↔ ์ปจํ ์ด๋ ๋งคํ | 3306:3306, 6379:6379 |
| ๋คํธ์ํฌ | ์ปจํ ์ด๋๋ผ๋ฆฌ ํต์ | app ↔ mariadb ๋์ผ ๋คํธ์ํฌ |
| ๋ณผ๋ฅจ | ๋ฐ์ดํฐ ์์์ฑ | /var/lib/mysql → mariadb_data |
โ 3-3. ์คํ/์ข ๋ฃ

ํ๋ก์ ํธ ๋ฃจํธ ๊ฒฝ๋ก(docker-compose.yml์ ๊ฐ์ ๊ฒฝ๋ก)์์ ์คํ.
๐น์์ฑ, ์คํ: up
docker-compose up -d
- ์ปจํ ์ด๋ ์์ผ๋ฉด → ์์ฑ + ์คํ
- ์ปจํ ์ด๋ ์์ผ๋ฉด → (Compose.yml ์์ ) ๋ณ๊ฒฝ์ฌํญ ๋ฐ์ํด์ → ์ฌ์์ฑ + ์คํ
- *Dockerfile ์์ ์: docker-compose up -d --build → ์์ + ์์ฑ + ์คํ
๐น์ ๊ฑฐ: down
docker-compose down
- ์ปจํ ์ด๋ ์ญ์
- ๋คํธ์ํฌ ์ญ์
- โ “์์ ํ ์ข ๋ฃ + ์ ๊ฑฐ”
- โvolume์ ๊ธฐ๋ณธ ์ ์ง
๐น์ ์ง: stop
docker-compose stop
- ์ปจํ ์ด๋ “์ ์ง”๋ง ํจ
- ์ญ์ ์ ํจ “์ผ์์ ์ง ๋๋”
๐น์ฌ์คํ: start
docker-compose start
- stop๋ ์ปจํ ์ด๋ ๋ค์ ์คํ
- โ “์ฌ์์ (์ด๋ฏธ ์กด์ฌํด์ผ ํจ)”
๐น์ ์ง, ์ฌ์คํ: restrart
docker-compose restart
- stop + start
๐4. ๋ณผ๋ฅจ(volume)

โ 4-1. Volume ๊ฐ๋
Volume=๋ฐ์ดํฐ ์์์ฑ
- Docker ๋ณผ๋ฅจ = ์ปจํ ์ด๋ ์ธ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ
- ์ปจํ ์ด๋๋ ์๋ ์์ ๊ณต๊ฐ์์ ๋์ → ์ญ์ ์ ๋ฐ์ดํฐ๋ ์ญ์
- ๋ณผ๋ฅจ์ ์ฐ๋ฉด ์ปจํ
์ด๋ ์ญ์ ํ์๋ ๋ฐ์ดํฐ ์ ์ง ๊ฐ๋ฅ
๐ ์์: DB ๋ฐ์ดํฐ ์ ์ฅ
- ์ปจํ ์ด๋ ๋ด๋ถ ๊ธฐ์ค: /var/lib/mysql (MariaDB)
- ์ฌ๊ธฐ ์์ DB ํ์ผ, ํ
์ด๋ธ, ์ธ๋ฑ์ค, ๋ก๊ทธ ๋ฑ ๋ชจ๋ ์ ์ฅ
โ 4-2. ๋ณผ๋ฅจ ์ข ๋ฅ
| ์ข ๋ฅ | ์ค๋ช | ์์ |
| Named Volume (์ถ์ฒ) | Docker๊ฐ ๊ด๋ฆฌ, ์์ ํ๊ฒ ๋ฐ์ดํฐ ์ ์ง | mariadb_data:/var/lib/mysql |
| Bind Mount | PC ๊ฒฝ๋ก์ ์ปจํ ์ด๋ ์ฐ๊ฒฐ, ํ์ผ ์ง์ ํ์ธ ๊ฐ๋ฅ | ./dbdata:/var/lib/mysql |
โ 4-3. ๋ณผ๋ฅจ ํ์ธ ๋ฐฉ๋ฒ
1๏ธโฃ ๋ณผ๋ฅจ ๋ฆฌ์คํธ ํ์ธ
docker volume ls
2๏ธโฃ ๋ณผ๋ฅจ ์ค์ ๊ฒฝ๋ก ํ์ธ
docker volume inspect mariadb_data
๐ ๊ฒฐ๊ณผ ์์:
[
{
"Name": "mariadb_data",
"Mountpoint": "/var/lib/docker/volumes/mariadb_data/_data"
}
]
โ /var/lib/docker/volumes/mariadb_data/_data ← ์ค์ DB ํ์ผ ์ ์ฅ ์์น
โ 4-4. ์ธํ๋ผ ์ด๊ธฐํ ์์
๋ง์ด ์ฐ๋ ์ธ๋ถ ์ธํ๋ผ MariaDB์ Redis๋ก ์ค์ตํด๋ณด์๋ค.
*GUI์์๋ ์์ฑ/ํ์ธ ๊ฐ๋ฅํ๋ค!!
๐ ์ธํ๋ผ ์ด๊ธฐํ ์ด์ ๋ฆฌ
- docker-compose up -d → ๊ณต์ฉ MariaDB, Redis, ES ์ปจํ ์ด๋ ์คํ
- MariaDB ์ ์ → ์๋น์ค๋ณ DB ์์ฑ (orders, products)
- ํ ์ด๋ธ ์์ฑ → SQL ์ง์ ์์ฑ ๋๋ Spring Boot JPA ์๋ ์์ฑ
- Redis ์ด๊ธฐํ → redis-cli ์ฌ์ฉ
- ์๋น์ค ์คํ → DB/Redis ์ฐ๊ฒฐ ํ์ธ → ๋ณผ๋ฅจ ๋๋ถ์ ๋ฐ์ดํฐ ์๊ตฌ ์ ์ฅ
โ 4-4-1. mariaDB

1๏ธโฃ MariaDB ์ ์ ๋ฐ DB ์์ฑ
โ ์ปจํ ์ด๋ ๋ด๋ถ ์ ์
docker exec -it common-mariadb mysql -uroot -p
# ๋น๋ฐ๋ฒํธ: root
โก ํธ์คํธ์์ ์ ์ (ํฌํธ ๋งคํ ํ์ฉ)
mysql -h 127.0.0.1 -P 3306 -uroot -p
โข ์๋น์ค๋ณ DB ์์ฑ
-- Order ์๋น์ค์ฉ DB
CREATE DATABASE orders;
-- Product ์๋น์ค์ฉ DB
CREATE DATABASE products;
-- ๊ถํ ๋ถ์ฌ (root ๊ณ์ ์ ๊ธฐ๋ณธ์ผ๋ก ๋ชจ๋ DB ์ ๊ทผ ๊ฐ๋ฅ, ํ์ ์ ๋ณ๋ ๊ณ์ ์์ฑ)
GRANT ALL PRIVILEGES ON orders.* TO 'root'@'%';
GRANT ALL PRIVILEGES ON products.* TO 'root'@'%';
FLUSH PRIVILEGES;
๐ก ํฌ์ธํธ: ๊ณต์ฉ MariaDB ํ๋์ง๋ง, DB ์ด๋ฆ๋ง ๋ค๋ฅด๊ฒ ์์ฑ → MSA ์๋น์ค๋ณ ๋ฐ์ดํฐ ๋ถ๋ฆฌ
2๏ธโฃ ํ ์ด๋ธ ์์ฑ
๐น ๋ฐฉ๋ฒ 1: SQL ์ง์ ์์ฑ (๊ธฐ์กด ์ฝ๋ ์์ ๋!!)
-- orders DB
USE orders;
CREATE TABLE order_info (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
quantity INT NOT NULL,
status VARCHAR(50) DEFAULT 'ORDERED',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
๐น ๋ฐฉ๋ฒ 2: Spring Boot JPA ์๋ ์์ฑ (๊ธฐ์กด ์ฝ๋ ์์ )
- application.properties ์์ (Order ์๋น์ค ๊ธฐ์ค)
# DB
spring.datasource.url=jdbc:mariadb://localhost:3306/orders
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
- JPA ์ํฐํฐ ๊ธฐ๋ฐ์ผ๋ก ํ ์ด๋ธ ์๋ ์์ฑ
- ์ฅ์ : ์ฝ๋ ์ค์ฌ ํ ์ด๋ธ ๊ด๋ฆฌ, ์ปจํ ์ด๋ ์ฌ์์ํด๋ ๋ณผ๋ฅจ ๋๋ถ์ ๋ฐ์ดํฐ ์ ์ง
- ๋จ์ : ์ด์ ํ๊ฒฝ์์๋ SQL ์คํฌ๋ฆฝํธ/๋ง์ด๊ทธ๋ ์ด์ ํด ๊ถ์ฅ
3๏ธโฃ ํ ์ด๋ธ ์กฐํ
๐น ๋ฐฉ๋ฒ 1: Docker Desktop → ์ปจํ ์ด๋ ์ ์
mariadb ์ปจํ ์ด๋ Terminal์์.
mysql -u root -p
๋น๋ฒ: root
SHOW DATABASES;
USE orders;
SHOW TABLES;
๐น ๋ฐฉ๋ฒ 2: DB ํด (์ถ์ฒ ๐)
๐ฅ ์ฐ๊ฒฐ ์ ๋ณด
host: localhost
port: 3307 (๋๋ ๋ก์ปฌ์ mariaDB๊ฐ 3306์จ์ ์ด๋ ๊ฒ ์ค์ ํจ)
user: root
password: root
database: orders
# DB
spring.datasource.url=jdbc:mariadb://localhost:3307/orders
โ IDE์์ ์คํํ ๋
jdbc:mariadb://localhost:3307/orders
โ Docker ์์์ ์คํํ ๋
jdbc:mariadb://mariadb:3306/orders
โ 4-4-2. Redis ์ด๊ธฐํ / ํ์ธ
๐น ์ปจํ ์ด๋ ์ ์:
docker exec -it common-redis redis-cli
๐น ๋ฐ์ดํฐ ํ์ธ / ์ญ์
> KEYS * # ๋ชจ๋ key ํ์ธ
> FLUSHALL # ๋ชจ๋ ๋ฐ์ดํฐ ์ญ์ (์ด๊ธฐํ)
๐ก Redis๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ด๋ผ ์ด๊ธฐํ๋ ์ด๋ ๊ฒ CLI๋ก ๊ฐ๋จํ๊ฒ ๊ฐ๋ฅ
๐ 5. Docker ๋คํธ์ํฌ & DNS
๐น ์ปจํ ์ด๋๋ ๊ฐ๊ฐ localhost๋ฅผ ๊ฐ์ง๋ค
- ๊ฐ ์ปจํ ์ด๋๋ ๋ค๋ฅธ ์ปดํจํฐ ์ทจ๊ธ
- localhost = ์๊ธฐ ์์
๐น ์ปจํ ์ด๋ ๊ฐ ํต์ ๋ฐฉ๋ฒ
- Docker Compose๋ ์ปจํ ์ด๋๋ผ๋ฆฌ ํต์ ์ฉ DNS๋ฅผ ์๋ ์์ฑํ๋ค.
- ์๋น์ค ์ด๋ฆ์ผ๋ก ํต์ (eureka-server)
๐น ์ธ๋ถ ↔ ์ปจํ ์ด๋ ํต์
- ํฌํธ ๋งคํ (8761:8761)
- ํฌํธ ํฌ์๋ฉ(port mapping) => ๋ด ๋ก์ปฌ PC์์ ์คํ์ค์ธ ํ๋ก๊ทธ๋จ or ๋ธ๋ผ์ฐ์ ๋ก ์ง์ ์ ์ ์์๋, localhost๋ก ์ปจํ ์ด๋์์ ์คํ์ค์ธ ์๋น์ค์ ์ ์๊ฐ๋ฅํ๋ค!!
๐น ์ปจํ ์ด๋ → ๋ก์ปฌ PC ์ ๊ทผ
- Host.docker.internal => Docker๊ฐ ํน๋ณํ ์ ๊ณตํ๋ ๊ฐ์ง DNS ์ด๋ฆ
- *Linux๋ ์ ๋ ์๋ ์๋ค๊ณ ํ๋ค.
๐ ๋คํธ์ํฌ ํ๋ฆ ์ด์ ๋ฆฌ
[๋ด PC]
localhost:8080 → ์ปจํ
์ด๋ (ํฌํธํฌ์๋ฉ)
localhost:8761 → ์ปจํ
์ด๋ (ํฌํธํฌ์๋ฉ)
[์ปจํ
์ด๋ ๋ด๋ถ]
localhost → ์๊ธฐ ์์ โ
eureka-server → ๋ค๋ฅธ ์ปจํ
์ด๋ โ
host.docker.internal → ๋ด PC โ
๐ 6. ํ๊ฒฝ๋ณ์
๋ก์ปฌ/์ปจํ ์ด๋ ์คํํ๊ฒฝ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํ๊ฒฝ๋ณ์ ์ค์ ์ด ํ์ํ๋ค.
Docker-compose.yml์ ํ๊ฒฝ ๋ณ์ ์ค์ ํ๋ฉด application.yml ์ค์ ๋ฎ์ด์จ์ ๋ก์ปฌ์คํ, ๋์ปค์คํ ๋๋ค ๊ฐ๋ฅํ๋ค.
โ 6-1. ํ๊ฒฝ ๋ณ์ ์ด๋ฆ
Spring boot ์ค์ ํ์ผ (application.yml or application-properties)๋ ๋งคํ๋๋ค.
eureka.client.service-url.defaultZone
↓
EUREKA_CLIENT_SERVICEURL_DEFAULTZONE
๐ ์์
# ๋ก์ปฌ pc์์ ์๋น์ค ์คํ ์ (eureka, gateway)
# application.yml
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
↓
# ๋์ปค์ฐ๋ฉด ์๋น์ค ๋ค์์ผ๋ก ์ปจํ
์ด๋ ๊ฐ ํต์
# docker-compose.yml
environment:
- EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka/
๐ 7. ์ค์ต: MSA ๊ณตํต ์ธํ๋ผ ์๋ ์คํ
๊ธฐ์กด ์กด์ฌํ๋ MSA ํ๋ก์ ํธ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ธํ๋ผ๋ฅผ ์ปจํ ์ด๋ ์์ ์ ๊ฐ์ด ์คํ๋๊ฒ ํ๋ ค๊ณ ํ๋ค!
- eureka-server์ api-gateway๋ ๊ณตํต ์ธํ๋ผ๋ ๋ณ๊ฒฝ์ด ์ ๊ณ , ํญ์ ๋จผ์ ์คํ๋์ด์ผ ํ๋ค.
- ์ปจํ ์ด๋๋ก ๊ณ ์ ์คํํ์ฌ ์์ ์ ์ผ๋ก ์๋น์ค ์์กด์ฑ ์์ ๋ณด์ฅ (eureka → gateway → ์๋น์ค)ํ๊ณ ์ ํ๋ค.
- ๋น์ฆ๋์ค ์๋น์ค(order, product ๋ฑ)๋ ๊ฐ๋ณ๋ก ์๋ ์คํ
โ 7-1. Compose.yml ์์ (๋๋จธ์ง ๋ถ๋ถ์ 3๋ฒ ์์ ์ฐธ๊ณ !)
- ํฌํธ ๋งคํ
- Healthcheck๊ณผ depends_on์ผ๋ก ์คํ ์์ ์ ์ด. (์์กด์ฑ ๊ด๋ฆฌ)
- Environment๋ก ํ๊ฒฝ๋ณ์ ์ค์
- Profile ์ค์
# =====================
# ์๋ ์์ MSA
# =====================
eureka-server:
build: ./eureka
container_name: eureka-server
ports:
- "8761:8761"
depends_on: # ๋ฆฌ์คํธ ๋ฐฉ์ (์์์. ์๋ ์์กด์ฑ ํ์์๋ค)
- mariadb
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8761/actuator/health"]
interval: 5s
retries: 10
api-gateway:
build: ./gateway
container_name: api-gateway
ports:
- "8080:8080"
Depends_on: # ๊ฐ์ฒด ๋ฐฉ์
mariadb:
condition: service_started
eureka-server:
condition: service_healthy
environment:
- EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka/
# healthcheck:
# test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
# interval: 5s
# retries: 10
# =====================
# ๋ค๋ฅธ ์๋น์ค (์๋ ์คํ)
# =====================
order-service:
build: ./order-service
container_name: order-service
profiles: ["optional"]
ports:
- "8085:8080"
depends_on:
eureka-server:
condition: service_healthy
environment:
- EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka/
product-service:
build: ./product-service
container_name: product-service
profiles: ["optional"]
ports:
- "8083:8080"
depends_on:
eureka-server:
condition: service_healthy
environment:
- EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka/โ
โ 7-2. JAR ํ์ผ ์ค๋น
1๏ธโฃ Build.gradle
tasks.bootJar {
archiveFileName = 'gateway.jar' // JAR ์ด๋ฆ
destinationDirectory = file("$buildDir/target") // ๊ฒฝ๋ก
}
2๏ธโฃ \gradlew bootJar ์ํ
3๏ธโฃ build/target/{}.jar ํ์ผ ์์ฑ ํ์ธ.
โ 7-3. ๋์ปค ์ด๋ฏธ์ง ์ค๋น
๊ฐ ์๋น์ค(ํด๋) ์์ Dockerfile ํ์
- Dockerfile (eureka)
FROM eclipse-temurin:17-jdk # jdk๋ฒ์ ์ ์ (์ ํจ๋ฒ์ ๊ฒ์)
COPY build/target/eureka-server.jar /app.jar # ์ค์ jar ์์น
ENTRYPOINT ["java", "-jar", "/app.jar"]
โ 7-4. docker-compose up ์คํ ์ต์
๐น ๊ธฐ๋ณธ ์คํ
profile ์์ฑ์ด ์๋ ์๋น์ค ์ ์ฒด ์คํ
docker-compose up -d
๐น profile ํฌํจ ์คํ
profiles: ["optional"] ์์ฑ ํฌํจ ์ ์ฒด ์๋น์ค ์คํ
*๋น์ฆ๋์ค ์๋น์ค ๊ฐ๋ฐ ์์๋ ๋ก์ปฌPC IDE์์ ์คํ, ์ด์์์๋ ์ปจํ ์ด๋์์ ์คํ ๊ฐ๋ฅ!!
docker-compose --profile optional up -d
๐น๊ฐ๋ณ ์๋น์ค ์คํ
Profiles์ฌ๋ถ์ ์๊ด์์ด ๊ฐ๋ณ๋ก ์คํ๊ฐ๋ฅ.
docker-compose up -d order-service
์ฌ๋ฌ๊ฐ ์ ํ ์คํ๋ ๊ฐ๋ฅ.
docker-compose up -d eureka-server api-gateway mariadb redis
1๏ธโฃ ์คํ๋ง๋ถํธ Jar ํ์ผ ์ง์ ์คํ (Dockerfile ์์ด)
- ์ด๋ฏธ ๋น๋๋ jar ํ์ผ์ด ์๋ค๋ฉด image: + command:๋ก ๋ฐ๋ก ์ปจํ ์ด๋ ์คํ ๊ฐ๋ฅ
api-gateway:
image: openjdk:17
container_name: api-gateway
ports:
- "8080:8080"
volumes:
- ./api-gateway/target:/app
working_dir: /app
command: ["java", "-jar", "api-gateway.jar"]
depends_on:
- eureka-server
โ ./api-gateway/target/api-gateway.jar ๊ฒฝ๋ก์ ์ค์ jar ํ์ผ ์์ด์ผ ํจ
โ Dockerfile ์์ด๋ ์ปจํ ์ด๋์์ ์คํ ๊ฐ๋ฅ
๐น ํ์ธ

# ์ปจํ
์ด๋ ์ํ ํ์ธ
docker ps
# Eureka ์๋ฒ๊ฐ ์ ์ ๊ตฌ๋๋๋์ง ํ์ธ
docker logs eureka-server
# Gateway ์ ์ ๊ตฌ๋ ํ์ธ
docker logs api-gateway
'tool' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Eclipse์์ JDK ๋ฒ์ ์ค์ ๋ฐฉ๋ฒ (0) | 2025.12.18 |
|---|---|
| Ngrok์ด๋? (0) | 2025.11.29 |
| ์๋์ฐ ๊ณ์ ์ ๊ธ ํด์ / ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ (0) | 2025.11.20 |
| vscode ๋จ์ถํค (0) | 2021.10.04 |