Docker Compose Container Connection Fail

Jaeyoung·2023년 5월 5일
0
post-thumbnail

이번에 Docker Compose를 배포하기 위해 적용하다가 MySql하고 Redis Container가 정상적으로 구동이 되었지만 Spring Boot 어플리케이션과 서로 통신할 수 없는 상태가 되어 Spring Boot 어플리케이션을 실행할 수 없는 상황이 반복되었습니다. 이러한 문제를 겪고 있는 사람들에게 정보를 공유하고자 글을 작성하게 되었습니다.

처음에 사용했던 docker-compose file과 application.yml

version: '3.9'
services:
  mysql:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_DATABASE: mind_travel
      MYSQL_ROOT_PASSWORD: 1234
    ports:
      - "3306:3306"
    volumes:
      - db_data:/var/lib/mysql

  redis:
    image: redis:latest
    restart: always
    command: redis-server
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data

  app:
    build: .
    restart: always
    ports:
      - "8080:8080"
    depends_on:
      - mysql
      - redis

volumes:
  db_data:
  redis_data:
spring:
  datasource:
    url: jdbc:mysql://localhost/mind_travel
    username: root
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver
  messages:
    basename: fcm-messages
    encoding: UTF-8
  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
      format_sql: true
  profiles:
    include: oauth
logging.level:
  org.hibernate.SQL: debug

왜 삽질을 했을까?

일단 Docker 네트워크 부분에 대해 잘 알지 못해서 발생한 이슈였습니다. 기본적으로 Docker Compose를 실행하면 Docker Container는 별도의 가상 네트워크에서 동작하게 됩니다. 왜냐하면 이러한 가상 네트워크를 통해 컨테이너끼리 하나의 그룹으로 묶어 통신할 수 있기 때문입니다. 이러한 부분을 모르고 사용했기 때문에 해결하는데 많은 시간을 사용하게 되었습니다.

MySql 문제 접근법

  • 처음에는 MySql이 실행되지 않았을 것이라고 생각이 들어서 현재 실행되고 있는 Continer를 확인하였습니다. 하지만 Spring Boot 어플리케이션을 제외하고는 잘 작동하고 있었습니다. 그래서 해당 문제는 아니구나 하고 넘겼습니다.
  • 그 다음으로 생각한게 datasource url의 host이 잘못되었다고 판단이 되었습니다. 그래서 application.yml에 있는 host를 localhost가 아닌 docker-compose service이름으로 바꾸어 주었습니다. 하지만 정상적으로 연결될리가 없었죠
  • 그래서 도커 네트워크 관련해서 찾아보게 되었고 Docker Compose로 실행하면 별도로 가상 네트워크가 형성되어 컨테이너끼리 통신이 가능하다는 것을 알게 되어서 더 의문에 빠지게 되었습니다.
  • 좀 더 생각을 해보다가 생각을 해보니 application.yml에다가 설정을 해놓으면 Applicaiton이 실행될 때 Docker 엔진이 알아서 Container에 대한 host를 매핑해주지 못한다는 생각이 들었습니다. 그래서 Docker Compose File에 datasource url을 설정해주었습니다. 그랬더니 정상적으로 Spring Boot 어플리케이션하고 연결이 되었습니다.

Redis 문제 접근법

정상적으로 어플리케이션이 실행되서 로그인을 해보게 되었는데 이번엔 Redis가 연결이 되지 않았습니다.

  1. 먼저 Redis가 정상적으로 실행되었는지 확인해 보았습니다. 하지만 정상적으로 작동하고 있었습니다.
  2. 그 다음으로 Host가 제대로 설정되었는지 확인해 보았는데 localhost로 되어있어서 안되는건가 싶어서 docker compose service name으로 변경해주었는데 동작하지 않았습니다.
  3. 제대로 해준것 같은데 동작하지 않아서 혹시 변경된 내용이 담긴 jar 파일이 아니여서 그런건가 싶어서 확인해보니 실제로 엄청 오래전에 빌드된 jar이었습니다. build를 안했기 때문에 당연한 문제였는데 이러한 실수를 하게 되었습니다. 실제로 배포할 때는 CI/CD 를 통해 build된 jar을 넘겨 줄 것이기 때문에 이러한 실수는 발생하지 않을 것이라고 생각이 듭니다.
profile
Programmer

0개의 댓글