【问题标题】:docker-compose to create replication in mongoDBdocker-compose 在 mongoDB 中创建复制
【发布时间】:2019-04-30 07:54:28
【问题描述】:

我正在设置一个 docker 容器来使用 docker compose 初始化 Mongo DB 副本集。我无法完成这项工作。我创建了 docker-compose 来调用三个 mongo 实例,但我遇到了解析器问题。下面是我的 Docker-Compose 文件。

    version: '3'
    services:
     mongo-vauto-1:    
        image: "mongo-start"
        build: ./mongo-vAUTO-1
        ports:
          - "30000:27017"
        volumes:
          - ./mongo-vAUTO-1/data:/data/db
        depends_on:
          - "mongo-vauto-2"
          - "mongo-vauto-3"
    
     mongo-vauto-2:
        image: "mongo"
        command: --replSet vAUTO --smallfiles --oplogSize 128
        ports:
          - "40000:27017"
        volumes:
          - ./mongo-vAUTO-2/data:/data/db
    
     mongo-vauto-3:
        image: "mongo"
        command: --replSet vAUTO --smallfiles --oplogSize 128
        ports:
          - "50000:27017"
        volumes:
          - ./mongo-vAUTO-3/data:/data/db
    
     mongo-setup-vauto:
        image: "mongo-setup-vauto"
        build: ./setup
        depends_on:
          - "mongo-vauto-1"

调用 ./setup 文件夹中的 Dockerfile。下面是我的设置 Dockerfile

    FROM mongo

    # Create app directory
    WORKDIR vauto-docker/src/config
    
    # Install app dependencies
    COPY replicaSet.js .
    COPY setup.sh .
    
    CMD ["./setup.sh"]

调用 replicaSet.jssetup.sh。下面提供replicaSet.js 和setup.sh 文件

    # replicaSet.js
    rsconf = {
        _id : "vAUTO",
        members: [
            {_id : 0, host : "mongo-vauto-1:27017"},
            {_id : 1, host : "mongo-vauto-2:27017"},
            {_id : 2, host : "mongo-vauto-3:27017"}
        ]
    }
    rs.initiate(rsconf);
    rs.conf();


    #  setup.sh 
    echo *********************************
    echo Starting the replica set
    echo *********************************
    
    sleep 10 | echo waiting for the replica set to be intialized
    mongo mongodb://mongo-vauto-1:27017 replicaSet.js

Dockerfile 第一个副本集如下所示

    FROM mongo
    WORKDIR vauto-docker/src/config
    copy mongo.conf .
    EXPOSE 27017
    CMD ["--config","./mongo.conf"]

我的 mongo.conf 文件有以下代码

    replication:
      oplogSizeMB: 1024
      replSetName: vAUTO

我收到以下错误,

    mongo-vauto-1_1      | parse error: Invalid numeric literal at line 1, column 14
    mongo-vauto-1_1      | parse error: Invalid numeric literal at line 1, column 14
    mongo-vauto-1_1      | Error parsing YAML config file: yaml-cpp: error at line 3, column 1: illegal tab when looking for indentation

【问题讨论】:

标签: docker docker-compose dockerfile


【解决方案1】:

这是我在 3 个 mongodb 容器运行后使用第 4 个容器初始化副本集的方法:

Docker-compose 文件

    version: '3'
    services:
    
      mongodb1:
        image: mongo:latest
        networks:
          - alphanetwork
        volumes:
          - data1:/data/db
          - config1:/data/configdb
        ports:
          - 30001:27017
        entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
    
      mongodb2:
        image: mongo:latest
        networks:
          - alphanetwork
        ports:
          - 30002:27017
        entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
    
      mongodb3:
        image: mongo:latest
        networks:
          - alphanetwork
        ports:
          - 30003:27017
        entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
    
      mongoclient:
        image: mongo
        networks:
          - alphanetwork
        depends_on:
          - mongodb1
          - mongodb2
          - mongodb3
        volumes:
          - ./deployment_scripts:/deployment_scripts
        entrypoint:
          - /deployment_scripts/initiate_replica.sh
    
    networks:
      alphanetwork:
    
    volumes:
      data1:
      config1:

