노력과 삽질 퇴적물

토이프로젝트 로컬 환경용 도커 -스프링부트 기준- 본문

📂게임개발 note/클라우드 & 서버

토이프로젝트 로컬 환경용 도커 -스프링부트 기준-

MTG 2025. 1. 8. 01:47


[이미지 출처: gruntwork.io]
파트1  
 1)  다운로드
 2) CMD
 1)  도커용 IDE
 1)  라이브러리용 컨테이너
 2) 네트워크
 3) 스프링투브 컨테이너

① 본업인 '게임서버 및 백엔드'와 별개로 이제는 취미 및 토이프로젝트로 게임엔진/앱 프로그래밍으로 여러 환경이 쌓이다보니 컨테이너(도커)를 전면 도입할 때가 됐다.
 ... 그런데C드라이브 용량이 없다.
 프로그래머 혹은 IT개발자는 365일 최신 기기만 사용할것도 같지만, 신규 프로젝트 처음부터 들어가 릴리즈 혹은 안정화까지 하면 2년 정도는 지나있고, 집에 거의 못 들어가거나 정말 눈만 붙였다 옷 갈아입고 나오기를 반복하다보면 (이하생략)

② 컨테이너 모델 쓰는건 다 좋은데, 주변 사람에게 물어보니 회사쪽 node기반 도커 이미지는 30GB쯤이라고...
 스프링부트(pom.xml기반) 관련 설정하고 D드라이브의 남은 용량으로 버텨야 할텐데;;;

③ WSL → win10 업데이트가 20H1이상 권장? //내 환경은 22H2여서 통과.
   WSL2→ win10 OS빌드 19041 이상?        //19045.5247여서 통과.

④ 개발이 진행중이던 스프링부트 프로젝트에 도커를 적용하는거다보니, 검색에 많이 나오는 간단 튜토리얼만 봐서는 안 되는 부분이 적지 않음.
1. 설치
1) 다운로드
 [🔗홈페이지]를 가보니깐, 플랜 비교부터 있어서 'Download Docker Desktop'가 맨위가 아니다. 이거때문에 플랜 비교 페이지에서 잠시 헤매다 가입이 필수인것처럼 착각이 되는 흐름인가 했는데... 다운로드와 별개로 사용시 계정가입이 필수다.
 그런데 뭐 유니티도 엇비슷해서.



2) CMD
 참조한 자료에서는 경로명에 대소문자 혼합이지만, 어지간하면 경로에 대소문자가 섞이는건 비권장인 경우가 많다보니 아래처럼 소문자로.
 또한 Docker Desktop Installer가 있는 경로로 이동한것을 전제로 한다.
> start /w "" "Docker Desktop Installer.exe" install -accept-license --installation-dir="D:\workspace_dev\path_virtual\docker\docker" --wsl-default-data-root="D:\workspace_dev\path_virtual\docker\wsl" --windows-containers-default-data-root="D:\\workspace_dev\\path_virtual\\docker"



3) 사용자 설정

WSL2가 최신판이라 하니 일단 저걸로.



기본 실행까지 완료.
2. 도커와 IDE
1) 도커용 IDE
 도커에 설치해서 웹 브라우저 접속시 사용가능한 이클립스가 있어서 윈도우 환경에서는 추가 설정이 약간 필요하다고 합니다.
⚙️ > General > Expose daemon on tcp://localhost:2375 without TLS 항목 활성화 등등.

BUT!

"Eclipse/che will not support running on bare docker, only Kubernetes/Openshift infra"
(unraid.net, 2019)

 어쩐지 도커 이미지내 IDE까지 세팅해서 하는 경우는 거의 안 보이고, 호스트의 IDE가 도커에 원격접속하는쪽으로만 보인다 싶더니만... 2018쯤 이클립스che자료를 보고 시도하던건 실패입니다.
 이클립스 진영이 이런 정책이면 남는건 비쥬얼 스튜디오랑 인텔리제이인데... Visual Studio Code Server는 도커에 세팅하는거하고는 좀 다른 방향이고, 인텔리제이는 라이센스상 도커에 따로 쓰이는 IDE는 없을테니 포스팅 작성 시점(2025-01)에는 별다른 소득이 없습니다.
 해당 항목도 저처럼 불필요한 시도를 줄이시라고 정리해두는겁니다.

 쿠버네티스도 컨테이너이긴 한데, 해당 포스팅은 토이프로젝트 개발에 활용할 도커가 우선이다보니 개념 설명 자료 링크만 남기고 다음으로 넘어가겠습니다.
