본문 바로가기

사이드프로젝트/(240808)이거왜오름?

이거왜오름?웹앱 도커라이징하기

이제 대충 다 만들어졌으니 도커라이징을 해야한다

나는 구조를

리눅스 미니pc에서 mysql,웹앱,배치와 배치스케줄러를 전부 돌릴생각임

만약 미니pc는 웹앱과 배치가 localhost의 mysql을 참조하려면(해당 pc의 컨테이너가 아닌 mysql이 설치되어있다면), host.docker.internal:3306에 접근해야함(host.docker.internal은 도커의 컨테이너가 실행중인 컴퓨터의 localhost라고 보면됨)

 

이걸 생각해서 env파일을 만들면

MYSQL_ID=IIIDDDD
MYSQL_KEY=PASSWWWOOORRRDDD
MYSQL_URL=jdbc:mysql://host.docker.internal:3306/projectName?serverTimezone=Asia/Seoul

이렇게 만들면된다,이때 도커가 env를 읽을때는 키=값 사이에 공백이 있으면 안되니,붙이는거만 조심하면된다

 

근데 나는 mysql도 도커로 띄우고 볼륨붙여서 데이터만 저장하게 할거니 이런식으로 할수없다

일단 웹앱도커라이징이랑은 상관없으니 이런식으로 이미지부터 만들어서 로컬에서 테스트부터 하자

 

도커라이징이야 그냥 

# 빌드 스테이지
FROM gradle:8.8-jdk17 AS build
COPY --chown=gradle:gradle . /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle build --no-daemon

# 실행 스테이지
FROM openjdk:17-slim

EXPOSE 8080

RUN mkdir /app

COPY --from=build /home/gradle/src/build/libs/*.jar /app/spring-boot-application.jar

ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/spring-boot-application.jar"]

다른상황에서도 이거 복사해서 그대로 넣어도 동작할거임,단 빌드스테이지와 실행스테이지의 from의 원본이미지의 버전만 조심하면 별로 문제생길건 없을거같음

 

이걸 실행시킬때는

docker run -p 8080:8080 --env-file env파일경로/파일명.env  프로젝트명:프로젝트버전

으로 실행시키면된다

 

 

이제 도커컴포즈나 쿠버네티스로 도커컨테이너를 실행시키면되는데,쿠버네티스야 하도많이써봤으니 이번엔 도커컴포즈를 써볼꺼다

도커 컴포즈는

docker run -p 8080:8080 --env-file env파일경로/파일명.env  프로젝트명:프로젝트버전

이걸 yaml로 바꿔서 저장해서,즉 커맨드를 파일로 저장해서 형상관리를 할수있게 해주는 도구다

 

일단 이미지를 도커허브가 아닌 내가 만든 미니pc에다가 저장하려고하는데,이건 (링크)참조

윈도우->리눅스 파일전송은 (링크)참조

 

사설저장소 설정이 끝났으면,웹앱과 mysql의 yaml을 만들면된다,근데 mysql은 영구저장되어야하니 볼륨이 필요하니

docker volume create mysql_data 를 리눅스에서 붙여넣기하면 mysql_data라는 이름의 볼륨이 생성된다

그리고 yaml을 만들면

version: '3'
services:
  whyprice:
    image: localhost:5000/whyprice:0.9 #사설저장소에 저장한 whyprice
    ports:
      - "8080:8080"
    env_file:
      - main.env
    networks:
      - app-network
    depends_on:
      - mysqldb
  mysqldb: #컨테이너명,이걸 env의 url에 ip자리에 넣으면됨
    image: mysql:8.0.39-debian
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 루트패스워드  # root 비밀번호 설정
      MYSQL_DATABASE: 생성할스키마명  # 생성할 데이터베이스 이름
      MYSQL_USER: 아이디  # 생성할 사용자 이름,이걸 env에 넣으면됨
      MYSQL_PASSWORD: 비밀번호  # 사용자 비밀번호,이걸 env에 넣으면됨
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - app-network

networks:
  app-network:
    driver: bridge
volumes:
  mysql_data:
    external: true

 

이렇게 만들면된다

네트워크 관련은 (링크)참조

그리고 env로 db의 위치를 url과 아이디패스워드를 적어줘야한다

MYSQL_ID=위에서 적은 user아이디
MYSQL_KEY=위에서 적은 user패스워드
MYSQL_URL=jdbc:mysql://mysqldb:3306/why_price #위에서 mysql의 컨테이너명

 

이렇게 파일을 만들고, docker-compose -f docker_compose.yaml up -d 로 실행을 시켜주면 끝이다