initiate_replica.sh

    #!/bin/bash
    
    echo "Starting replica set initialize"
    until mongo --host mongodb1 --eval "print(\"waited for connection\")"
    do
        sleep 2
    done
    echo "Connection finished"
    echo "Creating replica set"
    mongo --host mongodb1 <<EOF
    rs.initiate(
      {
        _id : 'rs0',
        members: [
          { _id : 0, host : "mongodb1:27017" },
          { _id : 1, host : "mongodb2:27017" },
          { _id : 2, host : "mongodb3:27017" }
        ]
      }
    )
    EOF
    echo "replica set created"

别忘了chmod +x ./deployment_scripts/initiate_replica.sh 给 docker 执行它的权限。

【讨论】:

  • 最佳解决方案。应该被选为正确答案。
  • 唯一有效的简单解决方案。谢谢!
  • 这非常适合我的需求!我需要用 mongo 测试事务,这让我可以在本地启动一个副本集。谢谢!
【解决方案2】:

基于@ToDevAndBeyond 解决方案,这是具有访问控制的工作解决方案(在这种情况下,该解决方案只有两个实例):

Docker-compose 文件

version: '3.5'
services:
  mongodb1:
    image: myMongoImage
    command: [ "--replSet", "rs0", "--bind_ip_all", "--keyFile", "/data/custom_config/mongodb.key", "--port", "27018" ]
    network_mode: host
    ports:
      - 27018:27018
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: <username>
      MONGO_INITDB_ROOT_PASSWORD: <password>
  mongodb2:
    image: myMongoImage
    command: sh -c 'sleep 5 && /usr/local/bin/docker-entrypoint.sh --replSet rs0 --bind_ip_all --keyFile /data/custom_config/mongodb.key --port 27019'
    network_mode: host
    ports:
      - 27019:27019
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: <username>
      MONGO_INITDB_ROOT_PASSWORD: <password>
  mongoclient:
    image: mongo:4.0.23-xenial
    network_mode: host
    depends_on:
      - mongodb1
      - mongodb2
    volumes:
      - <path_to_script_folder>:/deployment_scripts
    entrypoint:
      - /deployment_scripts/initiate_replica.sh

initiate_replica.sh

#!/bin/bash

sleep 10

echo "Starting replica set initialize"
until mongo  --username <username> --password <password> --host localhost --port 27018 --eval "print(\"waited for connection\")"
do
    sleep 2
done
echo "Connection finished"
echo "Creating replica set"
mongo  --username <username> --password <password> --host localhost --port 27018 <<EOF
rs.initiate(
  {
    _id : 'rs0',
    members: [
      { _id : 0, host : "localhost:27018" },
      { _id : 1, host : "localhost:27019" }
    ]
  }
)
EOF
echo "replica set created"

Dockerfile (myMongoImage)

FROM mongo:4.0.23-xenial

RUN cd /
RUN mkdir /data/custom_config/
RUN openssl rand -base64 741 > /data/custom_config/mongodb.key
RUN chmod 600 /data/custom_config/mongodb.key
RUN chown mongodb:mongodb /data/custom_config/mongodb.key

重要:mongodb服务器在启动过程中会启动两次;第一个 mongodb 服务器启动以创建用户并始终在端口 27017 上运行,另一个在 27018 或 27019 上运行;由于 network_mode=host,两个 docker 容器必须延迟启动,否则两者都会尝试在端口 27017 上启动服务器,而其中一个会静默失败。

如前所述,不要忘记 chmod +x ./deployment_scripts/initiate_replica.sh 给 docker 执行它的权限。

了解 ./deployment_scripts/initiate_replica.sh 的所有者和组是 mongodb (如您在 Dockerfile 中所见)可能会有所帮助

我希望这对某人有用。

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2019-10-28
    • 1970-01-01
    • 2023-03-14
    • 2017-12-28
    相关资源
    最近更新 更多