본문 바로가기
개인공부/배포

미니 피씨의 젠킨스를 이용한 ci/cd 작업 - Dockerfile생성 (2)

by 응가1414 2023. 9. 1.

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