Hướng dẫn docker-compose mongodb replica set single node - docker-compose bản sao mongodb đặt nút đơn

Tôi đã phải làm một cái gì đó tương tự như xây dựng các thử nghiệm xung quanh các thay đổi chỉ có sẵn khi chạy Mongo dưới dạng bộ bản sao. Tôi không nhớ mình đã lấy cái này từ đâu, vì vậy tôi không thể giải thích chi tiết nhưng nó có hiệu quả với tôi. Đây là thiết lập của tôi:

Dockerfile

FROM mongo:5.0.3
RUN echo "rs.initiate({'_id':'rs0', members: [{'_id':1, 'host':'127.0.0.1:27017'}]});" > "/docker-entrypoint-initdb.d/init_replicaset.js"
RUN echo "12345678" > "/tmp/key.file"
RUN chmod 600 /tmp/key.file
RUN chown 999:999 /tmp/key.file

CMD ["mongod", "--replSet", "rs0", "--bind_ip_all", "--keyFile", "/tmp/key.file"]

docker-compose.yml

version: '3.7'

services:
  mongo:
    build: .
    restart: always
    ports: 
      - 27017:27017
    healthcheck:
      test: test $$(echo "rs.initiate().ok || rs.status().ok" | mongo -u admin -p pass --quiet) -eq 1
      interval: 10s
      start_period: 30s
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: pass
      MONGO_INITDB_DATABASE: test

Chạy

version: '3.7'

services:
  mongo:
    build: .
    restart: always
    ports: 
      - 27017:27017
    healthcheck:
      test: test $$(echo "rs.initiate().ok || rs.status().ok" | mongo -u admin -p pass --quiet) -eq 1
      interval: 10s
      start_period: 30s
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: pass
      MONGO_INITDB_DATABASE: test
4 và bạn nên tốt.

Chuỗi kết nối:

version: '3.7'

services:
  mongo:
    build: .
    restart: always
    ports: 
      - 27017:27017
    healthcheck:
      test: test $$(echo "rs.initiate().ok || rs.status().ok" | mongo -u admin -p pass --quiet) -eq 1
      interval: 10s
      start_period: 30s
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: pass
      MONGO_INITDB_DATABASE: test
5

Lưu ý: Bạn không nên sử dụng điều này trong sản xuất rõ ràng, điều chỉnh khóa "12345678" trong Dockerfile nếu bảo mật là một mối quan tâm.

Nếu bạn đang sử dụng MongoDB và nếu bạn giống tôi, bạn có thể sử dụng hình ảnh Docker để kiểm tra nhanh thay vì thực hiện cài đặt MongoDB đầy đủ.

May mắn thay, chạy Mongo trên Docker rất dễ dàng. Đầu tiên, hãy tải hình ảnh

docker pull mongo

Tiếp theo, nếu bạn muốn dữ liệu tồn tại, thì bạn sẽ sử dụng khối lượng Docker hoặc ánh xạ thư mục của hộp lưu trữ Mongo vào thư mục trên máy của bạn. Vì vậy, lần tới khi bạn có thể "xem" dữ liệu của bạn. Vị trí mặc định của thư mục dữ liệu MongoDB là /data /db và cổng mặc định là 27017. Để giữ cho mọi thứ đơn giản, chúng tôi sẽ sử dụng các giá trị mặc định này. Chúng tôi sẽ chạy nó trong một bộ bản sao nút duy nhất, vượt qua cờ --Eplsset được hiển thị bên dưới. Cuối cùng, để thuận tiện cho hoạt động, chúng tôi sẽ đặt tên cho hình ảnh của chúng tôi một cái gì đó để chúng tôi có thể giới thiệu nó bằng tên.

 
$ docker run -d --name gutlo-mongo -v /data/mongo:/data/db -p 27017:27017 mongo --replSet rs0

Bây giờ chúng tôi có một container docker chạy.

$ docker ps

CONTAINER ID  IMAGE   COMMAND         CREATED    STATUS    PORTS           NAMES

56468ef53d83  mongo   "docker-entrypoint.s…"  4 Seconds ago  Up 1 second   0.0.0.0:27017->27017/tcp  gutlo-mongo

Lưu ý một vài điều. ID container. Nó giống như "tên máy chủ", chúng tôi sẽ tìm ra kết nối với container trên bash prompt và tìm tên máy chủ của nó (lệnh linux/unix để tìm ra tên máy)

docker exec -it gutlo-mongo hostname
56468ef53d83h

Lưu ý lời nhắc mặc định cho biết root@ - cũng là ID container được hiển thị trong lệnh Docker PS ở trên. Bây giờ nếu bạn đang chạy container này lần đầu tiên trên máy, thư mục cơ sở dữ liệu /data /Mongo trống và nó sẽ được khởi tạo như một phần của việc bắt đầu container. Bạn sẽ phải "khởi tạo" bộ bản sao giống như bất kỳ bộ bản sao Mongo nào

mongo> rs.initiate ()

Nếu khởi tạo thành công, bạn sẽ nhận được lời nhắc rằng bạn đang ở bản sao RS0, kết nối với chính

rs0:PRIMARY>

Cho đến nay, rất tốt và mọi thứ "chỉ làm việc". Bây giờ đến bắt.

