๐Ÿ“Œ Docker Compose ์™„์ „ ์ •๋ณต

My Pale Blue Dotยท2025๋…„ 6์›” 4์ผ
0

DOCKER

๋ชฉ๋ก ๋ณด๊ธฐ
5/8
post-thumbnail

๐Ÿ“… ๋‚ ์งœ

2025-06-04

๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ

1๏ธโƒฃ Docker Compose๋ž€?

โœ… ์ •์˜

Docker Compose๋Š” ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ •์˜ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” Docker์˜ ๊ณต์‹ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

docker-compose.yml ํŒŒ์ผ ํ•˜๋‚˜๋กœ ๋ชจ๋“  ์„œ๋น„์Šค ์ •์˜, ๋„คํŠธ์›Œํฌ, ๋ณผ๋ฅจ ๋“ฑ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


2๏ธโƒฃ Docker Compose๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

๊ธฐ์กด ๋ฐฉ์‹ ๋ฌธ์ œ์ Compose์˜ ํ•ด๊ฒฐ ๋ฐฉ์‹
์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ผ์ผ์ด docker run์œผ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•จ๋ชจ๋“  ์„ค์ •์„ yml ํŒŒ์ผ๋กœ ์„ ์–ธํ•˜๊ณ  ํ•œ ๋ฒˆ์— ์‹คํ–‰
๊ฐ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋„คํŠธ์›Œํฌ ์ˆ˜๋™ ์—ฐ๊ฒฐ ํ•„์š”๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋„คํŠธ์›Œํฌ์—์„œ ์ž๋™ ์—ฐ๊ฒฐ
์„œ๋น„์Šค๋ณ„ ํ™˜๊ฒฝ๋ณ€์ˆ˜, ํฌํŠธ, ๋ณผ๋ฅจ ๋“ฑ ์„ค์ • ๋ฐ˜๋ณต์„ ์–ธ์  ๊ตฌ์„ฑ์œผ๋กœ ์žฌ์‚ฌ์šฉ์„ฑ ํ™•๋ณด
๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ์–ด๋ ค์›€up, down ๋ช…๋ น์œผ๋กœ ์ „์ฒด ์ œ์–ด ๊ฐ€๋Šฅ

3๏ธโƒฃ Docker Compose ๊ตฌ์กฐ

Docker Compose๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค:

๊ตฌ์„ฑ ์š”์†Œ์„ค๋ช…
services์‹คํ–‰ํ•  ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ๋ฐ ์„ค์ • (์˜ˆ: web, db ๋“ฑ)
networks์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ
volumes๋ฐ์ดํ„ฐ ์˜์†์„ฑ์„ ์œ„ํ•œ ์ €์žฅ์†Œ ๊ตฌ์„ฑ

๋ชจ๋“  ์„ค์ •์€ docker-compose.yml ํŒŒ์ผ์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.


4๏ธโƒฃ ์ฃผ์š” ์„ค์ • ํ•ญ๋ชฉ

ํ•ญ๋ชฉ์„ค๋ช…
image์‚ฌ์šฉํ•  ๋„์ปค ์ด๋ฏธ์ง€
buildDockerfile ์œ„์น˜
container_name์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ ์ง€์ •
portsํ˜ธ์ŠคํŠธ โ†” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ ๋งคํ•‘
volumesํ˜ธ์ŠคํŠธ โ†” ์ปจํ…Œ์ด๋„ˆ ๋””๋ ‰ํ† ๋ฆฌ ๋งคํ•‘
depends_on์˜์กด ๊ด€๊ณ„ ์ง€์ • (ex: web โ†’ db)
environmentํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
networks์‚ฌ์šฉํ•  ๋„คํŠธ์›Œํฌ ์ง€์ •
restart์ž๋™ ์žฌ์‹œ์ž‘ ์ •์ฑ… ์„ค์ • (ex: always, on-failure)

5๏ธโƒฃ Compose ์‹คํ–‰ ํ๋ฆ„ ์š”์•ฝ

โœ… ์ž‘์„ฑ

  • docker-compose.yml ํŒŒ์ผ ์ž‘์„ฑ
  • ํ•˜๋‚˜ ์ด์ƒ์˜ ์„œ๋น„์Šค ์ •์˜ (์˜ˆ: ์›น + DB ๋“ฑ)

โœ… ๋นŒ๋“œ / ์‹คํ–‰

docker images       # ๋กœ์ปฌ ์ด๋ฏธ์ง€ ํ™•์ธ
docker ps -a        # ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ
docker-compose up --build -d

--build: ํ•„์š” ์‹œ ์ด๋ฏธ์ง€ ์žฌ๋นŒ๋“œ
-d: ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ชจ๋“œ ์‹คํ–‰

โœ… ์ƒํƒœ ํ™•์ธ

docker ps           # ์‹คํ–‰ ์ค‘ ์ปจํ…Œ์ด๋„ˆ ํ™•์ธ
docker-compose logs

