inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

개발자를 위한 쉬운 도커

3Tier 아키텍처 구성

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

해결된 질문

529

Jin Heung An

작성한 질문수 3

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개의 도커 볼륨에 동시에 마운트하여 사용하면 동기화가 되지 않고, 새로운 컨테이너를 생성하여 도커 볼륨에 마운트하면 정상적으로 동기화가 됩니다.

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

docker 가상화 ci/cd docker-compose github-actions docker-volume container

답변 1

1

황현우

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

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

 

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

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

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

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

 

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

 

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

 

 

 

0

Jin Heung An

감사합니다!

33강 도커 빌드 강의의 docker file

0

37

1

개발환경에서 도커 설정

1

101

2

vscode 터미널 설정 관련 질문

0

103

1

쿠버네티스 강의 언제 나오나요..

2

128

2

postgresql-repmgr:15 지원 종료에 따른 대체 이미지 변경 질문드립니다!

1

186

2

섹션 9. 레이어 관리에서 alpine OS 사용 관련 질문 있습니다!

1

72

2

도커 가상 네트워크와 Stateless 특징 관련 질문

1

74

2

우분투 설치

0

71

2

도커 보안을 실무에서 어떻게 대비하시는지 궁금합니다.

1

240

2

컨테이너를 활용한 개발환경 통일에 관하여

1

96

2

k8s 강의 일정

1

114

2

컨테이너의 Stateless 제약 관련 질문

0

98

1

docker push 하는 중 "single-platform image ..." 메세지가 나오고, docker hub에 image와 tag가 정상적으로 등록되지 않습니다.

2

100

1

docker pull [이미지] 다운로드시 에러 해결 방법 문의

1

444

2

강의 재생 오류

1

88

1

Remote JVM Debug Setting

1

105

1

빌드 방식에 대해 질문 있습니다.

1

104

2

컨테이너 레이어 질문 있습니다.

1

106

1

컨테이너 가상화 호스트 OS

1

156

2

강의 이미지 사용

1

168

2

도커컴포즈 오류

0

163

2

USER 명령어와 관련하여 질문드립니다

1

112

1

강의 예정

1

178

2

실행오류

1

214

3