MongoDB是一个基于文档的NoSQL数据库,适合于大量数据存储。MongoDB没有像传统关系型数据库那样使用表和行,而是使用了集合和文档。文档由键值对组成,是MongoDB的基本数据单位。在本教程中,我们将使用Docker来启动一个运行MongoDB的容器。一旦它在容器中启动并运行,我们就可以用shell连接到它,并测试一些常见的Mongo命令。
在Docker中启动MongoDB
随着[Docker]的安装和运行,使用这里的命令可以启动Mongo容器。
vegibit@ThinkPad MINGW64 ~
$ docker run --name mongo -d mongo
Unable to find image 'mongo:latest' locally
latest: Pulling from library/mongo
171857c49d0f: Pulling fs layer
419640447d26: Pulling fs layer
61e52f862619: Pulling fs layer
892787ca4521: Pulling fs layer
06e2d54757a5: Pulling fs layer
e2f7d90822f3: Pulling fs layer
f518d3776320: Pulling fs layer
feb8e9d469d8: Pulling fs layer
69705b632494: Pulling fs layer
c7daea26376d: Pulling fs layer
13d1f9e1fc77: Pulling fs layer
f87e65fe7ffd: Pulling fs layer
feb8e9d469d8: Waiting
e2f7d90822f3: Waiting
c7daea26376d: Waiting
13d1f9e1fc77: Waiting
69705b632494: Waiting
f518d3776320: Waiting
892787ca4521: Waiting
f87e65fe7ffd: Waiting
06e2d54757a5: Waiting
419640447d26: Verifying Checksum
419640447d26: Download complete
61e52f862619: Verifying Checksum
61e52f862619: Download complete
892787ca4521: Verifying Checksum
892787ca4521: Download complete
e2f7d90822f3: Verifying Checksum
e2f7d90822f3: Download complete
06e2d54757a5: Verifying Checksum
06e2d54757a5: Download complete
171857c49d0f: Download complete
f518d3776320: Verifying Checksum
f518d3776320: Download complete
171857c49d0f: Pull complete
419640447d26: Pull complete
61e52f862619: Pull complete
892787ca4521: Pull complete
06e2d54757a5: Pull complete
e2f7d90822f3: Pull complete
f518d3776320: Pull complete
69705b632494: Verifying Checksum
69705b632494: Download complete
feb8e9d469d8: Verifying Checksum
feb8e9d469d8: Download complete
feb8e9d469d8: Pull complete
69705b632494: Pull complete
13d1f9e1fc77: Verifying Checksum
13d1f9e1fc77: Download complete
f87e65fe7ffd: Verifying Checksum
f87e65fe7ffd: Download complete
c7daea26376d: Verifying Checksum
c7daea26376d: Download complete
c7daea26376d: Pull complete
13d1f9e1fc77: Pull complete
f87e65fe7ffd: Pull complete
Digest: sha256:a4448eb5f6e6097353d0ab97eb50aeb0238bb4e60c37e401920d3c2c4fc73eb9
Status: Downloaded newer image for mongo:latest
08190185820c9b1d513375f9ff011e4042fae95487fd3bcbc3e9c18b5048dc99
当我们运行docker run -name mongo -d mongo时发生了什么?
当我们运行上面的命令时,我们在终端看到了大量的输出。那么这里到底发生了什么?这些步骤给出了一个简短的总结。
- Docker在本地寻找mongo镜像
- Docker在本地没有找到mongo镜像,所以它接下来检查hub.docker.com。
- 找到该镜像并下载每一层
- 在mongo镜像的基础上创建一个新的容器
- 容器运行,可以通过cli或Docker桌面看到。
我们可以通过docker container ls命令看到我们的新Mongo容器正在运行。
vegibit@ThinkPad MINGW64 ~
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08190185820c mongo "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 27017/tcp mongo
通过docker container top mongo,我们可以看到该进程正在运行。容器只是一个进程,它所能访问的资源是有限的。它们不是虚拟机。
vegibit@ThinkPad MINGW64 ~
$ docker container top mongo
PID USER TIME COMMAND
986 999 0:05 mongod --bind_ip_all
使用Docker桌面也是一个很好的方法,能够查看和管理系统上的任何容器。

