Docker Compose ๋?
- ์์ง๋ ฅ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ํจ๊ป ์๋ํ๋ ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ค๋ ๋ก์ปฌ ๊ฐ๋ฐ ๋ฐ ํ ์คํธ ํ๊ฒฝ์ ์ํด ์ค๊ณ๋ ๋๊ตฌ
- docker compose yaml์ฝ๋๋ ์ฌ๋ฌ ๊ฐ์ docker run ์คํ๊ณผ ์ ์ฌํ๋ฉฐ ๋คํธ์ํฌ, ๋ณผ๋ฅจ ๋ฑ์ ํ๋ฒ์ ์์ฑํ ์ ์๋ค.
- docker compose๋ก ์์ฑ๋ ์ปจํ ์ด๋๋ค์ ๋ ๋ฆฝ๋ ๋คํธ์ํฌ๋ก ๊ตฌ์ฑ๋๋ฏ๋ก ์ปจํ ์ด๋ ๊ฐ ํต์ ์ด ์ฝ๋ค.
- Docker file ์์ฑ -> docker-compose.yml ์์ฑ -> docker compose up
- ์ฅ์
- ์๋ก ๋ค๋ฅธ OSํ๊ฒฝ์ด๋ผ๋ ๋์ผํ ํ๊ฒฝ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ค.
- ๋์ผํ ํ๊ฒฝ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐํ๊ฒฝ์ ์ด์๊ฐ ๋ฐ์ํด๋ ํ๊ฐ ์ํต์ด ์ฝ๋ค.
- ๋ณต์กํ ํ๊ฒฝ๋ YAML ์ฝ๋๋ก ์คํฌ๋ฆฝํธํ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ํ๊ฐ ๊ฐ๋ฅํ๋ค.
- docker compose CLI๋ฅผ ์ด์ฉํ์ฌ ์ฝ๊ฒ "๋ฉํฐ ์ปจํ ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ "์ ๊ด๋ฆฌํ ์ ์๋ค.
- ๋จ์
- ๋์์ ๋ค์์ ์ปจํ ์ด๋ ์๋น์ค๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ ์์ ํ์ฉ๋ฅ ์ด ์๊ฐ ๋์์ง ์ ์๋ค.
Docker compose ์ Kubernetes์ ์ฐจ์ด

