본문 바로가기
프로그램이야기/Docker

Docker, docker compose를 이용한 Spring boot, Mysql 배포 환경 구성해보기

by Doinge 2021. 6. 28.
728x90
반응형

docker와 docker compose에 대한 공부를 하면서 까먹지 않게 블로그로 기록합니다.

이번 포스팅에서는 Spring boot로 만든 프로젝트를 Mysql과 연동하고, 

docker-compose로 작성해 배포하는 과정을 기록해보도록 하겠습니다.

 

목차

  1. Spring boot Application 생성
  2. docker-compose.yml 작성
  3. 소스 빌드 후 실행

1. Spring boot Application 생성 ( test용 이므로 간단한 rest controller만 만듦 )

https://start.spring.io/   를 사용해 스프링 프로젝트 생성

- spring web

- mysql driver

- spring data jpa

- lombok ( lombok을 사용하기 위해 플러그인을 설치 하고 환경 설정에서  Enable Annotation Process 를 체크 하자.

폴더구조

1-1. Gradle 의존성 추가 ( dependencies 설정 )

1-2. application.yml 작성

주석한 부분은 추후 docker-compose에서 작성할 예정

 

1-3. Rest api 작성

  • UserController.class 생성
package com.example.test.controller;

import com.example.test.model.User;
import com.example.test.model.User_2;
import com.example.test.repository.UserRepository;
import com.example.test.repository.User2Repository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;
import java.util.List;

@RestController
@RequestMapping("/api")
public class UserController {

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private User2Repository user2Repository;

    // 모든 유저 조회
    @GetMapping(produces = { MediaType.APPLICATION_JSON_VALUE })
    public ResponseEntity<List<User>> getAllusers(){
        List<User> user = userRepository.findAll();
        return new ResponseEntity<List<User>>(user, HttpStatus.OK);

    }

    @PostMapping("/user")
    public User create(@RequestBody User user){
        return userRepository.save(user);
    }

    @PostMapping("/user2")
    public User_2 create_user2(@RequestBody User_2 user_2){
        return user2Repository.save(user_2);
    }

    @GetMapping("/user/{id}")
    public Optional read(@PathVariable Long id){
        Optional<User> userOptional = userRepository.findById(id);
        //userOptional.ifPresent(System.out::println);

        //return "successfully executed";
        return userOptional;
    }

    @GetMapping("/user2/{id}")
    public ResponseEntity<User_2> getUser2Info(@PathVariable Long id){
        Optional<User_2> user2 = user2Repository.findById(id);

        return new ResponseEntity<User_2>(user2.get(), HttpStatus.OK);
    }
}
  • User.class 생성
package com.example.test.model;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
@Data
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    private String password;
}

 

  • UserRepository.interface 생성
package com.example.test.repository;

import com.example.test.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {

}

 

간단하게 모든 유저 조회 및 유저 생성 개별 유저 조회에 대한 rest api를 작성해 보았다.

 

2. docker-compose.yml 작성

 

docker는 vm에서 진행했다.

 

서버 정보

OS Ubuntu 18.04

프로젝트 최상단에 Dockerfile, docker-compose.yml 파일을 생성한다.

 

2-1. Dockerfile 작성

FROM

베이스 이미지 지정 ( 빌드한 jar파일을 실행하기 위해 java11을 사용 )

 

ARG

인자를 정의한다. 3줄에./build~~~ 라는 값을 주어 추후 jar 파일을 복사할 때 사용한다.

 

COPY

COPY 지시어를 사용해 3줄에서 정의한. jar 파일을 app.jar파일로 복사한다.

 

ENTRYPOINT

jar 파일을 수행하기 위한 명령어로 작성.

 

