From b442b6573909eab15df91651ae3ecb4cce2c1291 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Sun, 14 Aug 2022 10:06:29 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[#13]=20setup:=20docker=20=ED=99=9C?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20nginx,=20application=20=EC=97=B0=EB=8F=99?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20=EC=B4=88=EA=B8=B0=20=EC=84=B8=ED=8C=85?= =?UTF-8?q?(=EC=A7=84=ED=96=89=EC=A4=91)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docker 기본적인 뼈대만 생성 --- Dockerfile | 34 ++++++++++++++++++++++++++++++ docker-compose.yml | 15 +++++++++++++ src/test/resources/application.yml | 2 +- 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7ad3804 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,34 @@ +FROM adoptopenjdk/openjdk11:latest as BUILD_IMAGE + +ENV WORK_DIR=/usr/app/ + +# app 작업 디렉토리 설정 +WORKDIR $WORK_DIR + +# gradle 실행을 위한 필수 디렉토리 준비 +COPY gradlew $WORK_DIR +COPY build.gradle $WORK_DIR +COPY settings.gradle $WORK_DIR +COPY gradle $WORK_DIR/gradle + +RUN ./gradlew -x test build || return 0 + +COPY src src + +# jar 파일 build +RUN ./gradlew bootjar + +FROM adoptopenjdk/openjdk11:latest + +ENV WORK_DIR=/usr/app/ + +WORKDIR $WORK_DIR + +COPY --from=BUILD_IMAGE $WORK_DIR/build/libs/*.jar tripleapp.jar + +ENTRYPOINT ["java", \ +"-jar", \ +"-Dspring.profiles.active=${PROFILE_OPTION}", \ +"-Dspring.datasource.url=${SPRING_DATASOURCE_URL}", \ +"-Dredis.host=${REDIS_HOST}", \ +"tripleapp.jar"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..530cd58 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +version: "3.9" +services: + nginx: + image: nginx + container_name: nginx + ports: + - "80:80" + volumes: + - ./nginx/:/etc/nginx/conf.d/ + app-server: + build: + context: . + dockerfile: Dockerfile + env_file: + - env/app.env diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index dc94f3f..61ea27c 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -10,4 +10,4 @@ spring: logging: level: org.hibernate.SQL: debug - org.hibernate.type: trace \ No newline at end of file + org.hibernate.type: trace # 실제 sql 쿼리의 parameter 값을 확인하고자 함 \ No newline at end of file From 4d759069b7702b467ec7c30394733f163f80b4bc Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Sat, 20 Aug 2022 02:54:01 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[#13]=20feat:=20docker=EB=A5=BC=20=ED=99=9C?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20app=EA=B3=BC=20nginx=20proxy=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=EA=B8=B0=EB=B3=B8=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - app-server는 docker-compose 활용한 build - nginx, mysql db는 따로 docker container 구성 - 같은 docker network로 통합 --- Dockerfile | 10 ++++------ docker-compose.yml | 13 ++++++------- env/app.env | 1 + nginx/app.conf | 5 +++++ src/main/resources/application-docker.yml | 6 ++++++ src/main/resources/application-local.yml | 5 +++++ src/main/resources/application.yml | 7 +++---- 7 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 env/app.env create mode 100644 nginx/app.conf create mode 100644 src/main/resources/application-docker.yml create mode 100644 src/main/resources/application-local.yml diff --git a/Dockerfile b/Dockerfile index 7ad3804..b48c63a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM adoptopenjdk/openjdk11:latest as BUILD_IMAGE +FROM openjdk:17-alpine as BUILD_IMAGE ENV WORK_DIR=/usr/app/ @@ -18,17 +18,15 @@ COPY src src # jar 파일 build RUN ./gradlew bootjar -FROM adoptopenjdk/openjdk11:latest +FROM openjdk:17-alpine ENV WORK_DIR=/usr/app/ WORKDIR $WORK_DIR -COPY --from=BUILD_IMAGE $WORK_DIR/build/libs/*.jar tripleapp.jar +COPY --from=BUILD_IMAGE $WORK_DIR/build/libs/*.jar dongne-api.jar ENTRYPOINT ["java", \ "-jar", \ "-Dspring.profiles.active=${PROFILE_OPTION}", \ -"-Dspring.datasource.url=${SPRING_DATASOURCE_URL}", \ -"-Dredis.host=${REDIS_HOST}", \ -"tripleapp.jar"] \ No newline at end of file +"dongne-api.jar"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 530cd58..a672861 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,15 +1,14 @@ version: "3.9" services: - nginx: - image: nginx - container_name: nginx - ports: - - "80:80" - volumes: - - ./nginx/:/etc/nginx/conf.d/ app-server: build: context: . dockerfile: Dockerfile + ports: + - "8080:8080" env_file: - env/app.env +networks: + default: + external: + name: api-net \ No newline at end of file diff --git a/env/app.env b/env/app.env new file mode 100644 index 0000000..e398751 --- /dev/null +++ b/env/app.env @@ -0,0 +1 @@ +PROFILE_OPTION=docker \ No newline at end of file diff --git a/nginx/app.conf b/nginx/app.conf new file mode 100644 index 0000000..172e262 --- /dev/null +++ b/nginx/app.conf @@ -0,0 +1,5 @@ +server { + listen 80; + listen [::]:80; + +} \ No newline at end of file diff --git a/src/main/resources/application-docker.yml b/src/main/resources/application-docker.yml new file mode 100644 index 0000000..329a30d --- /dev/null +++ b/src/main/resources/application-docker.yml @@ -0,0 +1,6 @@ +# local 내 docker 테스트용도 +spring: + datasource: + url: jdbc:mysql://beanie-test-db:3306/dongne?autoreconnect=true&characterEncoding=utf8&serverTimezone=Asia/Seoul + username: root + password: beaniejoy # TODO 추후 보안에 대해 생각해보기 diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml new file mode 100644 index 0000000..0a4ee95 --- /dev/null +++ b/src/main/resources/application-local.yml @@ -0,0 +1,5 @@ +spring: + datasource: + url: jdbc:mysql://localhost:3306/dongne?autoreconnect=true&characterEncoding=utf8&serverTimezone=Asia/Seoul + username: root + password: beaniejoy # TODO 추후 보안에 대해 생각해보기 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 61c16f5..436480a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,8 +1,7 @@ spring: + profiles: + active: local datasource: - url: jdbc:mysql://localhost:3306/dongne?autoreconnect=true&characterEncoding=utf8&serverTimezone=Asia/Seoul - username: root - password: beaniejoy # TODO 추후 보안에 대해 생각해보기 driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: @@ -20,4 +19,4 @@ spring: logging: level: org.hibernate.SQL: debug # logger 통해 로깅 -# org.hibernate.type: trace + # org.hibernate.type: trace \ No newline at end of file From 747b5a7f3d7c551692702ced00f97a3ea0700262 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Sun, 21 Aug 2022 18:31:55 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[#13]=20feat:=20docker=20compose=EB=A1=9C?= =?UTF-8?q?=20=EB=A1=9C=EC=BB=AC=EC=97=90=EC=84=9C=20nginx,=20app=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docker profile을 통한 local docker test 구성 - nginx 설정 구성 - local db 활용을 위한 docker network 구성 --- Dockerfile | 2 +- docker-compose.yml | 15 +++++++-- nginx/app.conf | 5 --- nginx/config/app.conf | 41 +++++++++++++++++++++++ nginx/nginx.conf | 35 +++++++++++++++++++ src/main/resources/application-docker.yml | 4 +-- 6 files changed, 92 insertions(+), 10 deletions(-) delete mode 100644 nginx/app.conf create mode 100644 nginx/config/app.conf create mode 100644 nginx/nginx.conf diff --git a/Dockerfile b/Dockerfile index b48c63a..6697449 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ COPY build.gradle $WORK_DIR COPY settings.gradle $WORK_DIR COPY gradle $WORK_DIR/gradle -RUN ./gradlew -x test build || return 0 +RUN ./gradlew test build || return 0 COPY src src diff --git a/docker-compose.yml b/docker-compose.yml index a672861..dd99441 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,15 @@ version: "3.9" services: - app-server: + nginx: + image: nginx + ports: + - "80:80" + volumes: + - "./nginx/nginx.conf:/etc/nginx/nginx.conf" + - "./nginx/config/:/etc/nginx/conf.d/" + depends_on: + - dongne-api + dongne-api: build: context: . dockerfile: Dockerfile @@ -8,7 +17,9 @@ services: - "8080:8080" env_file: - env/app.env + +# docker 환경에서 local db 활용하기 위한 설정 networks: default: external: - name: api-net \ No newline at end of file + name: api-net diff --git a/nginx/app.conf b/nginx/app.conf deleted file mode 100644 index 172e262..0000000 --- a/nginx/app.conf +++ /dev/null @@ -1,5 +0,0 @@ -server { - listen 80; - listen [::]:80; - -} \ No newline at end of file diff --git a/nginx/config/app.conf b/nginx/config/app.conf new file mode 100644 index 0000000..88122b1 --- /dev/null +++ b/nginx/config/app.conf @@ -0,0 +1,41 @@ +server { + listen 80; + server_name localhost; + + #access_log /var/log/nginx/host.access.log main; + + location / { + proxy_pass http://dongne-api:8080; + proxy_http_version 1.1; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-NginX-Proxy true; + + #client_max_body_size 256M; + #client_body_buffer_size 1m; + + #proxy_buffering on; + #proxy_buffers 256 16k; + #proxy_buffer_size 128k; + #proxy_busy_buffers_size 256k; + + #proxy_temp_file_write_size 256k; + #proxy_max_temp_file_size 1024m; + + #proxy_connect_timeout 300; + #proxy_send_timeout 300; + #proxy_read_timeout 300; + #proxy_intercept_errors on; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + #error_page 500 502 503 504 /50x.html; + #location = /50x.html { + # root /usr/share/nginx/html; + #} +} diff --git a/nginx/nginx.conf b/nginx/nginx.conf new file mode 100644 index 0000000..d8becfc --- /dev/null +++ b/nginx/nginx.conf @@ -0,0 +1,35 @@ + +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log notice; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + #server_names hash_bucke + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + #tcp_nodelay on; + + keepalive_timeout 65; + #types_hash_max_size 2048; + + #gzip on; + + include /etc/nginx/conf.d/*.conf; + #include /etc/nginx/sites-enabled/*; +} \ No newline at end of file diff --git a/src/main/resources/application-docker.yml b/src/main/resources/application-docker.yml index 329a30d..b3402cd 100644 --- a/src/main/resources/application-docker.yml +++ b/src/main/resources/application-docker.yml @@ -1,6 +1,6 @@ -# local 내 docker 테스트용도 +# local docker 환경 내 local db 활용 spring: datasource: url: jdbc:mysql://beanie-test-db:3306/dongne?autoreconnect=true&characterEncoding=utf8&serverTimezone=Asia/Seoul username: root - password: beaniejoy # TODO 추후 보안에 대해 생각해보기 + password: beaniejoy # TODO 추후 보안에 대해 생각해보기 \ No newline at end of file From c48399b6be9aff3bc5c53e474a279ca971220761 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Tue, 23 Aug 2022 00:13:01 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[#13]=20feat:=20docker=20compose=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=9C=20=EC=95=A0=ED=94=8C=EB=A6=AC?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=85=98=20=EC=8B=A4=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - nginx, app, db 컨테이너 구성 - dockerize 활용한 컨테이너 실제 실행 순서 보장 --- Dockerfile | 18 ++++++++++++++---- README.md | 15 +++++++++++++++ docker-compose.yml => docker-compose.yaml | 14 ++++++++------ env/app.env | 5 ++++- env/db.env | 2 ++ script/docker-entrypoint.sh | 6 ++++++ src/main/resources/application-docker.yml | 6 ------ 7 files changed, 49 insertions(+), 17 deletions(-) rename docker-compose.yml => docker-compose.yaml (74%) create mode 100644 env/db.env create mode 100644 script/docker-entrypoint.sh delete mode 100644 src/main/resources/application-docker.yml diff --git a/Dockerfile b/Dockerfile index 6697449..53984b3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,13 +20,23 @@ RUN ./gradlew bootjar FROM openjdk:17-alpine +ENV DOCKERIZE_VERSION v0.6.1 ENV WORK_DIR=/usr/app/ WORKDIR $WORK_DIR COPY --from=BUILD_IMAGE $WORK_DIR/build/libs/*.jar dongne-api.jar -ENTRYPOINT ["java", \ -"-jar", \ -"-Dspring.profiles.active=${PROFILE_OPTION}", \ -"dongne-api.jar"] \ No newline at end of file +# run in order through dockerize utility (alpine version) +# link - https://github.com/jwilder/dockerize +RUN apk add --no-cache openssl bash + +RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz + +COPY ./script/docker-entrypoint.sh docker-entrypoint.sh + +RUN chmod +x docker-entrypoint.sh + +ENTRYPOINT ["./docker-entrypoint.sh"] diff --git a/README.md b/README.md index 393765b..d1e30ac 100644 --- a/README.md +++ b/README.md @@ -7,3 +7,18 @@ - kotlin 1.6.21 - Spring Boot 2.7.0 - MySQL + +## local 환경 + +### 로컬 환경 내 로컬 DB 따로 구성 +- local에 DB(MySQL)용 docker container run +- application은 IDE에서 실행 (default profile: `local`) +```bash +$ docker run --name beanie-test-db -e MYSQL_ROOT_PASSWORD=beaniejoy -d -p 3306:3306 mysql:5.7.34 +``` + +### docker compose 실행 +- docker compose를 이용한 nginx, DB(MySQL), application 한꺼번에 실행하는 경우 +```bash +$ docker-compose up --build +``` diff --git a/docker-compose.yml b/docker-compose.yaml similarity index 74% rename from docker-compose.yml rename to docker-compose.yaml index dd99441..0d99e36 100644 --- a/docker-compose.yml +++ b/docker-compose.yaml @@ -17,9 +17,11 @@ services: - "8080:8080" env_file: - env/app.env - -# docker 환경에서 local db 활용하기 위한 설정 -networks: - default: - external: - name: api-net + depends_on: + - db + db: + image: mysql:5.7.34 + ports: + - "3306:3306" + env_file: + - env/db.env diff --git a/env/app.env b/env/app.env index e398751..fd92961 100644 --- a/env/app.env +++ b/env/app.env @@ -1 +1,4 @@ -PROFILE_OPTION=docker \ No newline at end of file +PROFILE_OPTION=docker +SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/dongne?autoreconnect=true&characterEncoding=utf8&serverTimezone=Asia/Seoul +SPRING_DATASOURCE_USERNAME=root +SPRING_DATASOURCE_PASSWORD=beaniejoy \ No newline at end of file diff --git a/env/db.env b/env/db.env new file mode 100644 index 0000000..5b48f94 --- /dev/null +++ b/env/db.env @@ -0,0 +1,2 @@ +MYSQL_DATABASE=dongne +MYSQL_ROOT_PASSWORD=beaniejoy \ No newline at end of file diff --git a/script/docker-entrypoint.sh b/script/docker-entrypoint.sh new file mode 100644 index 0000000..07861dd --- /dev/null +++ b/script/docker-entrypoint.sh @@ -0,0 +1,6 @@ +#!/bin/bash +echo "wait DB container up" +dockerize -wait tcp://db:3306 -timeout 20s + +echo "run dongne-api application" +java -jar -Dspring.profiles.active=${PROFILE_OPTION} dongne-api.jar \ No newline at end of file diff --git a/src/main/resources/application-docker.yml b/src/main/resources/application-docker.yml deleted file mode 100644 index b3402cd..0000000 --- a/src/main/resources/application-docker.yml +++ /dev/null @@ -1,6 +0,0 @@ -# local docker 환경 내 local db 활용 -spring: - datasource: - url: jdbc:mysql://beanie-test-db:3306/dongne?autoreconnect=true&characterEncoding=utf8&serverTimezone=Asia/Seoul - username: root - password: beaniejoy # TODO 추후 보안에 대해 생각해보기 \ No newline at end of file From f6c67852f254f213d224bc80b6a0647d25108acd Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Wed, 24 Aug 2022 01:33:55 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[#13]=20modify:=20nginx=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=94=94=EB=A0=89=ED=86=A0=EB=A6=AC=EB=AA=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yaml | 2 +- nginx/{config => conf}/app.conf | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename nginx/{config => conf}/app.conf (100%) diff --git a/docker-compose.yaml b/docker-compose.yaml index 0d99e36..9aebc1c 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -6,7 +6,7 @@ services: - "80:80" volumes: - "./nginx/nginx.conf:/etc/nginx/nginx.conf" - - "./nginx/config/:/etc/nginx/conf.d/" + - "./nginx/conf/:/etc/nginx/conf.d/" depends_on: - dongne-api dongne-api: diff --git a/nginx/config/app.conf b/nginx/conf/app.conf similarity index 100% rename from nginx/config/app.conf rename to nginx/conf/app.conf