Spring-boot Dockerfile, docker-compose 작성
스프링-dockerfile을 작성할꺼에요
https://github.com/dmdrk1414/docker-practice-build
폴더 구성 (제발 보세요) 깃도 보면서 비교
폴더 구성 기본 폴더는 docker-compose.yml 이있는 폴더가 root 폴더입니다.
폴더 구성 기본 폴더는 docker-compose.yml 이있는 폴더가 root 폴더입니다.
├── backend
│ └── spring-boot-3
│ └─── Dockerfile
├── database
│ └── mysql
│ ├─── Dockerfile
│ └─── my.cnf
├── frontend
│ └─── Dockerfile
├── nginx
│ ├── Dockerfile
│ └── nginx.conf
│ └── nginx.conf
└── docker-compose.yml
1. ./backend/spring-boot-3 에서 Dockerfile 생성
# backend/spring-boot-3/Dockerfile
# 지금 사용중인 이미지 이름
FROM amazoncorretto:17
# 이미지 내에서 명령어를 실행할(현 위치로 잡을) 디렉토리 설정
WORKDIR /home/spring-boot-3/build
# java build 파일 jar파일 복사
COPY ./build/libs/*.jar app.jar
# 8080 포트 오픈
EXPOSE 8080
# 컨테이너 실행시 실행할 명령어
# WORKDIR에서 실행된다.
# 실행하자마자 설정이 된다.
CMD ["java", "-jar", "app.jar"]
2. ./database/mysql 에서 Dockerfile 생성
# database/mysql/Dockerfile
# 기반 이미지로 MySQL 공식 이미지 사용
FROM mysql:8.0.34
# 환경 변수 설정
ENV MYSQL_ROOT_PASSWORD=루트계정비밀번호
ENV MYSQL_DATABASE=생성하고싶은당신의데이터베이스이름
ENV MYSQL_ROOT_HOST=root
ENV TZ=Asia/Seoul
# Docker 이미지를 빌드할 때 파일이 컨테이너 내에 복사됩니다.
# 초기 디비 구성
COPY ./scripts/ /docker-entrypoint-initdb.d/
COPY ./my.cnf /etc/my.cnf
# 명령은 컨테이너가 시작될 때 실행됩니다.
CMD ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
# 컨테이너 포트 설정
EXPOSE 3306
3. ./frontend 에서 Dockerfile 생성
# frontend/Dockerfile
# docker container의 바탕이 되는 image의 이름이다.
# alpine은 Alpine Linux는 매우 작고 경량화된 배포판
FROM node:16.18.0-alpine
# 이미지 내에서 명령어를 실행할(현 위치로 잡을) 디렉토리 설정
WORKDIR /home/node/next
# Copy the rest of the application files to the container
# Docker 이미지를 빌드할 때 파일이 컨테이너 내에 복사됩니다.
# 현재 폴더 (docker file)이 있는 파일의 전체를 (frontend)폴더을 컨테이너 WORKDIR의 안에 복사를 한다.
COPY . .
# Build the production version of the app
# 컨테이너가 시작되는 시점에서 실행이 된다.
RUN npm run build
# Copy the rest of the application files to the container
# Docker 이미지를 빌드할 때 파일이 컨테이너 내에 복사됩니다.
# 현재 폴더 (docker file)이 있는 파일의 전체를 (frontend)폴더을 컨테이너 WORKDIR의 안에 복사를 한다.
COPY . .
# 명령은 컨테이너가 시작될 때 실행됩니다.
CMD [ "npm" , "start"]
4. ./nginx 에서 Dockerfile 생성
# nginx/Dockerfile
# docker container의 바탕이 되는 image의 이름이다.
FROM nginx:latest
# 이미지 생성 과정에서 실행할 명령어
# 이미지 생성 과정에서 npm 모듈을 설치가 된다.
# 기본 nginx 설정 파일을 삭제한다. (custom 설정과 충돌 방지)
RUN rm /etc/nginx/conf.d/default.conf
# host pc 의 nginx.conf 를 아래 경로에 복사
# Docker 이미지를 빌드할 때 파일이 컨테이너 내에 복사됩니다.
COPY ./nginx.conf /etc/nginx/conf.d
# 명령은 컨테이너가 시작될 때 실행됩니다.
CMD ["nginx", "-g", "daemon off;"]
5. docker-compose.yml 작성
작성을 하시면서 Chat-GPT을 이용해 무슨 명령어인지 확인을 하면서 작성해보세요
이안의 spring-boot-3의 database environment의 우선도가 spring-boot-3의 데이터베이스 설정보다 우선순위가 높습니다.
# /docker-compose.yml
# docker-compose의 버전
version: '3'
# 서비스의 정의 서비스의 이름은 각자 정할수 있습니다.
# docker-compose 가 관리해야되는 서비스(container)들을 정의
services:
# nextjs의 서비스 정의
frontend-nextjs:
container_name: compose-frontend-nextjs
build: ./frontend
#컨테이너 다운 시 재시작하라는 명령어
restart: always
# 불룸 로컬과 도커 마운트 설정
# 로컬 폴더와 컨터이너안의 임이의 폴더와 마운트
volumes:
- ./frontend:/home/node/next
# 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
# 호스트 머신의 3000번 포트와 컨테이너의 3000번 포트를 매핑합니다.
ports:
- "3000:3000"
backend-spring-boot-3:
container_name: compose-backend-spring-boot-3
# Dockerfile이 있는 위치
build: ./backend/spring-boot-3
#컨테이너 다운 시 재시작하라는 명령어
restart: always
# 불룸 로컬과 도커 마운트 설정
# 로컬 폴더와 컨터이너안의 임이의 폴더와 마운트
volumes:
- ./backend/spring-boot-3/build/libs:/home/spring-boot-3/build
# 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
# 호스트 머신의 8080번 포트와 컨테이너의 8080번 포트를 매핑합니다.
ports:
- "8080:8080"
# mysql서비스가 먼저 시작하고 그 뒤에 spring-boot-3 가 시작된다.
depends_on:
- database-mysql
# mysql 컨테이너(서비스)와 spring-boot-3 컨테이너(서비스)와의 연결을 하기위한 환경설정
# spring-boot-3의 db 설정보다 우선순위가 높다
environment:
# 만약 다른 컨테이너(서비스)와의 db을 연결하고 싶으면 원하는 컨테이너의 이름을 적어라
# SPRING_DATASOURCE_URL: jdbc:mysql://원하는db컨테이너이름:3306/접근하기를원하는db이름?useSSL=false&allowPublicKeyRetrieval=true
SPRING_DATASOURCE_URL: jdbc:mysql://원하는db컨테이너이름:3306/접근하기를원하는db이름?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&useUnicode=true&serverTimezone=Asia/Seoul
SPRING_DATASOURCE_USERNAME: "db접근을위한 user의 ID"
SPRING_DATASOURCE_PASSWORD: "db접근을위한 user의 비밀번호"
server-nginx:
container_name: compose-nginx
# Dockerfile이 있는 위치
build: ./nginx
#컨테이너 다운 시 재시작하라는 명령어
restart: always
# 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
# 호스트 머신의 80번 포트와 컨테이너의 80번 포트를 매핑합니다.
ports:
- "80:80"
# 현재 nginx 폴더와 도커의 /etc/nginx/conf.d 와 마운트
volumes:
- ./nginx/nginx.conf:/etc/nginx/conf.d
# depends_on은 설정 서비스 명이 nextjs, pring-boot-3 이 먼저 실행되고 nginx의 서비스가 먼저 실행된다.
depends_on:
- frontend-nextjs
- backend-spring-boot-3
database-mysql:
container_name: compose-database-mysql
# Dockerfile이 있는 위치
build: ./database/mysql
# build: ./database/mysql
restart: always
# 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
# 호스트 머신의 3306번 포트와 컨테이너의 33060번 포트를 매핑합니다.
ports:
- "3306:3306"
# 테이블 이름 소문자로 맞춘다.
volumes:
- ./database/mysql/scripts:/docker-entrypoint-initdb.d
command: --default-authentication-plugin=caching_sha2_password
'개인공부 > 배포' 카테고리의 다른 글
미니 피씨의 젠킨스를 이용한 ci/cd 작업 - 젠킨스 와 docker-compose Jenkins pipeline (4) (0) | 2023.09.02 |
---|---|
미니 피씨의 젠킨스를 이용한 ci/cd 작업 - nginx, mysql 마운트하기 위한 환경설정 (3) (0) | 2023.09.02 |
미니 피씨의 젠킨스를 이용한 ci/cd 작업 - 프로젝트 설명 (1) (0) | 2023.09.01 |