티스토리 뷰
들어가기 전..
간략하게 상황을 정리하자면
해커톤 대회 참여 중 백엔드 개발을 맡아 진행하던 와중 파일 업로드를 처리하는 작업에서 겪은 일입니다.
이미지 관련해서 데이터를 어떻게 관리하고 처리를 할까?라는 고민을 했었습니다.
- 외부 클라우드 서버나 별도의 서버를 구축하여 파일을 관리한다.
- 서버 하나에 파일 폴더를 생성하여 관리한다.
저희 선택은 후자를 선택했습니다.
물론 파일이라는 것이 1번과 같이 클라우드 나 서버를 별도로 파일 전용 서버를 구축하는 것이 좋다고 생각이 듭니다.
저희 팀은 팀 여건상 (비용과 해커톤이라는 특징)을 생각하여 단순하게 파일을 관리하도록 하였습니다.
하지만 역시 파일을 한 서버에 애플리케이션과 같이 구축한다는 것은 많은 리스크가 있습니다.
예를 들어 ) 저희가 개발하는 프로젝트는 섬네일 등 사용자가 직접 올리는 시스템의 프로그램입니다.
그렇다는 것은 파일 용량 사용도가 많아질 수밖에 없는 부분이고, 그렇게 될 경우 서버 용량을 많이 잡아먹어 애플리케이션에 영향을 줄 수 있는 부분입니다. 이런 점을 확인하고 작업을 강행하기로 했습니다.
시작은 순조롭게 진행되었습니다.(모든지 순조롭다고 생각하면 그것이 문제인데… 참..)
로컬에서 절대경로(ex : C:/temp/upload)를 지정하여 파일이 정상적으로 올라가는지 확인하였을 때는 정상적으로 처리되는 것을 확인했었습니다.
하지만 이게 웬걸 기쁜 마음으로 DEV서버에 동일하게 외부 폴더를 생성하여 테스트해 보니 애플리케이션에서 찾지 못하는… 이슈가..
예외 발생 문구)
파일 저장 시 오류가 발생했습니다. /home/fton/backend/upload 경로를 찾지 못했습니다.
위와 같이 DEV서버의 경로를 지정되어 있는 것을 확인했는데;;; 왜 못 찾지???
매우 당황스러웠습니다…
결국은 뭐 여러 삽질 끝에 해결은 했는데 , 나의 지식 부족 + 조바심이 만든 결과가 아닌가 싶었네요…
1시간 좀? 넘게 삽질하면서 깨달은 내용이 있어 정리하는 시간을 가져보려고 합니다. ^^
사건발단 1
파일 폴더를 만드는 것까지는 좋았습니다. 위에서 말했다시피 , FTP에 파일경로를 구축하였고 애플리케이션에서는 appliation.yml에 절대 경로를 지정을 해줬습니다.
로컬에서도 위와 같은 application.yml 에 profile로 구분 지어 로컬에서는 C:/temp/upload로 절대경로를 지정하여 테스트를 하였고 , 정상적으로 등록되는 것을 확인!!
그런데 여기에는 허점이 있었습니다. 로컬은 C:드라이브에 폴더를 생성하였고 SpringBoot도 같은 환경 내에서 돌고 있어 파일의 경로를 이상한 걸로 하지 않는 이상 찾지 못하는 현상은 확인할 수 없습니다.
그렇지만 DEV환경은 로컬 환경과 다르게 세팅을 해두었었는데;; 그 부분을 제대로 캐치하지 못하고 있어 발생한 문제였습니다.
사건 발달 2
그렇다면 DEV는 어떻게 구축하였을까요?
우선 개발서버의 스펙을 말씀드리면
- [MICRO]CPU 1개
- RAM 1 GB
- 50GB
- OS(Centos 7.8)
네이버에서 1년간 사용할 수 있는 무료서버를 구축 하였습니다. 무료서버다 보니 상태가… 영…
협업하는 프로젝트였기에 DevOps 세팅을 해야 했고, Github Action을 통해 CI/CD를 구축하고자 했습니다.
Centos에 docker를 띄워 Mysql과 Application 서버를 컨테이너화 하여 분리하여 사용하고자 했습니다.
기본적으로 Centos 내에 Mysql과 Tomcat(외장 톰켓)을 같이 올려 서버를 운영합니다.
하지만 저희는 SpringBoot를 이용하여 자체 내장 톰켓을 운영하기로 하였습니다.
그리고 github action을 통해 관리하기에는 docker를 통해 빌드하여 운영하는 것이 재생산성이 높다고 판단하였
습니다.
이러한 이유로 인하여 도커를 통해 분리를 하는 과정에서 이미지 업로드에 대한 문제가 발생하게 되었습니다.
이미지 업로드 이슈 발생 원인
결국은 도커로 애플리케이션을 구축하였기에 발생하게 된 이유였습니다.
아무리 호스트에 폴더를 구축한다고 할지라도 컨테이너로 분리되어 돌고 있는 애플리케이션에는 영향을 주지 못합니다.
그렇기 때문에 애플리케이션이 도는 도커 컨테이너 내에 폴더를 생성해줘야 합니다.
주의해야 할 점.
애플리케이션에서 이미지 업로드 시 발생했던 경로 찾지 못하는 이슈가 무엇 때문이었는지 알게 되었습니다.
그렇다면 컨테이너를 올릴 때 도커 내에 폴더 경로를 만들어주기만 하면 될까요??
맞습니다. 결국은 컨테이너 내에 폴더를 생성하면 됩니다. 애플리케이션에 접속하여 폴더를 만들어주면 되겠죠?
docker exec -it [컨테이너 ID] // 컨테이너 접속 방법
하지만. 이렇게만 해서는 해결할 수 없습니다,..
경로를 만들어주어 처리하면 당연히 애플리케이션이 돌고 있는 상황에서 문제가 되지 않지만, 만약 컨테이너가 지워지거나 사라진다면, 폴더 또한 제거되기 때문에 영구성을 보장하지 못합니다.
그렇다면 어떻게 해야 영구적으로 관리가 될까요?
Docker 명령어 중 volume 이 있습니다. 저는 이 volume을 왜 사용해야 하는지 처음에는 잘 몰랐습니다.. 굳이?
라는 생각을 하며 공부했었는데요.
이번 경험을 통해 얼마나 중요한 역할을 하는지 알게 되었습니다.
volume 이란 데이터를 영구적으로 보존할 수 있도록 저장소를 생성해 주는 역할을 합니다. 즉 , 애플리케이션을 컨테이너에 run을 할 때 해당 volume을 통해 파일을 영구 보호할 수 있다는 겁니다.
그렇다면 컨테이너가 죽더라도 만약 volume을 통해 파일을 다른 곳에 만들어 두었다면, 데이터에는 문제가 되지 않게 됩니다.
그렇다면 다시 맨 위로 돌아가서 파일 폴더 경로를 확인해 보겠습니다.
/home/fton/backend/upload // os 서버에 파일 경로로 폴더를 생성했었습니다.
이 폴더를 그대로 유지하면서 컨테이너로 돌고 있는 도커와 연결시킬 수 있다면 어떻게 될까요?
그렇다면 도커 애플리케이션 컨테이너는 외부에 파일을 관리할 수 있는 상황이 될 것입니다.
설정방법.
애플리케이션에 대한 image를 가지고 있다고 해봅시다.
이미지 이름은 challenge라는 도커 이미지입니다.
도커와 분리된 외부 호스트 파일을 연결하기 위해서는 컨테이너 실행 시 설정을 해주면 됩니다.
volume을 선언하는 명령어는 -v를 이용하여 선언하게 됩니다.
docker run -d -p 32468:8080 --name challenger -e SPRING_PROFILES_ACTIVE=dev --network mariadb_mariadb-master-net -v /home/fton/backend/upload:/home/fton/backend/upload challenger:latest;
위의 코드를 보게 되면
-v /home/fton/backend/upload:/home/fton/backend/upload 명령어를 선언합니다.
이 말직은 외부 경로에 있는 upload 파일과 동일하게 컨테이너 내에 같은 폴더 경로로 생성하겠다는 말이 됩니다.
이렇게 될 경우 도커는 컨테이너 내부에 외부 파일 경로와 같은 경로의 파일이 생성되게 되고, 동기화가 됨으로써
컨테이너에서도 외부 파일을 접근하게 되고 파일을 등록, 수정, 삭제를 할 수 있게 됩니다.
이렇게 설정하게 된다면, 이미지를 등록, 수정. 삭제를 진행할 때 이미지 경로를 찾지 못하는 이슈를 해결할 수 있습니다.
'linux > docker' 카테고리의 다른 글
Docker 이미지와 컨테이너의 정의 (0) | 2024.10.04 |
---|---|
도커란? (0) | 2024.10.04 |
Docker 일반 계정에 권한 부여하기 (0) | 2024.07.29 |
DockerFile 실습(SpringBoot 프로젝트 로컬에서 띄우기) (1) | 2024.02.26 |
docker compose 파일 작성하기(정리) (1) | 2024.02.26 |
- Total
- Today
- Yesterday
- Linux
- 이미지
- 캐시
- 격리수준
- centos7
- leatcode
- 네이버 클라우드
- spring
- Java
- dockerfile
- ncp
- 개념 이해하기
- hazelcast
- 정의
- Cache
- 알고리즘
- mybatis
- LocalDate
- 캘린더
- Lock
- Quartz
- 도커
- 컨테이너
- dfs
- MySQL
- docker
- 리눅스
- insert
- 권한
- 스케줄러
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |