docker와 docker compose에 대한 공부를 하면서 까먹지 않게 블로그로 기록합니다.
이번 포스팅에서는 Spring boot로 만든 프로젝트를 Mysql과 연동하고,
docker-compose로 작성해 배포하는 과정을 기록해보도록 하겠습니다.
목차
- Spring boot Application 생성
- docker-compose.yml 작성
- 소스 빌드 후 실행
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 초보의 공부 후 허접한 기록이니 참고만 해주시길 바래요..
그럼 이만
'프로그램이야기 > Docker' 카테고리의 다른 글
우분투 18.04 도커 설치 (0) | 2021.05.12 |
---|
댓글