인프런 커뮤니티 질문&답변

Jin Heung An님의 프로필 이미지

작성한 질문수

개발자를 위한 쉬운 도커

3Tier 아키텍처 구성

여러 개의 컨테이너가 1개의 도커 볼륨에 접근할 때 일관성 문제

해결된 질문

작성

·

359

·

수정됨

1

여러 개의 컨테이너가 하나의 볼륨을 공유할 수 있다는 특징에 따라 다음과 같이 작성했습니다.

 

도커 볼륨 생성

docker volume create myvolume

컨테이너A 생성

docker run -d --name my-containerA -e POSTGRES_PASSWORD=password -v myvolume:/var/lib/postgresql/data postgres:13

컨테이너B 생성

docker run -d --name my-containerB -e POSTGRES_PASSWORD=password -v myvolume:/var/lib/postgresql/data postgres:13

컨테이너A에서 새로운 DB 생성

docker exec -it my-containerA psql -U postgres -c "CREATE DATABASE mydb;"

컨테이너A에서 DB 조회

docker exec -it my-containerA psql -U postgres -c "\list"

스크린샷 2024-02-19 오후 9.28.42.png

컨테이너A에서 DB를 생성하고 조회하면 정상적으로 조회가 되는데, 컨테이너B에서 DB를 조회하면 mydb가 생성되지 않은 채로 보이네요.

일관성 유지를 위해 두 컨테이너에서 정상적으로 조회가 될 줄 알았는데 컨테이너B에는 새로운 DB를 생성한 게 동기화가 안되네요..

근데 새로운 컨테이너C를 생성하여 DB를 조회하면 정상적으로 조회가 됩니다.

 

위 내용을 정리하면 여러 개의 컨테이너가 1개의 도커 볼륨에 동시에 마운트하여 사용하면 동기화가 되지 않고, 새로운 컨테이너를 생성하여 도커 볼륨에 마운트하면 정상적으로 동기화가 됩니다.

이런 경우에는 어떻게 해결하나요?

답변 1

1

데브위키님의 프로필 이미지
데브위키
지식공유자

2024. 02. 20. 02:37

Jin Heung An 님 안녕하세요. 데브위키입니다.

먼저 실습하신 코드의 볼륨과 컨테이너는 잘 구성이 되어 있습니다.

 

문제는 Postgres 소프트웨어의 동작 방식 때문인 것으로 보입니다.

생성한 DB가 /var/lib/postgresql/data 경로에 존재하더라도, 단순히 파일시스템에 대한 공유외에 Postgres 인스턴스가 실행 중일 때 메타데이터와 상태 정보를 메모리에 별도로 가지고 있기 때문입니다. 그래서 한 인스턴스에서 데이터베이스 변경/추가가 발생해도, 다른 인스턴스는 메모리에는 변경사항이 없기 때문에 이를 인식하지 못하게 됩니다.

그리고 Postgres는 컨테이너를 실행할 때 파일시스템의 내용을 기준으로 메모리를 로드하는데, 그래서 containerC 같이 파일시스템에 변경사항이 일어난 뒤에 실행되는 DB는 정상으로 보이는 것입니다.

결국 단일 볼륨을 사용하는 이중화 DB구조는 별도의 동기화 로직을 거쳐야 하기 때문에, 사실상 권장되는 방법은 아닙니다. 제가 TOPIC 5에 단일 볼륨으로 사용이 가능하다고 말씀드렸는데, 말씀해주신 내용을 확인해보니 설명에 오류가 있습니다. 동시에 같은 볼륨을 사용하는 케이스는 제거하는 것으로 강의를 수정하겠습니다.

 

정리하자면 여러 개의 컨테이너가 하나의 볼륨을 공유할 수 있다는 특징은 맞는 개념이고 Postgres와 같은 DB에서는 파일 내용은 변하지만 DBMS가 이를 인식하지 못한다고 보시면 될 것 같습니다!

 

좋은 질문 감사드리며 혹시 이해가 되지 않는 부분이 있으면 추가로 댓글 부탁드립니다 😀

 

 

 

Jin Heung An님의 프로필 이미지
Jin Heung An
질문자

2024. 02. 20. 11:01

감사합니다!