Docker compose ํน์ง
- docker compose๋ ์ฌ๋ฌ ๋ฒ์ docker cli๋ฅผ ์คํํ์ง ์๊ณ , ํ๋ฒ์ ๊ด๋ จ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ YAMLํ์ผ๋ก ๊ตฌ์ฑํ์ฌ ๋ด๋ถ ํ๊ฒฝ ๊ตฌ์ฑ๊ณผ ์์ฑ์ ์คํํ ์ ์๋ค.
- ์ค์ ๊ฐ์ ์บ์ฑํ๊ธฐ ๋๋ฌธ์ ์ฌ์์ ์ ๋ณ๊ฒฝ์ด ์๋ค๋ฉด ์บ์ฑ๋ ์ ๋ณด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ฌ ๋น ๋ฅธ ์๋น์ค ์คํ์ ๋ณด์ฅํ ์ ์๋ค.
- YAML ์ฝ๋์ ํฌํจ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ ๋์ผ ๋คํธ์ํฌ์ ํฌํจ๋๊ธฐ ๋๋ฌธ์ ๋ณต์กํ ์ฐ๊ฒฐ ๊ตฌ์ฑ ์์ด๋ ์ฝ๊ฒ API ํต์ ์ด ๊ฐ๋ฅํ๋ค.
์์ฃผ ์ฐ๋ Docker compose ๋ฌธ๋ฒ
build
mydiary-front:
build:
context: ./my-diary-front #Dockerfile ์์น (๋์ผ ๊ฒฝ๋ก๋ฉด ์๋ต ๊ฐ๋ฅ)
dockerfile: Dockerfile #์ ๊ณตํ๋ Dockerfile ์ด๋ฆ
container_name
- ์๋ต ์ ์๋์ผ๋ก ๋ถ์ฌ, "๋๋ ํ ๋ฆฌ๋ช _์๋น์ค๋ช _n"
- docker run์ --name ์ต์ ๊ณผ ๋์ผ
ports
- ์๋น์ค ๋ด๋ถ ํฌํธ์ ์ธ๋ถ ํธ์คํธ ํฌํธ๋ฅผ ์ง์ ํ์ฌ ๋ฐ์ธ๋. ์ธ๋ถ ๋ ธ์ถ ํฌํธ ์ง์
- docker run์ -p ์ต์ ๊ณผ ๋์ผ
networks
- ์ต์์ ๋ ๋ฒจ์ networks์ ์ ์๋ ๋คํธ์ํฌ ์ด๋ฆ์ ์์ฑ
- docker run์ --net(--network) ์ต์ ๊ณผ ๋์ผ
volumes
- ์๋น์ค ๋ด๋ถ ๋๋ ํ ๋ฆฌ์ ํธ์คํธ ๋๋ ํ ๋ฆฌ๋ฅผ ์ฐ๊ฒฐํ์ฌ ๋ฐ์ดํฐ ์ง์์ฑ ์ค์ .
- docker run์ -v
environment
- ์๋น์ค ๋ด๋ถ ํ๊ฒฝ ๋ณ์ ์ค์
- ํ๊ฒฝ ๋ณ์๊ฐ ๋ง์ ๊ฒฝ์ฐ, ํ์ผ (.env)๋ก ๋ง๋ค์ด ์ง์ (env_file: ./envfile.env)
command
- ์๋น์ค๊ฐ ๊ตฌ๋ ์ดํ ์คํํ ๋ช ๋ น์ด ์์ฑ
- docker run์ ๋ง์ง๋ง์ ์์ฑ๋๋ ๋ช ๋ น์ด
restart
- ์๋น์ค ์ฌ์์ ์ต์ ์ง์
- docker run์ --restart ์ต์ ๊ณผ ๋์ผ
depends_on
- ์๋น์ค ๊ฐ์ ์ข ์์ฑ์ ์๋ฏธ.
- ๋จผ์ ์คํํด์ผ ํ๋ ์๋น์ค๋ฅผ ์ง์ ํ์ฌ ์์ ์ง์
deploy.replicas
- ํด๋น ์๋น์ค์ ๋ณต์ ์ปจํ ์ด๋ ์ ์ง์
- replica๋ฅผ ์ฌ์ฉํ ๋ ์ปจํ ์ด๋ ์ด๋ฆ์ ์ง์ ํ๋ฉด ์ ๋๋ค. (์ ์ผํด์ผ ํ๊ธฐ ๋๋ฌธ)
์์1 Docker compose file [Nodejs+ Spring + MySQL + Nginx]

