MongoDB Transactions in Docker: Why They Fail & How to Fix
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

MongoDB 트랜잭션이 Docker에서 작동하지 않는 이유와 해결 방법

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

인프라/DevOps/보안

대상자

MongoDB와 Docker를 사용하는 개발자, DevOps 엔지니어.

난이도: 중간 (Docker와 MongoDB 기초 지식 필요)

핵심 요약

  • 트랜잭션 지원을 위해 MongoDB는 복제 집합(replica set)이 필수 (단일 노드도 포함)
  • startSession()/startTransaction() 사용 시 복제 집합 구성이 전제
  • 보안 강화를 위한 keyfile 기반 인증 및 app-scoped 사용자 생성 필수

섹션별 세부 요약

1. MongoDB 트랜잭션의 기본 원리

  • 복제 집합은 주/부 서버 간 데이터 동기화와 일관성을 보장
  • 트랜잭션 실행 조건:

- 다중 문서/컬렉션 간 원자성 (atomicity)

- 노드 간 쓰기 순서 동의 (write-order agreement)

- 오류 시 롤백(rollback) 가능

  • 단일 서버는 트랜잭션을 보장할 수 없음

2. Docker 환경에서 복제 집합 구성

  • keyfile 생성 및 보안 설정:

```bash

openssl rand -base64 756 > mongo-keyfile

chmod 400 mongo-keyfile

```

  • Docker 컨테이너 실행 명령:

```bash

docker run -d --name mongo-rs --hostname mongo-rs -p 27017:27017 \

-v /full/path/mongo-keyfile:/etc/mongo/keyfile:ro \

-e MONGO_INITDB_ROOT_USERNAME=adminuser \

-e MONGO_INITDB_ROOT_PASSWORD=StrongP@ssw0rd! \

-e MONGO_INITDB_DATABASE=test \

mongo:latest \

--replSet rs0 --auth --keyFile /etc/mongo/keyfile --bind_ip_all

```

  • --replSet rs0: 복제 집합 이름 지정
  • --keyFile: 내부 인증용 공유 비밀키 적용

3. 복제 집합 초기화 및 사용자 생성

  • MongoDB shell을 통한 복제 집합 초기화:

```bash

docker exec -it mongo-rs mongosh -u adminuser -p StrongP@ssw0rd! --authenticationDatabase admin --eval 'rs.initiate({_id: "rs0", members: [{_id: 0, host: "127.0.0.1:27017"}]})'

```

  • 앱용 사용자 생성:

```bash

use test

db.createUser({user: "appuser", pwd: "AppP@ssw0rd!", roles: [{role: "readWrite", db: "test"}]})

```

4. 애플리케이션 연결 설정

  • 환경 변수 설정:

```env

MONGO_URI="mongodb://appuser:AppP%40ssw0rd!@localhost:27017/test?authSource=test&replicaSet=rs0"

```

  • Mongoose 연결 코드:

```javascript

mongoose.connect(process.env.MONGO_URI, {

useNewUrlParser: true,

useUnifiedTopology: true,

serverSelectionTimeoutMS: 2000

})

```

  • replicaSet=rs0: 복제 집합 프로토콜 활성화

결론

  • MongoDB 트랜잭션을 Docker에서 사용하려면 복제 집합 구성인증 설정이 필수적
  • keyfile 기반 인증 및 별도 앱 사용자 생성을 통해 보안 강화
  • MONGO_URIreplicaSet=rs0 파라미터 추가로 트랜잭션 기능 활성화