작성
·
495
1
안녕하세요! nestjs 수강생 입니다!
docker 부분에서 질문이 있어서 문의 드리게 되었습니다.
현재 local 과 docker postgres image 가 이렇게 연결되어 있습니다.
알고 있는 점
(1) docker-compose up 을 실행하면 두 폴더가 연결되며 docker postgres 의 데이터 폴더를 로컬 폴더와 매핑한다.
(2) docker postgres 에서 데이터 손실 시 로컬에서 관리하는 postgres-data 폴더 덕분에 문제 없음
(3) 로컬 폴더를 날리고 docker-compose up을 재 실행하면 모든 데이터 날라감.
궁금한 점
(1) 개발자는 자신의 로컬 폴더에 있는 데이터만 CRUD 하고 그 결과가 docker postgres 에 반영되는 건가요? 그래서 로컬폴더를 삭제하고 docker-compose up 을 재 실행하면 데이터가 모두 날라가는 건가요?
(2) docker-compost up 을 실행하면 처음에는 로컬에서 docker postgres 에 데이터를 가져오는데 그럼 ./postgres-data 폴더가 있을때와 없을때가 다르게 동작하는 건가요? 예를들어 있을때는 로컬에서 docker postgres 로 전송, 없을때는 docker postgres에서 로컬로 전송.
아래는 제가 이해하고 있는 점인데 어떤 부분이 맞고 틀린 지를 알 수 없어서 쭉 적어봤습니다!!
처음 docker-compose up 을 실행하면 ./postgres-data 폴더가 없어서 docker postgres의 폴더를 복사해서 가져와 매핑합니다.
매핑 되어있는 폴더 덕분에 우리는 로컬 폴더와 TypeORM 을 사용해서 데이터에 변화를 주고 이러한 CRUD 는 docker postgres 에 반영됩니다.
이러한 매핑 덕분에 docker 가 문제가 되어 docker postgres 의 데이터가 삭제되어도 로컬에서 저장된 데이터를 매핑할 수 있어 데이터를 보존할 수 있습니다.
로컬에서 ./postgres-data 를 삭제하고 docker-compose up 을 실행하면 docker postgres 는 로컬의 CRUD 중 Delete 상황을 docker postgres 에 반영하여 데이터를 모두 삭제하고 폴더가 없어졌으니 다시 받아오는 작업을 한다.
혹시 잘못된 개념 부분이 있을까요?
답변 1
2
안녕하세요!
일단 너무 상세한 질문 정말 감사합니다!
"질문을 어떻게 해야하는가"에 대한 정석인 것 같습니다.
앞으로도 저희 커뮤니티가 아니라도 이런식으로 질문을 올리신다면 성장하는데 정말 큰 도움이 되실 것 같습니다. 저도 굉장히 기대를 하게 되는 부분입니다!
질문 답변 드리겠습니다.
1) docker-compose 파일에서 volume을 이용해서 로컬 폴더와 docker image 상의 폴더를 연결해놓으면 두 폴더가 '완전히' 연동됩니다. 즉, docker image 상에서 파일이 생기거나 변경되거나 삭제되면 모두 로컬 폴더에 반영됩니다. 복사나 이중 작업의 개념이 아니라 완전 같은 공간이라고 생각하시면 됩니다. docker image는 말 그대로 이미지입니다. 하나의 '거의' 완전히 독립된 공간으로 설계 되어있기 때문에 삭제한다면 관련된 모든 데이터가 삭제됩니다. 나중에 docker를 이용한 고도화된 툴들을 사용하시면 알게 되겠지만 이 부분은 한계점이 아니라 장점입니다. 고의적으로 설계된 부분입니다. 그렇기 때문에 '상태'를 존속시키려면 로컬 컴퓨터에 정보를 저장해두고 이미지를 띄울때 다시 똑같은 위치와 로컬 폴더를 연동시키는 방법밖에 없습니다.
2) docker-compose up을 실행하면 docker-compose.yaml 파일에 작성된 정보를 토대로 docker image를 실행시킵니다. docker image를 실행 시킨다는 뜻은 docker 파일 내부에 있는 모든 과정을 처음부터 실행시킨다는 뜻입니다. docker 강의가 아니기 때문에 짚고 넘어가진 않았지만 docker 파일 내부에는 이미지를 실행 시키기위한 프로세스가 라인 바이 라인으로 작성돼있습니다. 예를들면 어떤 OS를 실행시키고 그 OS에 어떤 프로그램을 설치하며 어떤 환경설정을 해야하는지 등등입니다. 그러니 postgres 이미지의 경우 당연히 postgres 데이터베이스 및 필요 환경을 설치하는 과정이 docker image에 모두 작성돼 있습니다. 그렇기 때문에 postgres 이미지를 실행하면 매번 처음부터 이미지가 생성되고 항상 '처음 설치 한 것 처럼' 환경이 생겨납니다. 그렇기 때문에 처음 실행할때와 두번째 실행할때의 차이는 없습니다. (사실 깊게 들어가면 환경을 종료하고 다시 실행하는 것과 중지한다음 실행하는것의 차이는 있지만 수강생님의 질문에서 중요한 포인트는 아니기 때문에 굳이 따지지는 않겠습니다). 1번에서도 답변 드렸지만 전송의 개념이 아닙니다. postgres 이미지는 매번 생성할때마다 똑같은 과정을 진행하지만 맨 처음 실행할때는 volume과 연결된 로컬 폴더가 존재하지 않기 때문에 기본 폴더 및 파일들을 직접 생성하게 되고 이는 로컬 폴더에 반영됩니다. 하지만 이미 폴더 및 파일이 존재하는경우 아마 postgres 이미지 내부에서 기본 파일들을 생성하지 않는 로직이 작성 돼있을겁니다.
이해하고 계시는 부분이 맞는지 확인 드리겠습니다.
1) 맞습니다. 하지만 말씀 드린 것 처럼 "복사"의 개념이 아닙니다.
2) 현재 실행중인 컨테이너 내부에서 CRUD 작업이 반영되는게 맞습니다. (이미지는 아닙니다. 이미지는 항상 같고 변경되지 않습니다)
3) 맞습니다.
4) 아닙니다. delete를 할 경우 실제 postgres 컨테이너 내부에서도 '실제 삭제'됩니다. 그래서 실행중에 postgres-data 폴더를 삭제하게 된다면 데이터베이스가 바보가 되는걸 확인 하실 수 있을겁니다. 그렇기 때문에 이미지를 처음부터 다시 띄워줘야 postgres image 내부에 작성된 로직들이 실행되면서 초기화가 정상적으로 됩니다.
답변이 되었길 바랍니다. 혹시 더 궁금한게 있다면 또 질문 주세요!
감사합니다!
코팩 님!! 좋은 답변 감사합니다!!
질문이 뒤죽박죽이라 의도가 전달이 안 될까 했는데 엄청 상세한 답변에 감동 받고 있습니다ㅠ
더 좋은 질문을 할 수 있도록 폭풍성장 해보겠습니다! 항상 좋은 강의 찍어주셔서 감사합니다!!