docker · 2024-04-30 0

docker 搭建 mongodb 单机版

一、搭建

1.拉取镜像

docker pull mongo:5.0.6

2.docker run 创建容器

1) 通过 docker run 命令,不带认证的启动:

docker run -itd --name mongo_1 -p 27017:27017 mongo:5.0.6

进入容器,可以看到实际启动命令,如下:

root@3c612cd232bb:/# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
mongodb        1       0  6 15:23 pts/0    00:00:00 mongod --bind_ip_all

2) 通过 docker run 命令,带认证的启动:

docker run -d --name mongo_auth_1 -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 -p 27017:27017 mongo:5.0.6

进入容器,可以看到实际启动命令,如下:

root@f8dad368f1af:/# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
mongodb        1       0  3 15:32 ?        00:00:01 mongod --auth --bind_ip_all

3.docker compose 创建容器

通过 docker compose 启动:

docker-compose.yml 文件

version: '3'
services:
  mongo_1:
    image: mongo:5.0.6
    container_name: mongo_1
    restart: always
    ports:
      - "27017:27017"
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=123456
    volumes:
      - ./data/db:/data/db
docker compose -f docker-compose.yml up -d

进入容器,可以看到实际启动命令,如下:

root@04a7d3305c5b:/# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
mongodb        1       0 10 15:34 ?        00:00:01 mongod --auth --bind_ip_all

4.验证

创建需认证的容器,执行命令行操作 mongo:

切换到 admin 数据库,执行 db.auth(user, password) 进行认证

root@04a7d3305c5b:/# mongo
> use admin
switched to db admin
> db.auth("root","123456")
1
> show databases
admin   0.000GB
config  0.000GB
local   0.000GB
> db.person.insert({'name': 'zhang1', 'age': '21'})
WriteResult({ "nInserted" : 1 })
> db.person.find()
{ "_id" : ObjectId("664e118d0992be538002b198"), "name" : "zhang1", "age" : "21" }

二、命令行操作

1.操作数据库

  • use <database_name> 创建数据库,如果数据库不存在,创建并切换数据库,如果数据库存在,则切换数据库
  • db.dropDatabase() 删除当前数据库
  • show dbs 查看所有数据库
  • db 查看当前数据库

1) 创建数据库:

show dbs 显示不出来,需要插入一些数据才能显示

> use test1
switched to db test1
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> db
test1
> db.person.insert({"id": "1", "name": "zhang1"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test1   0.000GB

2) 删除数据库:

> db.dropDatabase()
{ "ok" : 1 }
> 
> db
test1
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

2.操作集合

  • db.createCollection(name, options) 创建集合,name 为要创建的集合名称,options 为可选参数, 指定有关内存大小及索引的选项
  • db.<collection_name>.drop() 删除集合
  • show collections 查看当前库下所有集合
  • show tables 查看当前库下所有集合

1) 创建集合

在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。

> db.person1.insert({"id": "1", "name": "zhang1"})
WriteResult({ "nInserted" : 1 })
> db.createCollection("person2")
{ "ok" : 1 }
> show collections
person1
person2

2) 删除结合

> db.person2.drop()
true
> show collections
person1

3.操作文档

  • db.<collection_name>.insert(<document>) 插入文档,若插入的数据主键已经存在,则会抛org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据
  • db.<collection_name>.save(<document>) 插入文档,如果 _id 主键存在则更新数据,如果不存在就插入数据,该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替
  • db.collection.insertOne() 向指定集合中插入一条文档数据,3.2 版本后支持
  • db.collection.insertMany() 向指定集合中插入多条文档数据,3.2 版本后支持

文档的数据结构和 JSON 基本一样。所有存储在集合中的数据都是 BSON 格式。
BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

1) 插入文档

> db.person1.insertOne({"id": 1, "name": "zhang1"})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("6655f4dd137e48aaad106e19")
}
> 
> db.person1.insertMany([{"id": 2, "name": "zhang2"}, {"id": 3, "name": "zhang3"}])
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("6655f524137e48aaad106e1a"),
        ObjectId("6655f524137e48aaad106e1b")
    ]
}
> db.person1.find()
{ "_id" : ObjectId("6655f4dd137e48aaad106e19"), "id" : 1, "name" : "zhang1" }
{ "_id" : ObjectId("6655f524137e48aaad106e1a"), "id" : 2, "name" : "zhang2" }
{ "_id" : ObjectId("6655f524137e48aaad106e1b"), "id" : 3, "name" : "zhang3" }