2-2. docker-compose.yml 파일 작성

  1 version: "3"
  2 
  3 services:
  4     database:
  5         image: mysql
  6         container_name: test_db_5
  7         environment:
  8             - MYSQL_DATABASE=testdb
  9             - MYSQL_ROOT_HOST=%
 10             - MYSQL_ROOT_PASSWORD=1234
 11         command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
 12         ports:
 13             - 3306:3306
 14         volumes:
 15             - /home/revision/docker_spring/database/testdb/:/var/lib/mysql
 16         networks:
 17             - test_network_02
 18 
 19     application:
 20         build: .
 21         restart: always
 22         ports:
 23             - 80:8080
 24         depends_on:
 25             - database
 26         container_name: app_test01
 27         environment:
 28             SPRING_DATASOURCE_URL: jdbc:mysql://database:3306/testdb?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&allowPublicKeyRetrieval=true
 29             SPRING_DATASOURCE_USERNAME: root
 30             SPRING_DATASOURCE_PASSWORD: 1234
 31         networks:
 32             - test_network_02
 33 
 34 networks:                                                                                                                                                                                                       
 35     test_network_02:

services:

docker-compose에서 구성할 서비스를 정의한다.

위 예제를 보면 ( 3줄 참고 )

services:

    database:

    application:

 

이라고 작성한 부분은 database 서비스 이름은 database, spring boot 서비스 이름은 application이라고 네이밍 하였다.

 

 

database 설정 부분 ( 4줄부터 )

  • image
    • mysql이미지를 사용 ( 뒤에 버전을 명시하지 않으면 최신 버전으로 사용 ex) mysql:5.7 )
  • environment ( mysql 환경변수 지정 )
    • MYSQL_DATABASE: testdb란 이름의 데이터베이스 생성
    • MYSQL_ROOT_PASSWORD: root password 지정
  • ports
    • 외부로 노출할 포트 지정 host port : container port 가 됨. ( 3306:3306 )
  • networks
    • 컨테이너 간 통신을 컨테이너의 이름으로 하기 위해서는 custom_network를 생성하고 해당 network에 컨테이너를 생성해야 한다.

 

application ( srping boot project ) 설정 ( 19줄부터 )

  • build
    • 빌드에 대한 키워드 정의
  • ports
    • host의 80 포트를 컨테이너의 8080 포트와 매핑한다.
  • depends_on
    • 의존성 추가, 스프링 부트는 실행할 때 database connection을 요청함
    • 따라서 mysql 컨테이너가 로드된 후 접속을 시도할 수 있게 추가해줌
  • environment
    • 도커의 경우 각 컨테이너별 개별 ip를 할당받기 때문에
    • 스프링 환경변수로 접속할 db의 url을 지정해 준다.
    • SPRING_DATASOURCE_URL: 접속할 db의 url 지정, 위에서 지정한 데이터베이스 서비스 네임을 사용해도 됨.
    • SPRING_DATASOURCE_USERNAME: 사용자 이름
    • SPRING_DATASOURCE_PASSWORD: 사용자 비밀번호
  • networks
    • database 설정에서 설명한 내용과 동일.

networks ( 34줄부터 )

  • compose에 사용할 네트워크 test_network_02를 생성함.

반응형

3. 소스 빌드 후 실행 및 테스트 

 

3-1. 프로젝트 최상단에서 빌드 실행 ( ./build/libs 하위에 빌드된 *. jar 파일 생성됨. )

아래 명령어로 docker-compose.yml 파일 실행

$ docker-compose up

실행되는 모습이다.

// 백그라운드로 실행
$ docker-compose up -d

// 상태 체크
$ docker-compose ps

// stop, start
$ docker-compose stop
$ docker-compose start

// docker-compose 서비스 제거
$ docker-compose down ( volumn, network 까지 다 삭제 )

// 서비스중인 컨테이너의 로그 확인
$ docker-compose logs

3-2. 테스트

실행한 후 postman으로 테스트를 진행해 보았다.

  • 전체 유저 조회

  • 유저 생성

  • 특정 유저 조회


 

이상 여기까지 docker-compose.yml 파일을 이용해 spring, mysql을 묶어서 배포해보는 방식을 테스트해 보았습니다.

docker, spring 초보의 공부 후 허접한 기록이니 참고만 해주시길 바래요..

그럼 이만

728x90
반응형

'프로그램이야기 > Docker' 카테고리의 다른 글

우분투 18.04 도커 설치  (0) 2021.05.12

댓글