(나중에 저도 참조할겸)
🔗Kubernetes와 Docker 비교 (atlassian)
🔗쿠버네티스 알아보기 1편 (삼성 SDS)
3. 도커내 라이브러리
1) 라이브러리용 컨테이너


과정
내역
① 이미지 생성 docker pull redis
docker pull mariadb
docker pull mongo
② 컨테이너 최초 실행 docker run -p 6379:6379 --detach --name spring-redis redis redis-server --save 60 1 --loglevel warning
docker run -p 3306:3306 --detach --name spring-mariadb --env MARIADB_ROOT_PASSWORD=__my_pw__  mariadb
docker run -p 27017:27017 --detach --name spring-mongo mongo


→ 포트 옵션에서 (호스트 포트):(도커쪽 포트)니 헷갈리지 않게 주의.
→ 메뉴를 살펴보니 CUI로 안 해도 GUI툴에서 옵션 넣어 첫 구동이 가능하긴한데, 메뉴가 접혀있고 해서 1줄로 끝내는 CUI가 좀 더 편하겠더군요. 그리고 한번 생성하면 툴에서 반복 실행 가능한 부분이 꽤 편리.
→ 레디스의 쓰임새상, ttl이 걸린 보드면 persistent storage로 N분 간격 덤프가 없어도 되겠지만 랭킹 보드류면 위의 명령어와 같으니 쓰임새에 맞게 하자.


③ 테이블
 docker exec -it spring-mariadb bash등으로 CUI로 접속이 가능해도... 디비버에서 기존 SQL 백업본을 실행 했으나!!!
 (대강 어느 원리로 추정은 되나)무슨 현상이라 하는지는 모르겠지만, 개발툴 함부로 바꾸면 안 된다를 이렇게 또 주입식으로 복습이 되는군요.
 각자 환경에 맞춰서, 해당 포스팅은 기존에 했던 툴로 마저하고서 위의 툴을 번갈아서 쓸거 같습니다. 전에 실무에서 A에서 되는것이 B에서는 안 되고, B에서 되는것이 A에서는 안 되던터라.



2) 네트워크
2-1) 주요개념
① 스프링부트도 서버 기술이니 DB혹은 캐싱과 연동한 서비스 개발 혹은 비즈니스 로직이 빈번하다. 이리되면 각 컨테이너들 통신이 되어야 할텐데 [🔗Network drivers]기준으로 6가지.
 개발 문서에서는 bridge방식이 기본 사양이라 설명. 페이지 내용상 로컬 호스트 위주이니 협업용으로 하려면 다른 방식을.


2-2) 세팅
→ 네트워크를 고려하지 않은 기존 컨테이너들은 삭제.
과정
내역
① 네트워크 생성 docker network create nw-springboot
② 네트워트 옵션으로 구동 docker run -p 6379:6379 --network nw-springboot --detach --name spring-redis redis redis-server --save 60 1 --loglevel warning
docker run -p 3306:3306 --network nw-springboot --detach --name spring-mariadb --env MARIADB_ROOT_PASSWORD=__my_pw__ mariadb
docker run -p 27017:27017 --network nw-springboot --detach --name spring-mongo mongo/
③ 네트워크 구성 확인 docker network inspect nw-springboot
... ... ...
        "Name": "nw-springboot",
... ... ...
        "Created": "2024-12-29T10:56:22.127580394Z",
... ... ...
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
... ... ...
                "Name": "spring-redis",
... ... ...
                "Name": "spring-mariadb",
... ... ...
                "Name": "spring-mongo",
... ... ...