docker-compose.yml
version: '3.8'
services:
mydiary-db:
image: mysql:5.7-debian
container_name: rolling-db
environment:
MYSQL_ROOT_PASSWORD: pass123
MYSQL_DATABASE: paperdb
MYSQL_ROOT_HOST: '%'
MYSQL_USER: user
MYSQL_PASSWORD: user
ports:
- '3306:3306'
networks:
- mydiary-net
restart: always
command:
- --character-set-server=utf8
- --collation-server=utf8_general_ci
mydiary-back:
build:
context: ./my-diary-back
dockerfile: Dockerfile
deploy:
replicas: 3
restart: always
depends_on:
- mydiary-db
ports:
- '8081-8083:8080'
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://rolling-db:3306/paperdb?serverTimezone=Asia/Seoul
SPRING_DATASOURCE_USERNAME: user
SPRING_DATASOURCE_PASSWORD: user
networks:
- mydiary-net
mydiary-front:
build:
context: ./my-diary-front
dockerfile: Dockerfile
deploy:
replicas: 3
restart: always
depends_on:
- mydiary-back
ports:
- '3000-3002:3000'
networks:
- mydiary-net
proxy-be:
image: nginx:1.21.5-alpine
container_name: rolling-server-lb
restart: always
depends_on:
- mydiary-back
ports:
- '8080:80'
volumes:
- ${PWD}/proxy/nginx-be.conf:/etc/nginx/nginx.conf
networks:
- mydiary-net
proxy-fe:
image: nginx:1.21.5-alpine
container_name: rolling-front-lb
restart: always
ports:
- '80:80'
volumes:
- ${PWD}/proxy/nginx-fe.conf:/etc/nginx/nginx.conf
networks:
- mydiary-net
networks:
mydiary-net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.20.0.0/24
ip_range: 172.20.0.0/24
gateway: 172.20.0.1
Nginx backend conf
- ์์์ ์ค์ ํ ๋ฐฑ์๋ ์ปจํ ์ด๋ service name์ธ "mydiray-back" ์ ์ฌ์ฉํด์ผ ํ๋ค.
- ํ๋ก ํธ์์ ํธ๋ํฝ์ ์ ๋ฌ๋ฐ์ ๋ mydiary-back์๋ค ํ๋์ฉ ์ ๋ฌํ ์ ์๊ธฐ ๋.
events { worker_connections 1024; }
http{
upstream mydiary-back { # upstream์ ์ด๋ฆ์ rolling-server๋ก ์ค์
server mydiary-back:8081;
server mydiary-back:8082;
server mydiary-back:8083;
}
server {
listen *:8080 default_server; # ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ๋ ํฌํธ ๋ฒํธ
location / {
proxy_pass http://mydiary-back; # ์ค์ ํ upstream์ผ๋ก ์์ฒญ ๋ณด๋ด๊ธฐ
}
}
}
Nginx front conf
events { worker_connections 1024; }
http {
upstream front-servers {
server mydiary-front:3000;
server mydiary-front:3001;
server mydiary-front:3002;
}
server {
listen 80 default_server;
location / {
proxy_pass http://front-servers;
}
}
}
์์2 Docker compose file [Spring+ MariaDB + Redis]
MariaDB
- /database/Dockerfile
FROM mariadb:10
ENV TZ=Asia/Seoul
- /database/config/mariadb.cnf
[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
Redis
- /redis/Dockerfile
FROM redis:6
ENV TZ=Asia/Seoul
Spring
- ./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-compose.yml
- ./docker-compose.yml
version: "3.8" # ํ์ผ ๊ท๊ฒฉ ๋ฒ์
services: # ์ด ํญ๋ชฉ ๋ฐ์ ์คํํ๋ ค๋ ์ปจํ
์ด๋๋ค์ ์ ์
pharmacy-recommendation-redis: # ์๋น์ค๋ช
container_name: pharmacy-recommendation-redis # ์ปจํ
์ด๋ ๋ช
build:
dockerfile: Dockerfile
context: ./redis
image: dgjinsu/pharmacy-recommendation-redis
ports:
- "6380:6379"
pharmacy-recommendation-database:
container_name: pharmacy-recommendation-database
build:
dockerfile: Dockerfile
context: ./database
image: dgjinsu/pharmacy-recommendation-database
environment:
- MARIADB_DATABASE=pharmacy-recommendation
- MARIADB_ROOT_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
volumes:
- ./database/config:/etc/mysql/conf.d
- ./database/init:/docker-entrypoint-initdb.d
ports:
- "3307:3306" # ์ ๊ทผ ํฌํธ ์ค์ (์ปจํ
์ด๋ ์ธ๋ถ:์ปจํ
์ด๋ ๋ด๋ถ)
pharmacy-recommendation-app:
container_name: pharmacy-recommendation-app
build: .
depends_on: # DB, REDIS ์ปจํ
์ด๋๊ฐ ์คํ๋ ๋ค์ WEB์ ์คํ์ํจ๋ค.
- pharmacy-recommendation-database
- pharmacy-recommendation-redis
image: dgjinsu/pharmacy-recommendation-app
environment:
- SPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME}
- SPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
- SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}
- KAKAO_REST_API_KEY=${KAKAO_REST_API_KEY}
ports:
- "80:8080"
restart: always # depends on์ ์คํ ์์๋ง ์ปจํธ๋กค ํ ๋ฟ,
# ์ปจํ
์ด๋ ์์ ์๋น์ค๊ฐ ์คํ๊ฐ๋ฅํ ์ํ์ธ์ง๊น์ง๋ ํ์ธ ํ์ง ์๊ธฐ ๋๋ฌธ์
# DB ๋๋ Redis๊ฐ ์์ง ์คํ๊ฐ๋ฅํ ์ํ๊ฐ ์๋์ฌ์ ์คํจํ๋ ๊ฒฝ์ฐ ์ฌ์์ ํ๋๋ก ์ค์