Docker Compose : ๋ ๊ฐ ์ด์์ ๋์ปค ์ด๋ฏธ์ง ๋น๋ / ์ปจํ ์ด๋ ๊ตฌ๋
Docker Compose
๋ชฉ์ : Docker Compose๋ฅผ ํตํ Spring Boot + Database(MySQL) ๋์ ๊ตฌ๋
์ด๋ฒ ์ฑํฐ์์ Docker Compose๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์งํํ๋ Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋์์ ๊ตฌ๋ํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ทธ ๊ณผ์ ์ ๋ํด ์์๋ณด์. Docker Compose๋ฅผ ํตํด ์ฌ๋ฌ ๊ฐ์ Docker ์ปจํ ์ด๋๋ฅผ ์์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
- DockerFile: ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ (์ด๋ฏธ์ง)์ ์ ์ํ๊ณ ๋น๋ํ ๋ ์ฌ์ฉํ๋ค.
- Docker Compose: ๋ ์ด์์ ์ ํ๋ฆฌ์ผ์ด์ (์ด๋ฏธ์ง)์ ์ ์ํ๊ณ ํจ๊ป ์คํํ ๋ ์ฌ์ฉํ๋ค. ๊ฐ ์ปจํ ์ด๋ ๊ฐ์ ๋คํธ์ํฌ ์ค์ ๋ฐ ํ๊ฒฝ ๋ณ์ ์ค์ ์ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
Docker Compose ํ์ผ(docker-compose.yml ์์ฑ)
`docker-compose.yml` ํ์ผ์ ์์ฑํ๊ณ , Spring boot์ MySQL ์ปจํ ์ด๋๋ฅผ ์ ์ํ๋ค.
version: "3"
services:
mysql_container_service:
container_name: mysql_container
hostname: mysql_host
image: mysql:8
# image: postgres:15
# restart: always
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_USER: "asac"
MYSQL_PASSWORD: "1234"
MYSQL_DATABASE: "example"
# POSTGRES_USER: "asac"
# POSTGRES_PASSWORD: "1234"
# POSTGRES_DB: "example"
ports:
- 4000:3306
# - 6000:5432
spring_container_service:
container_name: spring_container
build: .
ports:
- 1000:8080
environment:
SPRING_PROFILE: develop
depends_on:
- mysql_container_service
`docker-compose.yml` ๊ฐ ์ต์ ์ค๋ช
- `services`: mysql_container_service์ spring_container_service ๋ ๊ฐ์ง ์๋น์ค๋ฅผ ์ ์ → ๋จ์ ์ต์ ๊ตฌ๋ถ
- `container_name`: ์์ฑ๋ ์ปจํ ์ด๋์ ์ด๋ฆ์ ์ง์ → ๋ช ์ํ์ง ์์ผ๋ฉด ์๋ ์์ฑ๋ ๊ฒ์ผ๋ก ์ฌ์ฉ
- `hostname`:
- Docker ๋ด๋ถ ๋คํธ์ํฌ์์ mysql_host๋ผ๋ ํธ์คํธ๋ช ์ผ๋ก ๋ค๋ฅธ ์ปจํ ์ด๋๊ฐ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก Bridge ๋คํธ์ํฌ ์ต์ ์ ์ฌ์ฉํ์ฌ Docker ์์ง ๋ด์์ ์ฌ๋ฌ ์ปจํ ์ด๋๊ฐ ํต์ ํ ์ ์๊ฒ ์ค์ ํ๋ค.
- `image`: Dockerfile์ ํตํ ๋์ปค ์ด๋ฏธ์ง ์์ฑ ์์ด ๋ฐ๋ก ์คํํ๊ณ ์ถ์ ๊ฒฝ์ฐ, ๋ฒ ์ด์ค ์ด๋ฏธ์ง ๋ช ์๊ฐ ํ์ํ๋ค.
- `build`: Dockerfile์ ํตํ ๋์ปค ์ด๋ฏธ์ง ์์ฑ ํ ์คํํ๊ณ ์ถ์ ๊ฒฝ์ฐ
- `ports`: {ํธ์คํธ์์ ์ฌ์ฉํ (ํธ์คํธ์์ ๋
ธ์ถํ ) ํฌํธ} : {๋์ปค ๋ด ์ปจํ
์ด๋ ๊ฐ ํต์ ์ ํฌํธ}
- 4000:3306์ผ๋ก ์ค์ ํ์ฌ ํธ์คํธ์ 4000๋ฒ ํฌํธ๋ฅผ ์ปจํ ์ด๋์ 3306๋ฒ MySQL ํฌํธ์ ์ฐ๊ฒฐํ๋ค.
- ์ด๋ฅผ ํตํด ํธ์คํธ์์ localhost:4000์ผ๋ก MySQL์ ์ ๊ทผํ ์ ์๋ค.
- `environment`: ๋์ปค ์ด๋ฏธ์ง ์์ฑ ํน์ ์ด๋ฏธ์ง ์์ฑ ์์ด ๋ฐ๋ก ์ปจํ
์ด๋ ์คํ ์ ์ฌ์ฉํ ํ๊ฒฝ ๋ณ์
- SPRING_PROFILE=develop ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ์ฌ Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ๋ฐ ๋ชจ๋๋ก ์คํ๋๋๋ก ํ๋ค.
- `deponds_on`: ์ด๋ค ์ปจํ
์ด๋๊ฐ ๋จผ์ ๊ตฌ๋๋ ๋ค์์, ํด๋น ์ปจํ
์ด๋๊ฐ ๊ตฌ๋๋์ด์ผ ํ๋์ง ์์๋ฅผ ๋ช
์ํ๋ค.
- mysql_container_service๊ฐ ๋จผ์ ์์๋ ํ spring_container_service๊ฐ ๊ตฌ๋๋๋๋ก ์์ ์ง์
Docker Compose ํ๊ฒฝ ๋ณ์ ์ค์ ๋ฐฉ๋ฒ
- Compose ํ์ผ์ ์ง์ ์
๋ ฅ
- docker-compose.yml ํ์ผ ๋ด environment ์น์ ์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ง์ ์ ๋ ฅํ๋ค.
- ์ ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ
- export SPRING_PROFILE=develop ๋ฑ๊ณผ ๊ฐ์ด ์์์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ์ ์ฌ์ฉํ ์ ์๋ค.
- .env ํ์ผ ์ฌ์ฉ
- .env ํ์ผ์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ ์ํ๊ณ Docker Compose๊ฐ ์ด๋ฅผ ์๋์ผ๋ก ๋ถ๋ฌ์ฌ ์ ์๋ค.
`docker-compose.yml` ํ์ผ์ด ์ค์ ๋ก ๋์ํ๋ ๋ฐฉ์
- ๋ก์ปฌ(ํธ์คํธ)๊ณผ ๋์ปค ์์ญ ๋ ๊ฐ๋ฅผ ๊ตฌ๋ถํ์ฌ ๋์ํ
Java ์ฝ๋ ๋ณ๊ฒฝ ํ ์ฌ๋ฐฐํฌ
1. ์ JAR ํ์ผ ๋น๋
- Java ์ฝ๋ ๋ณ๊ฒฝ ํ JAR ํ์ผ์ ๋ค์ ๋น๋ํ๋ค.
./gradlew clean build
2. Docker Compose๋ก ์ปจํ ์ด๋ ์ฌ์์
- docker-compose up --build ์ต์ ์ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์๋ก ๋น๋ํ๊ณ , ๋ ์ปจํ ์ด๋๋ฅผ ๋์์ ์คํํ๋ค
docker compose up -d --build
3. ๊ฐ๋ณ ์ปจํ ์ด๋ ์ฌ์์ฑ
- ํน์ ์ปจํ ์ด๋๋ฅผ ์ญ์ ํ ์ฌ์์ฑํ๊ฑฐ๋ ์์กด์ฑ ์์ด ๊ฐ๋ณ ์ปจํ ์ด๋๋ง ์ฌ๊ตฌ๋
docker rm mysql_container
docker rm spring_container
docker compose up -d --force-recreate --build --no-deps spring_container
Docker Compose ์ฃผ์ ๋ช ๋ น์ด์ ์ต์
- `docker-compose up -d`: ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ชจ๋๋ก ์ปจํ
์ด๋ ์คํ
- ์คํ ํ๋ฆ: Creating → Created → Starting → Started
$ docker-compose up -d
Container mysql_container Creating
Container spring_container Creating
Container mysql_container Created
Container spring_container Created
Container mysql_container Starting
Container spring_container Starting
Container mysql_container Started
Container spring_container Started
์ต์ ์ค๋ช :
- `-d`: Detaced mode. ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ์ฌ ํฐ๋ฏธ๋์ ์ ์ ํ์ง ์๋๋ค.
- `--build`: ์ด๋ฏธ์ง ์บ์๋ฅผ ๋ฌด์ํ๊ณ ๊ฐ์ ๋ก ์๋ก ๋น๋
- ๋์ปค ์ด๋ฏธ์ง๋ ์ฌ๋ฌ ๋ ์ด์ด๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์บ์๋ฅผ ์ฌ์ฉํด ๋น๋ ์๋๋ฅผ ๋์ด์ง๋ง, ์ฝ๋๊ฐ ๋ฐ๋์์ ๋ ์บ์๋ ์ด๋ฏธ์ง๊ฐ ์ฌ์ฉ๋ ์ ์์ด ์ด ์ต์ ์ ํตํด ๊ฐ์ ๋ก ๋น๋ํ๋ค.
- `--force-recreate: ๊ธฐ๋ณธ ์ปจํ
์ด๋๋ฅผ ์ง์ฐ๊ณ ์๋ก ์์ฑํ์ง๋ง, ์ด๋ฏธ์ง๋ฅผ ์๋ก ๋น๋ํ๋ ๊ฒ์ ์๋๋ค.
- `--build`์ ํจ๊ป ์ฐ๋ฉด ์ด๋ฏธ์ง๋ฅผ ์๋ก ๋น๋ํ๊ณ ๊ทธ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํด ์ปจํ ์ด๋๋ฅผ ์์ฑํ๋ค.
- `--no-deps`: ์์กด์ฑ์ ๊ฐ์ง ์ปจํ
์ด๋๋ฅผ ์ฌ์์ํ์ง ์๊ณ ํ์ฌ ์ง์ ๋ ์ปจํ
์ด๋๋ง ์คํ.
- ์๋ฅผ ๋ค์ด, spring_conatiner๋ง ์ฌ๊ตฌ๋ํ๊ณ mysql_container๋ ์ฌ๊ตฌ๋ํ์ง ์๋๋ก ํ ๋ ์ฌ์ฉํ๋ค.
์ปจํ ์ด๋ ์ํ ํ์ธ
- Docker Compose ์ํ ํ์ธ:
docker compose ps
- Docker ์ํ ํ์ธ:
docker ps
Docker Compose๋ก ๊ตฌ๋ํ ์ปจํ ์ด๋ ๊ฐ ํต์
๊ธฐ๋ณธ์ ์ผ๋ก Docker Compose๋ก ์คํํ ์ปจํ ์ด๋๋ค์ ๊ฐ์ ๋คํธ์ํฌ ๋ด์์ ์๋์ผ๋ก ํต์ ์ด ๊ฐ๋ฅํ์ง๋ง, docker run์ผ๋ก ๊ฐ๋ณ ์คํํ ์ปจํ ์ด๋ ๊ฐ ํต์ ์ ๋ณ๋์ ๋คํธ์ํฌ ์ค์ ์ด ํ์ํ๋ค.
1. ๋คํธ์ํฌ ์์ฑ ํ ์ปจํ ์ด๋๋ฅผ ์ฐ๊ฒฐํ๋ค.
- `docker network create mynetwork`๋ฅผ ํตํด `mynetwork`๋ผ๋ ๋คํธ์ํฌ๋ฅผ ์์ฑํ๋ค.
- ์ญ์ ๋ `docker network rm mynetwork`
- โ ๏ธ ์ญ์ ์ ์ฃผ์์ฌํญ: ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋ ์ปจํ
์ด๋๊ฐ ์์ผ๋ฉด ์ญ์ ๋์ง ์์ผ๋ฏ๋ก, ๋จผ์ ํด๋น ๋คํธ์ํฌ์์ ๋ชจ๋ ์ปจํ
์ด๋๋ฅผ ๋ถ๋ฆฌํด์ผ ํ๋ค.
- ๋ถ๋ฆฌ ๋ช ๋ น์ด: `docker network disconnect mynetwork container1`
docker network create mynetwork
docker network connect mynetwork container1
docker network connect mynetwork container2
2. ์ปจํ ์ด๋ ๊ฐ ํ ํ ์คํธ:
docker exec -ti container1 ping container2
3. ๋คํธ์ํฌ ์ฐ๊ฒฐ ํด์ (์ปจํ ์ด๋ ๋คํธ์ํฌ ๋ถ๋ฆฌ)
docker network disconnect mynetwork container1
4. ๋คํธ์ํฌ ์ญ์
docker network rm mynetwork
์ปจํ ์ด๋ ๋คํธ์ํฌ ์ค์ ๋ฐฉ์
1. User-defined Bridge: ๋ธ๋ฆฟ์ง ๋คํธ์ํฌ๋ฅผ ์ ์ํด ์ฌ๋ฌ ์ปจํ ์ด๋๊ฐ ๋์ผ ์ปจํ ์ด๋ ๋ด์์ ํต์ ํ๋๋ก ์ค์ ํ๋ค.
networks:
x-network:
driver: bridge
2. Hostname ๋ฐฉ์: ๊ฐ ์ปจํ ์ด๋์ ๋ช ์์ ์ผ๋ก hostname์ ์ค์ ํ์ฌ ๊ฐํธํ๊ฒ ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.
version: "3"
services:
postgres:
container_name: postgres_host
hostname: postgres_host
image: postgres:15
๋ชจ๋ ์ปจํ ์ด๋ ์ข ๋ฃ
- ํ ์คํธ๊ฐ ๋ค ๋๋ฌ๋ค๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด Docker Compose๋ก ๋์ด ๋ชจ๋ ์ปจํ ์ด๋๋ฅผ ์ข ๋ฃํด์ผ ํ๋ค.
- Docker Compose๋ก ๊ตฌ๋ํ ๋ชจ๋ ์ปจํ
์ด๋๋ฅผ ์ข
๋ฃํ์ฌ ์์ ์ ์ ๋ฅผ ๋ฐฉ์งํด์ผ ํ๋ค.
- CPU์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ง์ด ํผ.
docker compose stop
+) ์ปจํ ์ด๋ ๋ก๊ทธ ํ์ธ
- Docker logs ๋ช ๋ น์ด๋ก ์ปจํ ์ด๋ ๋ก๊ทธ ํ์ธ:
docker logs [container_name]
- ์ปจํ ์ด๋๊ฐ ์ ๊ฑฐ๋๋ฉด ๋ก๊ทธ๋ ํจ๊ป ์ญ์ ๋๊ธฐ ๋๋ฌธ์ ์ฅ๊ธฐ ๋ก๊ทธ๋ ์ธ๋ถ ์๋น์ค(Kibana ๋ฑ)์ ์ ์ฅํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
์ด๋ ๊ฒ ํด์ Spring Boot์ MySQL์ Docker๋ฅผ ํตํ์ฌ ๊ตฌ๋(Dockerize)ํ๊ณ , docker-compose๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ๋ฅผ ํ ๋ฒ์ ๊ตฌ๋ํ๋ ๋ฐฉ๋ฒ๊น์ง ๋ชจ๋ ์์๋ณด์๋ค.
โน๏ธ ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
'๐ปDEV-STUDY > Docker' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker] Dockerize #2 (5) | 2024.11.01 |
---|---|
[Docker] Dockerize #1 (0) | 2024.11.01 |
[Github Action & Docker]์๋: Github Action์ผ๋ก CI / CD ๋ชจ๋ ์๋ ์ฒ๋ฆฌ #3 (4) | 2024.10.29 |
[GitHub Action & Docker] CD: AWS EC2 ์์ฑ ํ ๋ด๋ถ ์ ์ ํ CI๋ก ๋ง๋ Docker ์ด๋ฏธ์ง ์คํ #2 (2) | 2024.10.29 |
[GitHub Action & Docker] ์๋: Github Action์ผ๋ก CI + ๊ฐ๋ฐ์๊ฐ ์ง์ CD #1 (3) | 2024.10.29 |