Docker连接到容器客户端
该 **docker exec**命令在一个正在运行的容器中运行一个新的命令。我们可以用它在容器内运行ps aux命令来查看运行中的进程。
vegibit@ThinkPad MINGW64 ~
$ docker exec mongo ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mongodb 1 1.1 2.1 1584916 136412 ? Ssl 15:20 1:00 mongod --bind_ip_all
root 76 0.0 0.0 34404 2804 ? Rs 16:50 0:00 ps aux
停止Mongo容器
vegibit@ThinkPad MINGW64 ~
$ docker stop mongo
mongo
vegibit@ThinkPad MINGW64 ~
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
vegibit@ThinkPad MINGW64 ~
$ docker top mongo
Error response from daemon: Container 08190185820c9b1d513375f9ff011e4042fae95487fd3bcbc3e9c18b5048dc99 is not running
vegibit@ThinkPad MINGW64 ~
$ docker exec mongo ps aux
Error response from daemon: Container 08190185820c9b1d513375f9ff011e4042fae95487fd3bcbc3e9c18b5048dc99 is not running
重新启动Mongo容器
vegibit@ThinkPad MINGW64 ~
$ docker start mongo
mongo
vegibit@ThinkPad MINGW64 ~
$ docker container list
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08190185820c mongo "docker-entrypoint.s…" 2 hours ago Up 19 seconds 27017/tcp mongo
vegibit@ThinkPad MINGW64 ~
$ docker mongo top
docker: 'mongo' is not a docker command.
See 'docker --help'
vegibit@ThinkPad MINGW64 ~
$ docker top mongo
PID USER TIME COMMAND
1253 999 0:01 mongod --bind_ip_all
连接到Mongo容器的外壳
好的,很好。我们有一个正在运行的MongoDB容器,但我们如何与它互动呢?要做到这一点,我们可以使用[docker exec]命令。该命令有几个部分,让我们回顾一下每个部分的作用。
- docker exec在一个正在运行的容器中运行一个新的命令
- -it-i = # stdin, -t = # interactive
- mongo运行命令的容器的名称
- /bin/sh要运行的命令,在这里是启动shell。
docker exec -it mongo /bin/sh
#
你看到的hashtag是容器内的新提示。从那里我们可以启动mongo交互式shell。
# mongo
MongoDB shell version v4.4.1
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("d882e577-b5a5-438d-8a35-4a2e0002bf50") }
MongoDB server version: 4.4.1
---
The server generated these startup warnings when booting:
2020-09-30T17:50:54.021+00:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
2020-09-30T17:50:54.720+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
2020-09-30T17:50:54.720+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
---
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).
The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.
To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
>
我们可以在容器中尝试一些不同的Mongo命令,看看它的工作情况。
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> use myNewDataBase
switched to db myNewDataBase
> db
myNewDataBase
> db.dropDatabase()
{ "ok" : 1 }
> db.createCollection("Container");
{ "ok" : 1 }
> show collections
Container
> db.Container.drop()
true
> show collections
> db.createCollection("Computer")
{ "ok" : 1 }
> db.Computer.insert( { _id: 1, item: "Macbook", qty: 1 } )
WriteResult({ "nInserted" : 1 })
> show collections
Computer
> db.Computer.count()
1
> db.Computer.find()
{ "_id" : 1, "item" : "Macbook", "qty" : 1 }
>
清理工作
好了,这很有趣。现在让我们清理一下我们的docker环境,停止容器,移除它,并列出所有的容器以确保其消失。
$ docker container stop mongo
mongo
$ docker container rm mongo
mongo
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
总结
我们的收获是,一旦我们建立并运行了Docker,就可以相当容易地启动你喜欢的任何类型的容器。在这种情况下,我们使用MongoDB。它也可以很容易地成为MySQL、Oracle、Java、Postgres、Redis、Ubuntu或任何我们喜欢的东西。另一件要记住的事情是,容器只是一个进程,它不是一个虚拟机。容器比完整的虚拟机要轻得多,而且很容易启动、测试,并能很快销毁。