2) 一次插入多条文档

> var arr = [];
> for(var i=4 ; i<=6 ; i++){
... arr.push({"id": i, "name": "zhang" + i});
... }
3
> db.person1.insert(arr);
BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 3,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
})
> db.person1.find()
{ "_id" : ObjectId("6655f4dd137e48aaad106e19"), "id" : 1, "name" : "zhang1" }
{ "_id" : ObjectId("6655f524137e48aaad106e1a"), "id" : 2, "name" : "zhang2" }
{ "_id" : ObjectId("6655f524137e48aaad106e1b"), "id" : 3, "name" : "zhang3" }
{ "_id" : ObjectId("6655f5be137e48aaad106e1c"), "id" : 4, "name" : "zhang4" }
{ "_id" : ObjectId("6655f5be137e48aaad106e1d"), "id" : 5, "name" : "zhang5" }
{ "_id" : ObjectId("6655f5be137e48aaad106e1e"), "id" : 6, "name" : "zhang6" }

4.操作用户

  • 数据库用户角色:read、readWrite;
  • 数据库管理角色:dbAdmin、dbOwner、userAdmin;
  • 集群管理角色:clusterAdmin、clusterManager、4. clusterMonitor、hostManage;
  • 备份恢复角色:backup、restore;
  • 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  • 超级用户角色:root
  • 内部角色:__system

1) 查询用户

  • show users
  • db.system.users.find()
  • db.runCommand({usersInfo:"userName"})
> use admin
switched to db admin
> show tables
system.users
system.version
> db.system.users.find()
{ "_id" : "admin.root", "userId" : UUID("bcd616c7-9575-4f5d-b6c5-293b52a86d63"), "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "j+DpH7lpCx4utvTUnQG89A==", "storedKey" : "KsLdLSMaU2mKIkJNk/Ws/tdMLtk=", "serverKey" : "X9YjWIE0ZQ4ePZZSsm3BkyTiHNw=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "CtVOXmQ1rYNGT4/GkK9SFk6U5Zk2zshQeJthLg==", "storedKey" : "q+0T5QYaew4PsLo6MllzoCmwoWshooYUYOVPemBdiP4=", "serverKey" : "KaRflBpCVKqGCW9I4BSneYgqb9j0BhlZH81gNVIL7o8=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
> show users
{
    "_id" : "admin.root",
    "userId" : UUID("bcd616c7-9575-4f5d-b6c5-293b52a86d63"),
    "user" : "root",
    "db" : "admin",
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}
> db.runCommand({usersInfo:"root"})
{
    "users" : [
        {
            "_id" : "admin.root",
            "userId" : UUID("bcd616c7-9575-4f5d-b6c5-293b52a86d63"),
            "user" : "root",
            "db" : "admin",
            "roles" : [
                {
                    "role" : "root",
                    "db" : "admin"
                }
            ],
            "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
            ]
        }
    ],
    "ok" : 1
}

2) 新增用户

管理员角色 (userAdminAnyDatabase) 包含了 listSessions 角色

db.createUser({
  user: "zhang1",
  pwd: "123456",
  roles: [
    { role: "userAdminAnyDatabase", db: "admin" },
    { role: "dbAdminAnyDatabase", db: "admin" },
    { role: "readWriteAnyDatabase", db: "admin" }
  ]
})
db.createUser({
    user:"zhang2",
    pwd:"123456",
    customData:{
        name:'zhang2',
        email:'zhang2@qq.com',
        age:18,
    },
    roles:[
        {role:"readWrite",db:"admin"},
        {role:"readWrite",db:"config"}
    ]
})

3) 修改密码

> db.changeUserPassword("zhang1", "123456")

4) 修改密码和用户信息

db.runCommand(
    {
        updateUser:"zhang2",
        pwd:"123456",
        customData:{email:"zhang2@qq.com"}
    }
)

5) 删除数据库用户

> db.dropUser('zhang1')
true

5.会话

数据库中 system.sessions 集合中存储的所有会话

1) 列出所有会话

  • db.system.sessions.aggregate( [ { $listSessions: { allUsers: true } } ] )
> use config
switched to db config
> db.system.sessions.aggregate( [  { $listSessions: { allUsers: true } } ] )
{ "_id" : { "id" : UUID("685472b0-3f5f-4413-a28a-2f7d36d9be5f"), "uid" : BinData(0,"Y5mrDaxi8gv8RmdTsQ+1j7fmkr7JUsabhNmXAheU0fg=") }, "lastUse" : ISODate("2024-08-01T12:29:36.047Z"), "user" : { "name" : "root@admin" } }

