yaml

version: "3.8"

volumes:
  mongo-db-local: { }

services:
  mongo-1:
    image: mongo
    container_name: my-mongo-1
    ports:
      - "30000:30000"
    volumes:
      - mongo-db-local:/data1/db
    command: mongod --replSet anna-replSet --port 30000 --bind_ip_all

  mongo-2:
    image: mongo
    container_name: my-mongo-2
    ports:
      - "30001:30001"
    volumes:
      - mongo-db-local:/data2/db
    command: mongod --replSet anna-replSet --port 30001 --bind_ip_all

  mongo-3:
    image: mongo
    container_name: my-mongo-2
    ports:
      - "30002:30002"
    volumes:
      - mongo-db-local:/data3/db
    command: mongod --replSet anna-replSet --port 30002 --bind_ip_all

  mongo-setup:
    image: mongo
    depends_on:
      - mongo-1
      - mongo-2
      - mongo-3
    restart: "no"
    entrypoint: ["bash", "-c", "sleep 5 && mongo --host my-mongo-1:30000 --eval 'rs.initiate({\"_id\":\"anna-replSet\",\"members\":[{\"_id\":0,\"host\":\"my-mongo-1:30000\"},{\"_id\":1,\"host\":\"my-mongo-2:30001\"},{\"_id\":2,\"host\":\"my-mongo-3:30002\"}]})'"]

 

커맨드

docker-compose -f local-mongo.yaml -p local-mongo up -d

 

레플리카셋 구성까지 잘 되지만 완전하지 않다. MongoDB Compass로 레플리카셋 접속을 하기 위해서는 로컬의 /etc/hosts 파일에 아래 내용을 추가해주어야 한다.

my-mongo-1 127.0.0.1
my-mongo-2 127.0.0.1
my-mongo-3 127.0.0.1

 

 

이 작업을 하지 않으면 my-mongo-{n} 호스트를 찾을 수 없다는 따위의 오류가 발생한다. 커넥션 url에 "localhost" 를 사용해도 이 오류가 표시된다. 오류 내용으로 추측건대, MongoDB Compass는 먼저 지정된 노드로 접근하여 레플리카셋 정보를 쿼리하고 그 안의 호스트 이름으로 접근을 시도하는 것 같다. 몽고디비가 가진 레플리카셋 정보에는 rs.initiate()에 인자로 넘긴 호스트 정보가 담겨있기에, "my-mongo-1" 를 반환하는데, 이게 MongoDB Compass는 이게 로컬호스트인지  알 수 없다. 때문에 위 작업이 필요한 것이다.

반면 스프링부트를 사용한 몽고디비 연결 시에는 localhost 로 지정해도 연결이 잘 된다. 아마 둘의 연결 방식에 차이가 있는 것 같다.

 

====

아래 내용을 몰랐다가 굉장히 고생했다. 역시 쉽게쉽게 가려고 하면 더 힘들어진다....

 

- Docker Compose는 기본적으로 하나의 default network를 생성하고, 각 서비스(컨테이너)는 이 네트워크에 조인한다. 때문에 별도 설정 없이도 컨테이너끼리 자신의 이름을 통해 서로를 식별하고 접근할 수 있다.

 

- network_mode: "host" 를 사용하면 컨테이너끼리는 "localhost"로 통신 가능하지만, 브라우저 등 컨테이너 외부로부터의 localhost 호출은 불가능하다. 알아본 바에 의하면, mac에서의 도커는 리눅스 버추얼머신을 사용하며, 컨테이너는 이 안에 위치한다. network_mode: "host" 설정은 이 버추얼머신 안에서만 유효하기 때문에, 함께 버추얼머신 안에 위치한 컨테이너끼리는 서로 접근 가능하지만 외부에서는 접근이 불가능하다. 이 network_mode: "host"의 사용 목적에 완전히 반하는 동작으로 보인다. (다른 os는 확인하지 않음)

 

 

'DB > MongoDB' 카테고리의 다른 글

도커로 레플리카셋 구성하기  (0) 2022.07.14
트랜잭션에 관하여  (0) 2022.07.14

+ Recent posts