IT지식/도커(Docker) 사용법

20.도커(Docker)로 SpringBoot, MySQL, Redis 동시에 띄우기

맨땅에헤딩개발자 2025. 2. 15. 17:16

오늘은 여태 배웠던 모든 지식을 활용하여 

SpringBoot, MySQL, Redis를 묶어 하나의 서비스로 정의하고 실행시켜보겠습니다.

 

우선 Redis사용을 위해 build.gradle파일에 의존성 추가를 해주도록 하겠습니다.

dependencies부분에 아래와 같은 코드를 삽입해주세요.

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

저장 후 꼭 우측 동그라미(Sync Gradle Change)를 클릭해야 의존성 주입한게 적용됩니다.

 

다음은 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

 

위 코드를 잠깐 해석해드리자면

우선 depends_on이라는 구문이 보이실겁니다.

이 구문은 컨테이너가 실행되기 전에 선행되어야 할 내용들을 입력하는 구문입니다.

즉, spring이 실행되기 전에 db와 redis가 실행되어야 spring에서 제대로 인식하여 동작할 수 있습니다.

 

 

다음은 spring과 db, redis를 연결할 수 있는 yml파일을 만들어주도록 하겠습니다.

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

 

그리고 Redis를 연결해주는 config파일을 생성하도록 하겠습니다

위 config파일에서 localhost에 저렇게 name을 지정해 준 이유는

각 컨테이너는 각자의 네트워크를 가지고 있기 때문에, localhost가 아닌 Redis가 실행되고 있는 컨테이너와 통신을 해야합니다. 컨테이너의 주소는 service이름으로 표현한다고 하였기때문에 redis의 컨테이너 주소인 service명을 입력해줌.

@Configuration
public class RedisConfig {

  @Bean
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(connectionFactory);
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    return template;
  }
}

 

마지막으로 spring이 실행되었을 때 실행할 파일을 만들어주도록 하겠습니다.

@RestController
public class AppController {

  @Autowired
  private RedisTemplate<String, Object> redisTemplate;

  @GetMapping("/")
  public String home() {
    redisTemplate.opsForValue().set("abc", "def");
    return "Hello, World!";
  }
}

 

 

아참! 현재 test폴더 하위에있는 DemoApplicationTests.java파일이 존재하는데

이 파일은 가끔 충돌을 일으킬 수 있는 가능성이 있어 삭제하도록 하겠습니다

 

이제 모든 준비는 완료되었습니다.

만들어진 compose.yml파일을 기반으로 springboot,mysql,redis를 실행시켜보도록 하겠습니다.

 

우선 terminal이나 shell을 여셔서

./gradlew clean build를 입력하여 springboot프로젝트를 빌드시켜줍니다.

이후 compose파일을 실행시켜줍니다

docker compose up --build -d

 

하려는데 문제가 똬악!

에러를 읽어보니 docker .io/library/openjdk-jdk 라는 것을 인지를 못하는 것이였다.

그렇다.. Dockerfile에 오타가 있었던 것이였다.

FROM openjdk-jdk -> FROM openjdk:17-jdk로 수정 후 다시 실행하였습니다.

한번 더 

docker compose up --build -d

docker ps -a

이번엔 제대로 실행된 것을 볼 수 있습니다.

 

 

 

 

 

출처 - 인프런 비전공자도 이해할 수 있는 Docker 입문/실전 중..

https://www.inflearn.com/course/%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90-docker-%EC%9E%85%EB%AC%B8-%EC%8B%A4%EC%A0%84

 

비전공자도 이해할 수 있는 Docker 입문/실전 강의 | JSCODE 박재성 - 인프런

JSCODE 박재성 | , 🤬 에라이, 못 해먹겠네!비전공자로 개발을 시작해 여러 회사에서 CTO로 활동하다가, 현재는 교육자로 활동하고 있는 박재성이라고 합니다. 저도 비전공자로 개발을 시작해 서버

www.inflearn.com