2) 列出指定用户的所有会话

  • db.system.sessions.aggregate( [ { $listSessions: { users: [ {user: "root", db: "admin" } ] } } ] )
> db.system.sessions.aggregate( [ { $listSessions: { users: [ {user: "root", db: "admin" } ] } } ] )
{ "_id" : { "id" : UUID("685472b0-3f5f-4413-a28a-2f7d36d9be5f"), "uid" : BinData(0,"Y5mrDaxi8gv8RmdTsQ+1j7fmkr7JUsabhNmXAheU0fg=") }, "lastUse" : ISODate("2024-08-01T12:29:36.047Z"), "user" : { "name" : "root@admin" } }

3) 列出当前用户的所有会话

  • db.system.sessions.aggregate( [ { $listSessions: { } } ] )
> db.system.sessions.aggregate( [ { $listSessions: { } } ] )
{ "_id" : { "id" : UUID("685472b0-3f5f-4413-a28a-2f7d36d9be5f"), "uid" : BinData(0,"Y5mrDaxi8gv8RmdTsQ+1j7fmkr7JUsabhNmXAheU0fg=") }, "lastUse" : ISODate("2024-08-01T12:29:36.047Z"), "user" : { "name" : "root@admin" } }

6.连接

1) 查询连接数

  • db.serverStatus().connections
> db.serverStatus().connections
{
    "current" : 4,
    "available" : 838856,
    "totalCreated" : 4,
    "active" : 2,
    "threaded" : 4,
    "exhaustIsMaster" : 0,
    "exhaustHello" : 1,
    "awaitingTopologyChanges" : 1
}

2) 查询连接来源

  • db.runCommand({currentOp: 1, $all: true}).inprog
> db.runCommand({currentOp: 1, $all: true}).inprog
[
    {
        "type" : "op",
        "host" : "d56ebdb8e7d5:27017",
        "desc" : "WaitForMajorityServiceCanceler",
        "active" : false,
        "currentOpTime" : "2024-08-02T01:20:46.326+00:00"
    },
    {
        "type" : "op",
        "host" : "d56ebdb8e7d5:27017",
        "desc" : "conn1",
        "connectionId" : 1,
        "client" : "127.0.0.1:59746",
        "appName" : "MongoDB Shell",
        "clientMetadata" : {
            "application" : {
                "name" : "MongoDB Shell"
            },
            "driver" : {
                "name" : "MongoDB Internal Client",
                "version" : "5.0.6"
            },
            "os" : {
                "type" : "Linux",
                "name" : "Ubuntu",
                "architecture" : "x86_64",
                "version" : "20.04"
            }
        },
        "active" : true,
        "currentOpTime" : "2024-08-02T01:20:46.326+00:00",
        "effectiveUsers" : [
            {
                "user" : "root",
                "db" : "admin"
            }
        ],
        "threaded" : true,
        "opid" : 16669,
        "lsid" : {
            "id" : UUID("e47cb3ba-41b0-4256-b7ca-c9fa2c3d51dc"),
            "uid" : BinData(0,"Y5mrDaxi8gv8RmdTsQ+1j7fmkr7JUsabhNmXAheU0fg=")
        },
        "secs_running" : NumberLong(0),
        "microsecs_running" : NumberLong(144),
        "op" : "command",
        "ns" : "admin.$cmd.aggregate",
        "command" : {
            "currentOp" : 1,
            "$all" : true,
            "lsid" : {
                "id" : UUID("e47cb3ba-41b0-4256-b7ca-c9fa2c3d51dc")
            },
            "$db" : "admin"
        },
        "numYields" : 0,
        "locks" : {

        },
        "waitingForLock" : false,
        "lockStats" : {

        },
        "waitingForFlowControl" : false,
        "flowControlStats" : {

        }
    },
    {
        "type" : "op",
        "host" : "d56ebdb8e7d5:27017",
        "desc" : "conn3",
        "connectionId" : 3,
        "client" : "172.18.0.1:36714",
        "clientMetadata" : {
            "driver" : {
                "name" : "mongo-java-driver|sync",
                "version" : "4.7.1"
            },
            "os" : {
                "type" : "Linux",
                "name" : "Linux",
                "architecture" : "amd64",
                "version" : "5.15.0-105-generic"
            },
            "platform" : "Java/Private Build/1.8.0_402-8u402-ga-2ubuntu1~20.04-b06"
        },
        "active" : false,
        "currentOpTime" : "2024-08-02T01:20:46.326+00:00",
        "threaded" : true
    },
    {
        "type" : "op",
        "host" : "d56ebdb8e7d5:27017",
        "desc" : "conn2",
        "connectionId" : 2,
        "client" : "172.18.0.1:36718",
        "clientMetadata" : {
            "driver" : {
                "name" : "mongo-java-driver|sync",
                "version" : "4.7.1"
            },
            "os" : {
                "type" : "Linux",
                "name" : "Linux",
                "architecture" : "amd64",
                "version" : "5.15.0-105-generic"
            },
            "platform" : "Java/Private Build/1.8.0_402-8u402-ga-2ubuntu1~20.04-b06"
        },
        "active" : true,
        "currentOpTime" : "2024-08-02T01:20:46.326+00:00",
        "threaded" : true,
        "opid" : 16616,
        "secs_running" : NumberLong(3),
        "microsecs_running" : NumberLong(3960905),
        "op" : "command",
        "ns" : "admin.$cmd",
        "command" : {
            "hello" : 1,
            "helloOk" : true,
            "topologyVersion" : {
                "processId" : ObjectId("66ac2f2cc4958385f57b9a74"),
                "counter" : NumberLong(0)
            },
            "maxAwaitTimeMS" : NumberLong(10000),
            "$db" : "admin",
            "$readPreference" : {
                "mode" : "primaryPreferred"
            }
        },
        "numYields" : 0,
        "waitingForLatch" : {
            "timestamp" : ISODate("2024-08-02T01:20:42.466Z"),
            "captureName" : "AnonymousLatch"
        },
        "locks" : {

        },
        "waitingForLock" : false,
        "lockStats" : {

        },
        "waitingForFlowControl" : false,
        "flowControlStats" : {

        }
    },
    {
        "type" : "op",
        "host" : "d56ebdb8e7d5:27017",
        "desc" : "conn4",
        "connectionId" : 4,
        "client" : "172.18.0.1:34456",
        "clientMetadata" : {
            "driver" : {
                "name" : "mongo-java-driver|sync",
                "version" : "4.7.1"
            },
            "os" : {
                "type" : "Linux",
                "name" : "Linux",
                "architecture" : "amd64",
                "version" : "5.15.0-105-generic"
            },
            "platform" : "Java/Private Build/1.8.0_402-8u402-ga-2ubuntu1~20.04-b06"
        },
        "active" : false,
        "currentOpTime" : "2024-08-02T01:20:46.326+00:00",
        "effectiveUsers" : [
            {
                "user" : "root",
                "db" : "admin"
            }
        ],
        "threaded" : true
    }
]