3) 스프링부트 컨테이너
→ 사실 '1) 라이브러리용 컨테이너'와 '2) 네트워크'까지 다 했으면, 이클립스/VS코드로 로컬 구동해서 써도 되겠지만... 다른 게임 엔진 혹은 프레임워크등으로 JDK버전 오가면서 환경 설정 꼬이는 최악의 경우는 사양이라 마저 진행을.
(학생때 포함으로 10년도 넘게 겪었으니 이제는 그만 좀)
→ 구동을 하려고 해도
Logging system failed to initialize using configuration from 'null'
... ...
logs/stdout.log (Permission denied)
혹은
2025-01-08 01:05:03 Logging system failed to initialize using configuration from '/app/config/logback-spring.xml'
2025-01-08 01:05:03 java.lang.IllegalStateException: Logback configuration error detected:
2025-01-08 01:05:03 ERROR in ch.qos.logback.core.rolling.RollingFileAppender[LOG_FILE] - openFile(logs/stdout.log,true) call failed. java.io.FileNotFoundException: logs/stdout.log (Permission denied)
구동이 안 되서 처음에는 블로그랑 스택오버플로우 위주로 탐색하다 안 되서 챗지피티를 통해 문제 범위 좀 더 좁혀 아래와 같이 세팅했습니다.
→ 빌드 최적화는 다음 기회쯤. 일단 어느정도 사용해보고 개인적인 설정 항목이 쌓여야.

과정
내역
① Dockerfile → (프로젝트 폴더)\Dockerfile 파일 내용은 아래와 같이.
# 빌드 스테이지
FROM eclipse-temurin:17-alpine AS build
RUN apk add --no-cache bash

WORKDIR /app
RUN mkdir -p /app/logs
COPY src/main/resources/logback-spring.xml /app/config/logback-spring.xml
COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .

RUN ./mvnw dependency:go-offline -B

COPY . .

RUN chmod +x ./mvnw
RUN ./mvnw package -DskipTests

# 런타임 스테이지
FROM eclipse-temurin:17-jre-alpine as runtime

WORKDIR /app
RUN mkdir -p /app/logs
COPY src/main/resources/logback-spring.xml /app/config/logback-spring.xml
RUN addgroup -g 1000 worker && \
    adduser -u 1000 -G worker -s /bin/sh -D worker && \
chmod -R 755 /app/logs && \
chown -R worker:worker /app/logs
COPY --from=build --chown=worker:worker /app/target/*.jar ./main.jar

USER worker:worker
ENV PROFILE=${PROFILE}
EXPOSE 80

ENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "main.jar", "--logging.config=/app/config/logback-spring.xml"]
② .dockerignore파일 → (프로젝트 폴더)\.dockerignore
→ 도커 빌드시, 포함되지 않게 할 파일 정의. 가령 logs내 파일이나 target폴더 등등.
.vscode
bin
logs/access_log.*
logs/stdout.20*
target
③ 이미지 생성 → (프로젝트 폴더)내 최상위 경로에서 CMD로 아래의 명령을 실행합니다. 명령어에서 마침표는 Dockerfile이 있는 현재 디렉토리.
docker build -t my-project-name .
④ 컨테이너 실행 → 기존 프로젝트의 로그 설정상 추가옵션이 좀 더 필요.
docker run -p 80:80 --network nw-springboot --detach --name my-project-name my-project-name



완전히 구동됐을때 나오는 초기 문구(커스텀) 확인.
기타. 참조자료
1) 블로그 
1-1) 국내권



2) 웹사이트 
2-1) 국내권
팔만코딩경, "윈도우 D드라이브 사용해서 docker 쓰기" (접속: 2024-12-18), https://80000coding.oopy.io/6411682c-ebd3-4744-8643-46d4d9776a5f.


2-2) 국내권
Docker Docs, "Bridge network driver" (접속: 2024-12-29), https://docs.docker.com/engine/network/drivers/bridge.
Docker Docs, "Build context (접속: 2025-01-07), https://docs.docker.com/build/concepts/context/.
Unraid, "Help needed custom Eclipse/Che docker" (접속: 2024-12-18) https://forums.unraid.net/topic/85690-help-needed-custom-eclipseche-docker/.
기타. 변경 내력
일자
변경 내력
2025-01-08 초안 및 일반 공개. [🔗blogger] [🔗티스토리].
포스팅 신규 양식 적용(ver.202408)