Nếu bạn dừng và tháo container, thùng chứa sẽ biến mất nhưng bộ dữ liệu của bạn - bao gồm cả bộ sưu tập lưu trữ tên của tên máy chủ hình ảnh Docker - sẽ được lưu. Vì vậy, lần tới khi bạn bắt đầu container, nó sẽ mong đợi cùng một tên máy chủ. Nhưng Docker "tạo ra" tên mỗi lần để bạn thực sự sẽ có được một tên khác. Luôn luôn

Tại sao tên máy chủ Docker lại quan trọng? Chà, bởi vì nếu bạn đang chạy một bản sao nút duy nhất trong Mongo, bộ bản sao (là một bộ nút) cần biết ai là thành viên của bộ. tức là tên máy riêng của nó. Nói cách khác, nó cần lưu trữ tên máy của nút như một thành viên. Điều này được lưu như một phần của cơ sở dữ liệu trong một bộ sưu tập hệ thống. Trong truy vấn bên dưới, hãy chú ý khóa "máy chủ" giống như lệnh tên máy chủ ở trên hoặc ID container trong Docker PS.

mongosh --quiet
rs0:PRIMARY> use local
switched to db local
rs0:PRIMARY> db.system.replset.find({},{"members":1}
{ "_id" : "rs0", "members" : [ { "_id" : 0, "host" : "56468ef53d83:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : {  }, "slaveDelay" : NumberLong(0), "votes" : 1 } ] })

Bây giờ chúng ta hãy dừng lại và khởi động lại container. Chúng tôi sẽ có một ID container khác.

$ docker rm -f gutlo-mongo
$ docker run -d --name gutlo-mongo -v /data/mongo:/data/db -p 27017:27017 mongo --replSet rs0
$docker exec -it gutlo-mongo hostname
25599e3f7780

Vì vậy, chúng tôi có một ID container / tên máy chủ mới của Docker 25599E3F7780 thay vì 55468EF53D83. Do đó, khi bạn bắt đầu Mongo, nó không phải là một phần của bản sao vì nó có tên máy chủ cũ được lưu trong repset.

Hãy chắc chắn rằng nó thực sự là trường hợp - truy vấn bộ sưu tập một lần nữa. Nếu bạn cố gắng khởi tạo bộ bản sao, bạn sẽ gặp lỗi

version: '3.7'

services:
  mongo:
    build: .
    restart: always
    ports: 
      - 27017:27017
    healthcheck:
      test: test $$(echo "rs.initiate().ok || rs.status().ok" | mongo -u admin -p pass --quiet) -eq 1
      interval: 10s
      start_period: 30s
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: pass
      MONGO_INITDB_DATABASE: test
0

Bây giờ chúng ta cần thay đổi tên máy chủ thành tên máy chủ Docker mới. Trong cuộc sống thực, điều này tương tự như di chuyển bản sao của bạn từ máy này sang máy khác. Có một bước đơn giản được mô tả trong Hướng dẫn sử dụng MongoDB.

Dưới đây là một tập lệnh shell nhỏ mà bạn có thể chạy trong thùng chứa MongoDB của mình mỗi khi nó được đưa lên - với một tên máy chủ mới. Hãy nhớ lại rằng Mongo Shell cho phép sử dụng biến môi trường UNIX

version: '3.7'

services:
  mongo:
    build: .
    restart: always
    ports: 
      - 27017:27017
    healthcheck:
      test: test $$(echo "rs.initiate().ok || rs.status().ok" | mongo -u admin -p pass --quiet) -eq 1
      interval: 10s
      start_period: 30s
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: pass
      MONGO_INITDB_DATABASE: test
1
version: '3.7'

services:
  mongo:
    build: .
    restart: always
    ports: 
      - 27017:27017
    healthcheck:
      test: test $$(echo "rs.initiate().ok || rs.status().ok" | mongo -u admin -p pass --quiet) -eq 1
      interval: 10s
      start_period: 30s
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: pass
      MONGO_INITDB_DATABASE: test
2

Bây giờ tập lệnh trên cần được chạy từ vỏ container Docker để nó nắm bắt được tên máy chủ thích hợp. Vì vậy, nó cần phải được sao chép ở đó trước.

version: '3.7'

services:
  mongo:
    build: .
    restart: always
    ports: 
      - 27017:27017
    healthcheck:
      test: test $$(echo "rs.initiate().ok || rs.status().ok" | mongo -u admin -p pass --quiet) -eq 1
      interval: 10s
      start_period: 30s
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: pass
      MONGO_INITDB_DATABASE: test
3

Voila!

Bây giờ bạn đã trở lại trong bộ bản sao và có thể xem cùng một dữ liệu đã lưu!

Tại sao điều quan trọng là chạy trong bộ bản sao?

Vâng, vì có một số tính năng nhất định như Stream Stream rất hữu ích trong việc thực hiện CDC từ Mongo đến một số cơ sở dữ liệu khác, chỉ có thể được sử dụng ở chế độ bản sao.

Thêm vào đó - "hoàn toàn cho niềm vui" cũng là một lý do chính đáng.

Vui lòng cho tôi biết nếu bạn có bất kỳ ý kiến ​​hoặc đề xuất nào - tất cả các bình luận - đều được chào đón!