三、jdcb 操作

1.mongo-java-driver

pom 依赖:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.12.10</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

测试连接:

@Test
public void testConnection() {
    // 方式一,无验证连接
    // MongoClient mongoClient = new MongoClient("127.0.0.1",27017);
    // 方式二,使用 url,无验证连接
    // MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://127.0.0.1:27017"));

    // 方式三,验证连接
    String database = "admin";
    String user = "root";
    char[] password = "123456".toCharArray();

    MongoCredential credential = MongoCredential.createCredential(user, database, password);
    MongoClientOptions options = MongoClientOptions.builder().sslEnabled(false).build();
    MongoClient mongoClient = new MongoClient(new ServerAddress("127.0.0.1", 27017), credential, options);

    // 方式四,使用 url,验证连接
    // MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://root:123456@127.0.0.1:27017/?authSource=admin&ssl=false"));

    MongoCursor<String> cursor = mongoClient.listDatabaseNames().cursor();

    while (cursor.hasNext()) {
        String next = cursor.next();
        System.out.println(next);
    }
}

2.mongodb-driver-sync

pom 依赖:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.7.1</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

测试连接:

@Test
public void testConnection() {
    String url = "mongodb://root:123456@127.0.0.1:27017";

    MongoClientSettings settings = MongoClientSettings.builder()
            .applyConnectionString(new ConnectionString(url))
            .applyToSocketSettings(builder -> {
                builder.connectTimeout(5, TimeUnit.SECONDS);
                builder.readTimeout(300, TimeUnit.SECONDS);
            })
            .build();
    com.mongodb.client.MongoClient mongoClient = MongoClients.create(settings);

    MongoCursor<String> cursor = mongoClient.listDatabaseNames().cursor();
    while (cursor.hasNext()) {
        String next = cursor.next();
        System.out.println(next);
    }

    cursor.close();
    mongoClient.close();
}