Jocx's blog

来了就先看看吧,没准有用呢?

0%

【实践】Docker配置MongoDB

Docker配置MongoDB

内容摘要

本文详细地描述了在CentOS 8上用docker部署MongoDB,并用studio-3T远程连接数据库的方法。并且根据可能会产生的问题提出了详细的解决方案。

前言

  1. 首先需要有Docker。如果没有,可以查阅Dokcer安装
  2. 读者需要学会docker的基本使用,包括挂载数据卷和配置虚拟网桥。如果没有,可以查阅Docker的理解与入门使用

系统环境

腾讯云4核4G轻量级服务器;CentOS 8

正文

  1. 进入Docker Hub注册dockerhub的账号并寻找mongo镜像,注册好后直接在搜索框里面搜索关键词mongo,获取命令

    1
    docker pull mongo
  2. 利用1中的命令拉取镜像可以用以下命令查看拉取的镜像。

    1
    docker images
  3. 从镜像文档里面可知,该镜像的映射端口是27017,配置文件在/data/configdb,数据库文件在/data/db里面。两个都是在容器里。

    这些文件实际上是需要存在于容器的对应目录下面的,所以如果在宿主机目录下每页找到,不用急,继续往下做就行。

    需要配置挂载卷:

    1. 配置挂在卷的目录:

      1
      2
      3
      4
      5
      6
      7
      # 创建目录
      $ mkdir -p /var/lib/mongo/conf
      $ mkdir -p /var/lib/mongo/logs
      $ mkdir -p /var/lib/mongo/db

      # 配置权限
      chmod -R a+rwx /var/lib/mongo/
    2. 创建配置文件并配置:

      1
      $ vi /var/lib/mongo/conf/mongod.conf

      配置文件如下: mongodb配置详解(英文)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      storage:
      dbPath: /data/mongo/db
      # indexBuildRetry: true # 如果mongoDB版本高于或等于4.4就不需要这行
      journal:
      enabled: true
      commitIntervalMs: 100

      # where to write logging data.
      systemLog:
      path: /data/mongo/logs/mongod.log
      logAppend: false
      logRotate: rename
      destination: file

      # network interfaces
      net:
      port: 27017
      bindIp: 你的IP
      bindIpAll: true
      • 注意: 配置远程连接(如studio-3T)的话,需要将这里的bindIP配置成0.0.0.0;
  4. 带认证地启动mongo镜像 虽然/data下面没有任何文件,但是在启动方面并没有出现问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    docker run --name mongo \
    --restart=unless-stopped \
    -v /var/lib/mongo:/data/mongo \
    -p 27017:27017 \
    -d \
    --network datanet \
    --network-alias mongo mongo \
    --config /data/mongo/conf/mongod.conf \
    --auth
    • 这一步我们配置了一个 容器名为mongo; 将宿主机的/var/lib/mongo目录挂载到容器/data/mongo; 将宿主机的27017端口映射到容器27017端口; 连接到虚拟网桥datanet且虚拟网桥中名称为mongo; 的MongoDB容器。

    启动后可以用以下命令查看结果:

    1
    2
    3
    docker ps -a  # 查看所有容器状态,包括是否在运行

    docker logs 容器ID # 查看日志,以便于找到问题
  5. 创建管理员账号和普通员工账号 登录mongo数据库

    1
    docker exec -it mongo mongo admin

    创建管理员用户

    1
    db.createUser({ user: 'nameOfAdmin', pwd: 'pwdOfAdmin', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
    • 这里的nameOfAdminpwdOfAdmin填写成你自己的想设置的管理员用户名和密码即可。

    登录数据库以便于授权

    1
    db.auth("nameOfAdmin","pwdOfAdmin");

    切换普通数据库(没有回自动创建),创建普通用户

    1
    2
    3
    use test

    db.createUser({ user: 'test', pwd: '123456', roles: [{ role: "readWrite", db: "test" }] });
  6. 尝试在外界用studio-3T连接docker。(需要提前下载studio-3T软件(Robo-3T已经和studio-3T合并,全部免费了)) 主要要在云服务器安全组策略里面添加对应端口,比如这里开的就是27017.

读者可能遇到的问题

镜像下载速度太慢

因为docker hub的服务器在国外,所以可以通过获取阿里云的docker加速器解决。

  1. 进入阿里云镜像仓库获取镜像加速器;创建个人/企业实例后进入镜像工具-镜像加速器,复制加速器地址

  2. 进入/etc/docker/daemon.json添加地址(如果没有则在该目录下新建一个配置文件)

    1
    2
    3
    4
    5
    6
    7
    8
    vi /etc/docker/daemon.json

    # 文件内容
    {
    "registry-mirrors": ["https://xxxxxxx.aliyuncs.com"]
    }

    # 保存并关闭
    • 这里的url是你自己的url

    重启docker并使其生效

    1
    2
    systemctl daemon-reload
    systemctl restart docker

    配置完成,可以快速下载docker镜像了。

外部studio-3T无法连接

问题描述

无法在外界()通过studio-3T连接上云服务器docker环境下的mongodb。但在云服务器本身上面可以

以下方法可以检验是否是数据库的问题:

1
2
3
4
5
# 进入mongo中的admin数据库
docker exec -it mongo mongo admin

# 用账号密码登录admin数据库,结果会返回1(正常)
db.auth('hrxtest','hrx@123')

等命令进入admin数据库,如果返回结果正常就不是数据库的问题,而是网络问题

解决方案

连接超时还有可能是安全组没有开或者配置文件里的bindIp没有设置成0.0.0.0,但是我没有控制变量试验过。可以检查一下。

-------------本文结束 感谢您的阅读-------------