โœ… ์ข…๋ฃŒ ๋ฐ ์ •๋ฆฌ

Ctrl + C            # ์‹คํ–‰ ์ค‘์ธ ํฌ๊ทธ๋ผ์šด๋“œ ์ค‘์ง€
docker-compose down # ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๋ฐ ๋„คํŠธ์›Œํฌ ์ •๋ฆฌ

โš ๏ธ down -v ์‚ฌ์šฉ ์‹œ ๋ณผ๋ฅจ๊นŒ์ง€ ์‚ญ์ œ๋˜๋ฏ€๋กœ DB ๋ฐ์ดํ„ฐ ์ฃผ์˜


6๏ธโƒฃ Healthcheck ์„ค์ •

โœ… ์™œ ํ•„์š”ํ•œ๊ฐ€?

  • ๋‹จ์ˆœํ•œ depends_on์€ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰๋งŒ ํ™•์ธ, ์‹ค์ œ ์„œ๋น„์Šค๊ฐ€ ์ค€๋น„๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ๋ถˆ๊ฐ€
  • healthcheck๋กœ ์„œ๋น„์Šค ์ค€๋น„ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ์˜์กด ์ปจํ…Œ์ด๋„ˆ์˜ ์•ˆ์ •์„ฑ ๋ณด์žฅ ๊ฐ€๋Šฅ

โœ… ์˜ˆ์‹œ

MySQL

healthcheck:
  test: [ "CMD", "mysqladmin", "ping", "-h", "127.0.0.1" ]
  interval: 30s
  timeout: 10s
  retries: 5

Redis

healthcheck:
  test: [ "CMD", "redis-cli", "ping" ]
  interval: 30s
  timeout: 10s
  retries: 5

7๏ธโƒฃ ๋ณผ๋ฅจ ์„ค์ •์˜ ์ค‘์š”์„ฑ

โœ… ์ด์œ 

  • ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—๋งŒ ๋ฐ์ดํ„ฐ ์ €์žฅ ์‹œ docker-compose down์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด DB ๋ฐ์ดํ„ฐ๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋จ
  • volumes๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋ฐ์ดํ„ฐ๋Š” ํ˜ธ์ŠคํŠธ์— ๋ณด์กด๋˜๋ฏ€๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์œ ์ง€ ๊ฐ€๋Šฅ

โœ… ์˜ˆ์‹œ

volumes:
  db-data:

services:
  db:
    volumes:
      - db-data:/var/lib/mysql

โš ๏ธ docker-compose down -v๋Š” ๋ณผ๋ฅจ๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋˜๋ฏ€๋กœ ์ฃผ์˜!


8๏ธโƒฃ ์˜ˆ์‹œ docker-compose.yml ํŒŒ์ผ

version: '3.8'

networks:
  custom-network:
    driver: bridge

services:
  fn:
    image: fn
    build:
      context: ./FN
    container_name: fn-container
    ports:
      - "3000:80"
    depends_on:
      - bn
    networks:
      - custom-network

  bn:
    image: bn
    build:
      context: ./BN
    container_name: bn-container
    ports:
      - "8090:8090"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://db-container:3306/bookdb
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: Zhfldk11!
      SPRING_REDIS_HOST: redis
      SERVER_PORT: 8090
    depends_on:
      db:
        condition: service_healthy
    networks:
      - custom-network

  db:
    image: db
    build:
      context: ./DB
      dockerfile: Dockerfile
    container_name: db-container
    networks:
      custom-network:
    ports:
      - "3330:3306"
    healthcheck:
      test: [ "CMD", "mysqladmin", "ping", "-h", "127.0.0.1" ]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - db-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: Zhfldk11!
      MYSQL_DATABASE: bookdb
      MYSQL_USER: dbconn
      MYSQL_PASSWORD: Zhfldk11!
      MYSQL_ROOT_HOST: '%'
    deploy:
      resources:
        limits:
          memory: 1024M

  redis:
    image: redis
    build:
      context: ./REDIS
    container_name: redis-container
    ports:
      - "6379:6379"
    networks:
      - custom-network

volumes:
  db-data:

๐Ÿ”ฅ ์ •๋ฆฌ

  • Docker Compose๋Š” ๋ณต์žกํ•œ ๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์„ฑ์„ ํ•˜๋‚˜์˜ ์„ค์ • ํŒŒ์ผ๋กœ ์„ ์–ธํ•˜๊ณ  ํ†ตํ•ฉ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ
  • healthcheck, volumes, depends_on ๋“ฑ์„ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ํ™˜๊ฒฝ ๊ตฌ์ถ• ๊ฐ€๋Šฅ
  • ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ๊นŒ์ง€ ์ผ๊ด€๋œ ๊ตฌ์„ฑ์œผ๋กœ ์žฌํ˜„์„ฑ ํ™•๋ณด

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ


profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€