【问题标题】:Need some advice dockerizing MongoDB需要一些建议 dockerizing MongoDB
【发布时间】:2016-11-01 21:05:06
【问题描述】:

我正在使用 MongoDB 和 Docker,此时我正在尝试创建一个有用的图像供自己在工作中使用。我创建了以下Dockerfile

FROM mongo:2.6
VOLUME /data/db /data/configdb
CMD ["mongod"]
EXPOSE 27017

我已将其添加到我的docker-compose.yml 文件中:

version: '2'
services:
    ### PHP/Apache Container
    php-apache:
        container_name: "php55-dev"
        image: reynierpm/php55-dev
        ports:
            - "80:80"
        environment:
            PHP_ERROR_REPORTING: 'E_ALL & ~E_DEPRECATED & ~E_NOTICE'
        volumes:
            - ~/mmi:/var/www
            - ~/data:/data
        links:
            - mongodb
    ### MongoDB Container
    mongodb:
        container_name: "mongodb"
        build: ./mongo
        environment:
            MONGODB_USER: "xxxx"
            MONGODB_DATABASE: "xxxx"
            MONGODB_PASS: "xxxx"
        ports:
            - "27017:27017"
        volumes:
            - ~/data/mongo:/data/db

我对我所做的这个设置有一些疑问:

  • 我需要VOLUME /data/db /data/configdb Dockerfile 还是足以让~/data/mongo:/data/configdb docker-compose.yml 有这条线?
  • 我假设(我从here 获取)一旦我构建了 Mongo 映像,我将创建一个数据库并使用密码为用户提供完全权限,因为它在环境变量上?我是对的? (我找不到任何有用的东西here
  • 如何将当前的 mongo 备份(多个 JSON 文件)导入应在 mongo 容器上创建的数据库?我相信我需要运行mongorestore 命令,但如何?我需要创建一个脚本并在每次容器启动时运行它吗?或者我应该在图像构建期间运行?最好的方法是什么?

【问题讨论】:

    标签: mongodb docker docker-compose dockerfile


    【解决方案1】:

    我是否需要 Dockerfile 中的 VOLUME /data/db /data/configdb 或者在 docker-compose.yml 中有这行 ~/data/mongo:/data/configdb 就足够了?

    VOLUME 在挂载主机目录时不是必需的,但它作为元数据很有帮助。 VOLUME 在挂载 Docker 卷(非主机目录)时确实提供了一些特殊的“创建卷时复制数据”语义,这会影响您的数据初始化方法选择。

    我假设(并且我从这里获取)一旦我构建了 Mongo 映像,我将创建一个数据库并使用密码为用户提供完全权限,因为它在环境变量中?我是对的? (我在这里找不到任何有用的东西)

    MONGO_USERMONGO_DATABASEMONGO_PASS 不对 official mongo Docker imagemongod 本身执行任何操作。

    mongo 镜像增加了对类似环境变量的支持:

    • MONGO_INITDB_ROOT_USERNAME
    • MONGO_INITDB_ROOT_PASSWORD
    • MONGO_INITDB_DATABASE

    如何将当前的 mongo 备份(多个 JSON 文件)导入应在 mongo 容器上创建的数据库?我相信我需要运行 mongorestore 命令,但如何?我需要创建一个脚本并在每次容器启动时运行它吗?或者我应该在图像构建期间运行?最好的方法是什么?

    是否在构建或运行时初始化数据取决于您的使用情况。如前所述,Docker 可以将数据从指定的VOLUME 复制到它创建的卷中。如果要挂载主机目录,则可能需要在运行时进行初始化。

    mongorestore 需要一个正在运行的服务器才能恢复。在构建期间,您需要launch the server and restore in the same RUN step。在运行时,您可能需要包含一个启动脚本来检查您的数据库是否存在。

    Mongo 能够将任何空目录初始化为空白 mongo 实例,因此您无需担心 mongo 无法启动。

    【讨论】:

    • 我尝试从 Ansible 开始,但是对于单个任务来说太多了,如果它还在增长,我可能会再考虑一次。即使我接受你的答案是正确的,你能否改进它,为 bash 添加一个简单的脚本示例,允许创建数据库并添加用户?我不知道
    猜你喜欢
    • 2017-09-28
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 2014-12-16
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多