沙足 發表於 2020-12-30 04:33:00

使用Docker 部署MongoDB

<h1 id="使用-docker-部署-mongodb">使用 Docker 部署 MongoDB</h1>
<p>查看官网安装教程后感觉直接使用包管理器安装mongo比较复杂,本文主要介绍使用docker安装部署mongo的方法,并对基本配置项进行自定义。保姆式全程指导。</p>
<h2 id="1-使用-docker">1 使用 Docker</h2>
<p>已经有Docker运行环境的同学可以跳过这一步</p>
<h3 id="11-在windows-10-使用-docker-desktop">1.1 在Windows 10 使用 Docker Desktop</h3>
<p>Docker官方推荐在Windows上使用Docker Desktop。首先下载该软件:</p>
<pre><code>https://www.docker.com/get-started
</code></pre>
<p>选择Download for Windows,下载完成后按提示安装即可。安装期间可能会提示同时安装WSL2内核,同意即可。</p>
<p>安装完成后可能需要重启电脑,之后便会看到任务栏中出现Docker图标。打开Powershell运行docker,会出现使用提示。</p>
<p><img src="https://img2020.cnblogs.com/blog/1652164/202012/1652164-20201230043235968-1242046287.png" alt="image-20201230021821572" loading="lazy"></p>
<h3 id="12-ubuntu-使用-docker-ce">1.2 Ubuntu 使用 Docker-CE</h3>
<p>Docker-CE即Community Edition,是可供个人免费使用的docker社区版本。</p>
<p>在Ubuntu安装Docker-CE时,推荐使用阿里云提供的镜像,可以加快安装下载速度</p>
<ol>
<li>首先apt刷新缓存,并安装一些必要的工具</li>
</ol>
<pre><code class="language-bash">sudo apt update
sudo apt -y install apt-transport-https ca-certificates curl software-properties-common
</code></pre>
<ol start="2">
<li>然后添加证书</li>
</ol>
<pre><code class="language-bash">curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
</code></pre>
<ol start="3">
<li>向apt包管理器添加用于安装Docker-CE的源地址,此处使用阿里云提供的地址</li>
</ol>
<pre><code class="language-bash">sudo add-apt-repository "deb http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
</code></pre>
<ol start="4">
<li>使用apt安装Docker-CE</li>
</ol>
<pre><code class="language-bash">sudo apt -y update
sudo apt -y install docker-ce
</code></pre>
<ol start="5">
<li>打开终端输入docker,可以看到使用提示</li>
</ol>
<h2 id="2-换源">2 换源</h2>
<p>由于Docker默认使用的是hub.docker.com提供的镜像,在国内连接速度较慢,因此建议使用国内镜像。</p>
<p><strong>如果使用的是Docker Desktop:</strong></p>
<p>点击任务栏上的docker小图标,然后点击设置的齿轮按钮,在Docker Engine选项中,在registry- mirrors中加入镜像地址,此处使用的是网易提供的镜像。然后点击Apply &amp; Restart 按钮</p>
<p><img src="https://img2020.cnblogs.com/blog/1652164/202012/1652164-20201230043238296-835886047.png" alt="image-20201230022746383" loading="lazy"></p>
<p><strong>如果使用的是Docker-CE:</strong></p>
<p>在终端中运行以下命令来修改/etc/docker/daemon.json即可:</p>
<pre><code class="language-bash">sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json &lt;&lt;-'EOF'
{
"registry-mirrors": ["https://hub-mirror.c.163.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
</code></pre>
<h2 id="3-创建-mongo-容器">3 创建 mongo 容器</h2>
<p>打开终端(Powershell on Windows &amp; bash on Linux,<strong>Linux可能需要使用sudo</strong>)</p>
<pre><code>docker pull mongo
</code></pre>
<p>等待镜像下载完成,接下来正式制作mongodb容器。</p>
<pre><code class="language-bash">docker run -it --name mongodb1 \
-e MONGO_INITDB_ROOT_USERNAME=mongoroot \
-eMONGO_INITDB_ROOT_PASSWORD=VdikAfsMhx7 \
-v /home/share/mongodb:/data/db \
-p 10001:27017 -d mongo
</code></pre>
<p>下面是参数解释:</p>
<p><strong>-it</strong></p>
<p>[必需] 指的是为容器分配一个终端,一般来说都会加上这个参数</p>
<p><strong>--name</strong></p>
<p>为这个容器添加一个别名</p>
<p><strong>-e MONGO_INITDB_ROOT_USERNAME</strong></p>
<p>[建议] 创建mongodb的root权限用户,设置用户名</p>
<p><strong>-e MONGO_INITDB_ROOT_PASSWORD</strong></p>
<p>[建议] 设置上述拥有root权限的用户的密码</p>
<p><strong>-v /home/share/mongodb:/data/db</strong></p>
<p>[可选] 磁盘映射,将容器内的/data/db文件夹的内容映射到本机的/home/share/mongodb文件夹内。这样之后需要备份文件或者做文件分析、逆向分析时就可以直接在本机上操作,不需要先进入容器再从容器中把文件复制出来</p>
<p><strong>-p 10001:27012</strong></p>
<p>[必需] 与MySQL不同,mongodb默认使用的端口号为TCP27012,因此在端口映射时需要注意。端口影射时,冒号前的是本机端口,冒号后的是容器端口,这个参数的意思时,将容器内27012端口映射到本机的10001端口上,之后访问本机的10001端口,即可连接到容器内mongodb的27012端口</p>
<p><strong>-d</strong></p>
<p>[必需] 在后台运行容器。运行这条指令后,容器将在后台运行,终端返回该容器的ID</p>
<h2 id="4-使用-mongo">4 使用 mongo</h2>
<p>容器创建好后,使用exec进入容器中。实际上,现在mongo已经开始运行,使用navicat、</p>
<p>MongoDB Shell等工具都可以连接这个数据库。直接进入容器内操作mongo比较简便。</p>
<p><strong>(以下命令在Linux运行时可能需要加sudo)</strong></p>
<p>首先查看当前运行中的容器</p>
<pre><code class="language-bash">docker ps
</code></pre>
<p>理论上会看到所有正在运行中的容器ID,使用的镜像,映射到的端口,以及容器的名字。</p>
<p><img src="https://img2020.cnblogs.com/blog/1652164/202012/1652164-20201230043238519-1156813352.png" alt="image-20201230033827336" loading="lazy"></p>
<p>使用容器ID或者容器别名都可以连接到这个容器,例如:</p>
<pre><code class="language-bash">docker exec -it mongodb1 /bin/bash
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1652164/202012/1652164-20201230043238713-1555765679.png" alt="image-20201230033900705" loading="lazy"></p>
<p>可以看到已经进入容器内部。然后使用mongo命令操作数据库:</p>
<pre><code class="language-bash">mongo -u mongoroot
</code></pre>
<p>此处<strong>-u</strong> 后写刚才创建容器时设定的root权限用户的用户名,随后根据提示输入密码</p>
<p>需要注意的是,输入密码的过程中,密码是不会在终端上显示的,输入之后直接按回车键即可。</p>
<p><img src="https://img2020.cnblogs.com/blog/1652164/202012/1652164-20201230043238894-229579538.png" alt="image-20201230034054728" loading="lazy"></p>
<p>成功进入MongoDB Shell:</p>
<p><img src="https://img2020.cnblogs.com/blog/1652164/202012/1652164-20201230043239170-1371519273.png" alt="image-20201230034410104" loading="lazy"></p>
<h2 id="5-配置-mongo">5 配置 mongo</h2>
<p>mongo的常见操作:</p>
<table>
<thead>
<tr>
<th>MongoDB Shell 命令</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>show dbs</td>
<td>展示所有数据库</td>
</tr>
<tr>
<td>use test</td>
<td>使用test数据库(如果没有则新建test数据库)</td>
</tr>
<tr>
<td>show collections</td>
<td>查看当前数据库内的集合</td>
</tr>
<tr>
<td>db.createCollection("Students")</td>
<td>在当前数据库内创建名为Students的集合</td>
</tr>
<tr>
<td>db.Students.insert(文档)</td>
<td>在Students集合中插入文档(文档具体格式后文详述)</td>
</tr>
<tr>
<td>db.Students.find()</td>
<td>查看Students集合中所有文档的所有内容</td>
</tr>
</tbody>
</table>
<p>实际使用过程中,只有一个root权限的用户是不行的,因此需要对数据库进行用户权限设置。</p>
<p>接下来创建一个数据库mathgroup,并创建一个用户leader,配置leader的权限。</p>
<p>由于之前不存在mathgroup数据库,因此首先使用use命令创建这个数据库:</p>
<pre><code>use mathgroup
</code></pre>
<p>在数据库中随意加入一些数据:</p>
<pre><code class="language-sql">db.Questions.insert({"cate":"Easy", "Content":"1+1=?", "Answer":"2"})
</code></pre>
<p>查看Question集合中的内容:</p>
<pre><code class="language-sql">db.Questions.find()
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1652164/202012/1652164-20201230043239370-963107871.png" alt="image-20201230035808332" loading="lazy"></p>
<p>mongo会给每个文档自动添加"_id",提供一个类似主键(唯一序号)的功能</p>
<p>接下来创建用户leader,并为其赋予该数据库的管理权限:</p>
<pre><code class="language-sql">db.createUser({user:"leader", pwd:"123456", roles:[{role: "dbAdmin", db: "mathgroup"}]})
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1652164/202012/1652164-20201230043239556-1368515819.png" alt="image-20201230040242494" loading="lazy"></p>
<p>下一次连接mongodb时,使用leader用户连接:</p>
<pre><code>mongo -u leader --authenticationDatabase "mathgroup"
</code></pre>
<p>输入密码后查看所有数据库:</p>
<pre><code>show dbs
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1652164/202012/1652164-20201230043239772-1580193955.png" alt="image-20201230041016922" loading="lazy"></p>
<p>发现只能看到mathgroup数据库</p>
<h2 id="6-其他">6 其他</h2>
<p>mongodb是NoSQL数据库,MySQL中的表table类似于mongo中的集合collection,mongo的集合中可以保存很多文档,文档一般是json形式,这意味着可以用json的形式在mongo中保存各式各样的内容。</p>
<p>关于文档:https://www.runoob.com/mongodb/mongodb-insert.html</p>
<p>mongodb的用户控制实际上非常复杂(官方承认),但正因如此,我们可以为各种不同的场景制定合适的访问策略</p>
<p>关于用户角色【文档】:https://docs.mongodb.com/manual/reference/built-in-roles/</p>
<p>关于用户角色【博客】:https://www.cnblogs.com/swordfall/p/10841418.html</p>
<p>你可以在Java、Python等主流语言中使用mongo,使用时主要的步骤大同小异:连接mongo,选定数据库、用户认证、检索数据库、得到数据、关闭连接。下面是一个使用Python连接Mongo的示例:</p>
<pre><code class="language-python">import json
import pymongo

def seekFile(fileName) -&gt; dict:
    """
    Get a dict by filename from Mongodb Data Server

    :param fileName: The name of the file you want from mongodb
    :return: dict
    """
    client = pymongo.MongoClient(host='IP Address', port=27017)

    db = client.数据库名
    db.authenticate("用户名", "密码")
    collection = db.集合名

    result = collection.find_one({"fileName": "{0}".format(fileName)})

    client.close()
    return result

if __name == '__main__':
    print(seekFile("John"))
</code></pre><br><br>
来源:https://www.cnblogs.com/soowin/p/14209581.html
頁: [1]
查看完整版本: 使用Docker 部署MongoDB