Docker compose에 관하여..

이유성·2025년 2월 6일
post-thumbnail

docker compose란?

여러개의 Docker Container들을 하나의 서비스로 정의하고 구성해 하나의 묶음으로 관리할 수 있게 도와주는 툴이다.
이를 활용하면 여러개의 컨테이너를 동시에 관리할 수 있읍니다..

사용 방법

Docker CLI로 컨테이너를 실행시킬 때

$ docker run -d -p 8080:8080 --name web_server nginxx

Docker Compose로 컨테이너를 실행시킬 때
1. compose.yml 작성

services: #Docker compose에서 하나의 컨테이너를 service라고 한다 
	my_nginx_service: # 이 옵션은 서비스에 이름 붙이는 것임
    	container_name: web_server #container 이름
        image: nginx #container를 실행시킬 때 어떤 이미지를 사용할지
        ports: #포트매핑 설정
        	- 8080:8080
  1. compose 파일 실행
$ docker compose up -d
  1. compose 실행 현황 보기
$ docker compose ps
$ docker ps
  1. compose로 실행된 컨테이너 종료 및 삭제
$ docker compose down

[실습] springboot, mysql, redis 컨테이너 동시에 띄어보기

  • setting
    - jdk 17
    - Dependecies : SpringBoot DevTools, Spring Web, Spring Data JPA, MySQL Driver

순서

1. 간단한 springboot project 생성

localhost:8080 접속 시 hello, world 출력하는 프로젝트 생성!

2. application.yml에 DB, ridis 연결을 위한 정보 작성

spring:
  datasource:
    url: jdbc:mysql://my-db:3306/mydb
    username: root
    password: pwd1234
    driver-class-name: com.mysql.cj.jdbc.Driver
  data:
    redis:
      host: my-cache-server
      port: 6379
TroubleShooting
 $ ./gradlew clean build
  • test 코드 있는 거 삭제하거나 제대로 작성해야 에러가 안납니다.(삭제하는 거 추천)

    (jar 파일 위치, ./gradlew clean build 하면 생김)
  • docker compose를 활용하여 MySql, SpringBoot, Redis를 컨테이너로 올리면 위 사진처럼 구성도를 그릴 수 있습니다. 위에서 작성한 application.yml 파일은 spring boot가 올라간 컨테이너 안에 있는 파일입니다. 즉, 저 컨테이너의 3306, 6379번 포트는 springboot가 올라간 서버의 localhost가 아니게 되는 거다!
    이를 위해 docker compose가 기능을 만들어뒀다
    compose.yml에서 정의한 service의 이름으로 통신할 수 있는 기능이다.
    즉, url: jdbc:mysql://my-db:3306/mydb 이 부분에서 my-db가 들어가고
3. Dockerfile 작성

FROM openjdk:17-jdk
COPY ./build/libs/spring_docker-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
4. compose.yml 작성

services:
  my-server:
    build: .
    ports:
      - 8080:8080
    depends_on:
      my-db:
        condition: service_healthy
      my-cache-server:
        condition: service_healthy
  my-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: pwd1234
      MYSQL_DATABASE: mydb
    volumes:
      - ./mysql_data:/var/lib/mysql
    ports:
      - 3306:3306
    healthcheck:
      test: [ "CMD", "mysqladmin", "ping" ]
      interval: 5s
      retries: 10
  my-cache-server:
    image: redis
    ports:
      - 6379:6379
    healthcheck:
      test: [ "CMD", "redis-cli", "ping" ]
      interval: 5s
      retries: 10
5. 프로젝트 build && Docker compose 실행
$ ./gradlew clean build
$ docker compose up -d --build
  • --build : compose.yml에 정의된 모든 서비스의 이미지를 강제로 다시 빌드시키는 옵션이다.

profile
Cloud Engineer

0개의 댓글