spring과 mysql docker로 배포 후 ubuntu에서 사용하기

밤새·2024년 3월 9일

동아리 지원사이트를 만들면서 서버 배포를 한 과정을 적은 글입니다.
이번에는 docker image를 풀 받아서 ubuntu에서 사용하는 과정을 작성해보도록 하겠습니다.
이 글과 이어지는 내용입니다!

아래와 같은 순서로 개발을 진행하였습니다.

  1. ubuntu에서 spring과 mysql 이미지를 풀 받은 후 잘 실행되는 확인
  2. spring 코드에서 배포한 mysql jdbc url 수정과 방화벽 설정
  3. 다시 spring 이미지로 만들어서 docker hub에 push
  4. 그 후 ubuntu에서 풀 받아 다시 실행

1. Docker 설치

먼저 우분투에 접속을 해줍니다.

그 후 우분투 서버에 Docker를 설치를 합니다.

sudo apt update
sudo apt install docker.io   

2. mysql과 spring 이미지 pull

그 후 저번 시간에 도커허브에 올린 이미지들을 우분투 서버로 pull 받습니다.

docker pull mic050r/mysql:latest
docker pull mic050r/2024-msg-server:1.1

3. Docker 컨테이너 실행

pull 받은 Docker 이미지를 이용하여 컨테이너를 실행합니다.

# MySQL 컨테이너 실행
docker run -d --name mysql-container -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=dbname -e MYSQL_USER=username -e MYSQL_PASSWORD=password mic050r/mysql:latest
    
# Spring Boot 애플리케이션 컨테이너 실행
docker run -d --name msg-server-container mic050r/2024-msg-server:1.1

각 컨테이너는 백그라운드에서 실행되며, --name 옵션을 사용하여 각 컨테이너에 고유한 이름을 부여했습니다.

4. 컨테이너 확인

컨테이너가 정상적으로 실행되는지 확인하려면 아래 명령어를 사용합니다.

docker ps    

실행 중인 컨테이너 목록이 표시됩니다.

실행 중인 컨테이너를 보면 mysql은 나오는데 spring 컨테이너는 보이지 않았습니다.

docker logs 컨테이너 아이디

왜 안나오는지 로그를 통해 확인 해보았더니 db 연결 에러가 난 것을 확인 하였습니다.

db 연결 에러가 난 이유는 현재 ubuntu에서 실행중인 mysql은 ubuntu ip를 사용해서 실행되고 있는데 저번에 작성한 application.yml에서는 jdbc url을 local에 있는 mysql로 연결을 해놓았기 때문입니다.

따라서 application.yml 코드를 수정 후 다시 도커허브에 올리도록 하겠습니다.

spring:
  datasource:
    url: jdbc:mysql://ubuntu_ip주소:3306/dbname
    username: username
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQLDialect
  server:
    port: 8081
    address: 0.0.0.0
your:
  api:
    endpoints:
      - /question
      - /support-form
  1. Datasource 설정

    spring:
      datasource:
        url: jdbc:mysql://ubuntu_ip주소:3306/dbname
        username: username
        password: password
        driver-class-name: com.mysql.cj.jdbc.Driver
    • datasource: 데이터베이스 연결 설정을 담고 있는 부분입니다.
    • url: MySQL 데이터베이스에 연결하기 위한 JDBC URL입니다.
    • usernamepassword: 데이터베이스에 연결할 때 사용되는 사용자 이름과 비밀번호입니다.
    • driver-class-name: 사용할 JDBC 드라이버의 클래스명입니다.
  2. JPA 설정:

    spring:
      jpa:
        hibernate:
          ddl-auto: update
        show-sql: true
        properties:
          hibernate:
            dialect: org.hibernate.dialect.MySQLDialect
    • jpa: Java Persistence API(JPA) 설정 부분입니다.
    • hibernate.ddl-auto: Hibernate가 데이터베이스 테이블을 자동으로 생성 또는 업데이트하는 방식을 지정합니다. 여기서는 업데이트를 선택했습니다.
    • show-sql: Hibernate가 생성하는 SQL 쿼리를 콘솔에 출력할지 여부를 지정합니다.
    • properties.hibernate.dialect: 사용할 Hibernate 방언(Dialect)을 지정합니다. 여기서는 MySQL용 방언을 선택했습니다.
  3. 서버 설정:

    spring:
      server:
        port: 8081
        address: 0.0.0.0
    • server: Spring Boot 내장 서버 설정 부분입니다.
    • port: 애플리케이션이 사용할 포트를 지정합니다. 여기서는 8081번을 사용합니다.
    • address: 서버의 주소를 지정합니다. 0.0.0.0은 모든 인터페이스에서 들어오는 연결을 허용함을 의미합니다.
  4. 사용자 정의 API 엔드포인트 설정:

    your:
      api:
        endpoints:
          - /question
          - /support-form
    • your.api.endpoints: 사용자가 정의한 API 엔드포인트를 지정합니다. 여기서는 /question/support-form을 사용합니다.

만약 서버 설정과 api 엔드포인트 설정을 해주지 않는다면 나중에 방화벽의 문제가 생겨 api를 사용할 때 time out이 발생하게 됩니다.

이렇게 수정을 했다면 다시 한 번더 jar 파일을 생성 후 docker build를 하면 됩니다.
저는 아래와 같이 입력하였습니다.
docker build -t 2024-msg-server:dev1.3 .
docker tag 2024-msg-server:dev1.3 mic050r/2024-msg-server:dev1.3
docker push mic050r/2024-msg-server:dev1.3

이제 우분투에서 spring 이미지를 다시 풀 받은 후 실행을 다시 해보면 아주 잘 작동하는 것을 볼 수 있습니다.

docker run -d -p 8081:8080 --name msg-server-container-dev1.3 mic050r/2024-msg-server:dev1.3


이해가 안되는 부분이 있다면 언제든지 물어봐주세요!

profile
프로젝트를 통해 배운 개념이나 겪은 문제점들을 정리하고, 회고록을 작성하며 성장해나가는 곳입니다 😊

0개의 댓글