Docker Spring boot + Postgresql (1)
Docker 명령 참고
- 조회
docker ps -a
-a : 정지 중 포함
- 중지
docker stop <container-id/container-name>
- 시작
docker start <container-id/container-name>
- 재시작
docker restart <container-id/container-name>
- 접속
docker attach <container-id/container-name>
Postgrelsql 12.9-alpine Docker run
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=<password> --name Postgresql postgres:12.9-alpine
- Postsql Volume 생성 및 탑재 후 러닝
docker create volume postgresql-sample
- /var/lib/postgresql/data 에 데이터가 저장되기 때문에 해당 경로를 지정 및 캡쳐
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD="{password}" -v postgresql-sample:/var/lib/postgresql/data --network boot-sample-network --name Postgresql postgres:12.9-alpine
이후 localhost:5432 로 postgresql 접속.
-- 사용자 조회
select * from pg_user;
-- 사용자 생성
create user test password 'test';
-- 데이터 베이스 생성
create database test owner test
-- 데이터 베이스 조회
select datname from pg_database;
테스트용 테이블 생성
-- Drop table
-- DROP TABLE public.test_table;
CREATE TABLE public.test_table (
"name" varchar(200) NULL,
value varchar(200) NULL
);
COMMENT ON TABLE public.test_table IS 'test_table';
테스트용 데이터 삽입
INSERT INTO public.test_table ("name",value) VALUES
('1','TEST_VALUE1'),
('2','TEST_VALUE2'),
('3','TEST_VALUE3'),
('4','TEST_VALUE4'),
('5','TEST_VALUE5'),
('6','TEST_VALUE6'),
('7','TEST_VALUE7'),
('8','TEST_VALUE8'),
('9','TEST_VALUE9'),
('10','TEST_VALUE10');
INSERT INTO public.test_table ("name",value) VALUES
('11','TEST_VALUE11'),
('12','TEST_VALUE12'),
('13','TEST_VALUE13'),
('14','TEST_VALUE14'),
('15','TEST_VALUE15'),
('16','TEST_VALUE16'),
('17','TEST_VALUE17'),
('18','TEST_VALUE18'),
('19','TEST_VALUE19'),
('20','TEST_VALUE20');
DB준비 완료
Spring Boot 2.6.2 + jstl
- build.gradle 설정
plugins {
id 'org.springframework.boot' version '2.6.2'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.docker'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// 사용자 추가
// dev tool ( 정적 리소스 재시작없이 적용 )
implementation group: 'org.springframework.boot', name: 'spring-boot-devtools'
// mybatis-spring-boot
implementation group: 'org.mybatis.spring.boot', name: 'mybatis-spring-boot-starter', version: '2.1.4'
// log4j2
implementation group: 'org.bgee.log4jdbc-log4j2', name: 'log4jdbc-log4j2-jdbc4.1', version: '1.16'
// jdbc ( postgresql - jdbc driver )
implementation group: 'org.postgresql', name: 'postgresql', version: '42.3.1'
// 스프링 부트는 기본적으로 내장 톰캣을 가지고 있지만
// jsp 엔진이 존재하지 않아, jasper 와 jstl 의존성을 추가해주어야 한다.
// jstl
implementation group: 'javax.servlet', name: 'jstl', version: '1.2'
// jasper
implementation group: 'org.apache.tomcat', name: 'tomcat-jasper', version: '9.0.56'
}
test {
useJUnitPlatform()
}
- application.yml 설정
spring:
application:
name: springboot-docker-sample
# DB Connection ( localhost:5432 --> Docker Postgresql 5432 )
datasource:
hikari:
# connect to host port
#jdbc-url: jdbc:log4jdbc:postgresql://localhost:5432/test
# connect to container port
jdbc-url: jdbc:log4jdbc:postgresql://Postgresql/test
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
username: test
password: test
maximum-pool-size: 5
# mvc config
# 뷰 경로 지정 및 확장자 설정
# jar 파일로 압축하는 경우, jsp 지원 안하므로 기본 경로가
# META-INF/resources/WEB-INF/view 가 된다.
# develop 필요 ...
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
# devtool config
# 정적 리소스 수정에도 재시작 없이 변경사항 적용
devtools:
livereload:
enabled: true
** 동일 docker network 상에 컨테이너가 존재하는 경우 컨테이너의 Name 값이 {ip}:{port} 값과 대치되어 사용이 가능하다.
- 프로젝트 구조
sample 프로젝트
Docker Network 생성
docker create network boot-sample-network
최종 Docker 이미지 실행 명령
- postgresql ( M1 MAC 에서는 “ 를 ‘ 로 변경 )
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD="{password}" -v postgresql-sample:/var/lib/postgresql/data --network boot-sample-network --name Postgresql postgres:12.9-alpine
- spring boot
docker run -d -p 8080:8080 --network boot-sample-network --name Boot-Sample boot-sample
- postgresql volume file
\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes 에 압축해제. (윈도우만)
M1 Mac에서는 직접 경로로 넣는 부분을 찾지 못해 그냥 다시 만들었다 …
- 각 이미지는 dklim93/
으로 받을 수 있음.
참고
- postgresql yml 설정
https://csy7792.tistory.com/292
- 정적 소스 재시작 없이 구동
https://suzxc2468.tistory.com/186
- web xml 설정 사용
https://oingdaddy.tistory.com/356
- docker Network 공유
https://ooeunz.tistory.com/83
- docker Network 설정
https://docs.docker.com/engine/reference/commandline/network_connect/
- 리소스 경로 설정 관련
https://atoz-develop.tistory.com/entry/spring-boot-web-mvc-static-resources
https://stackoverflow.com/questions/28725635/spring-boot-configure-it-to-find-the-webapp-folder
- docker volume 윈도우 경로
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
개선사항
데이터 공유는 volume 형태가 아닌 파일(디렉토리) 공유 형태로 변경 > 쉽게 옮길 수 있다.
스프링 jsp 리소스 경로는 방법을 통해 복잡하지 않은 경로로 변경할 것.