Database-Mongodb的容器化实践

本文详细介绍了使用官方镜像和自定义Dockerfile部署MongoDB的步骤,包括环境变量配置、端口映射、储存引擎设置及数据库权限管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Database-Mongodb的容器化实践

使用官方镜像

1.使用官方镜像
[root@adson ~]# docker run --name mongo-container -d mongo
[root@adson ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7e7bc23d405 mongo “docker-entrypoint…” 45 seconds ago Up 43 seconds 27017/tcp mongo-container

在此mongo容器启动一个bash进程,并通过mongo指令启动mongodb交互命令行,再通过db.stats()指令查看数据库状态:
[root@adson ~]# docker exec -it f7e7bc23d405 sh
#mongo
MongoDB shell version v4.0.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.0
Welcome to the MongoDB shell.
For interactive help, type “help”.
。。。。。。。。。。。。。。
To enable free monitoring, run the following command:
db.enableFreeMonitoring()

 > use test
switched to db test
> db
test
> db.stats()
{
        "db" : "test",
        "collections" : 0,
        "views" : 0,
        "objects" : 0,
        "avgObjSize" : 0,
        "dataSize" : 0,
        "storageSize" : 0,
        "numExtents" : 0,
        "indexes" : 0,
        "indexSize" : 0,
        "fileSize" : 0,
        "fsUsedSize" : 0,
        "fsTotalSize" : 0,
        "ok" : 1
}

> exit
bye

可以通过env指令查看环境变量的配置:
#env
HOSTNAME=f7e7bc23d405
HOME=/root
GPG_KEYS=9DA31620334BD75D9DCB49F368818C72E52529D4
TERM=xterm
MONGO_PACKAGE=mongodb-org
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MONGO_MAJOR=4.0
JSYAML_VERSION=3.10.0
GOSU_VERSION=1.10
MONGO_REPO=repo.mongodb.org
PWD=/
MONGO_VERSION=4.0.0

镜像默认暴露mongodb的服务端口:27017,可以通过该端口访问服务。
(1)连接mongodb容器
使用–link参数,连接新建的mongo-container容器
进入alpine系统容器后,用户可以通过ping指令测试mongo容器的连通性:
[root@adson ~]# docker run -it --link mongo-container:db alpine sh
/ # ls
bin etc lib mnt root sbin sys usr
dev home media proc run srv tmp var
/ # ping db
PING db (172.17.0.6): 56 data bytes
64 bytes from 172.17.0.6: seq=0 ttl=64 time=0.096 ms
64 bytes from 172.17.0.6: seq=1 ttl=64 time=0.088 ms
64 bytes from 172.17.0.6: seq=2 ttl=64 time=0.074 ms
^C
— db ping statistics —
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.074/0.086/0.096 ms

(2).直接使用mongo cli指令
如果想直接在宿主机器上使用mongodb镜像,可以在docker run指令后面加入entrypoint指令,
这样就可以非常方便的直接进入mongo cli了。

[root@adson ~]# docker run -it --link mongo-container:db --entrypoint mongo mongo --host db
MongoDB shell version v4.0.0
connecting to: mongodb://db:27017/
MongoDB server version: 4.0.0
Welcome to the MongoDB shell.
For interactive help, type “help”.
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
2018-07-06T14:14:44.292+0000 I CONTROL [initandlisten]
2018-07-06T14:14:44.292+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-07-06T14:14:44.292+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-07-06T14:14:44.292+0000 I CONTROL [initandlisten]
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten]
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is ‘always’.
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten] ** We suggest setting it to ‘never’
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten]
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is ‘always’.
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten] ** We suggest setting it to ‘never’
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten]

Enable MongoDB’s free cloud-based monitoring service to collect 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 created for you. Anyone you share the URL with will also be able to
view this page. 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()

> db.version();
4.0.0
> db.stats();
{
        "db" : "test",
        "collections" : 0,
        "views" : 0,
        "objects" : 0,
        "avgObjSize" : 0,
        "dataSize" : 0,
        "storageSize" : 0,
        "numExtents" : 0,
        "indexes" : 0,
        "indexSize" : 0,
        "fileSize" : 0,
        "fsUsedSize" : 0,
        "fsTotalSize" : 0,
        "ok" : 1
}

最后,还可以使用–storageEngine参数来设置储存引擎:
docker run --name mongo-container -d mongo --storageEngine wiredTiger

使用自定义Dockerfile

新建项目目录,并在根目录新建Dockerfile
[root@adson ~]# mkdir mongodb
[root@adson mongodb]# touch Dockerfile
[root@adson mongodb]# vi Dockerfile

FROM sshd:Dockerfile
MAINTAINER docker_user (user@docker.com)
RUN apt-get update &&
apt-get install -y mongodb pwgen &&
apt-get clean &&
rm -rf /var/lib/lists/*
#创建mongodb存放数据文件的文件夹
RUN mkdir -p /data/db
VOLUME /data/db
ENV AUTH yes
#添加脚本
ADD run.sh /run.sh
ADD set_mongodb_password.sh /set_mongodb_password.sh
RUN chmod 755 ./*.sh
EXPOSE 27017
EXPOSE 28017
CMD ["/run.sh"]

新建set_mongodb_password.sh脚本。此脚本主要负责配置数据库的用户名和密码:
[root@adson mongodb]# vi set_mongodb_password.sh
#!/bin/bash
#这个脚本主要是用来设置数据库的用户名和密码。
#判断是否已经设置过密码。
if [ -f /.mongodb_password_set]; then
echo “MongoDB password already set!”
exit 0
fi
/usr/bin/mongod --smallfiles --nojournal &
PASS=KaTeX parse error: Expected '}', got 'EOF' at end of input: {MONGODB_PASS:-(pwgen -s 12 1)}
_word=$( [ KaTeX parse error: Expected 'EOF', got '&' at position 19: …NGODB_PASS } ] &̲& echo "preset"…?
done
#通过docker logs + id可以看到以下输出。
echo “=> Creating an admin user with a ${_word} password in MongoDB”
mongo admin --eval “db.shutdownServer();”
echo “=> Done!”
touch /.mongodb_password_set
echo “"
echo “You can now connect to this MongoDB server using:”
echo “”
echo "mongo admin -u admin -p $PASS --host --port "
echo “”
echo “Please remember to change the above password as soon as possible!”
echo "

新建run.sh,此脚本是主要的mongodb启动脚本:
[root@adson mongodb]# vi run.sh

#!/bin/bash
if [ ! -f /.mongodb_password_set ]; then
/set_mongodb_password.sh
fi
if [ “$AUTH” == “yes” ]; then
#这里读者可以自己设定Mongodb的启动参数。
export mongodb=’/usr/bin/mongod --nojournal --auth --rest’
else
export mongodb=’/usr/bin/mongod --nojournal --rest’
fi
if [ ! -f /data/db/mongod.lock ]; then
eval m o n g o d b e l s e e x p o r t m o n g o d b = mongodb else export mongodb= mongodbelseexportmongodb=mongodb’ --dbpath /data/db’
rm /data/db/mongod.lock
mongod --dbpath /data/db --repair && eval $mongodb
fi

使用docker build指令构建镜像:
[root@adson mongodb]# docker build -t mongodb-image .

启动容器,映射27017、28017端口到本地:
[root@adson mongodb]# docker run -d -p 27017:27017 -p 28017:28017 mongodb-image
a05b48666e41c04b9011a1457528ba4875e0a9c164930360713e2f5ffad2ca47

[root@adson mongodb]# docker logs 7a
/set_mongodb_password.sh: line 2: [: missing `]’
=> Waiting for confirmation of MongoDB service startup
Fri Jul 6 19:07:42.819 [initandlisten] MongoDB starting : pid=6 port=27017 dbpath=/data/db/ 64-bit host=7ad40fcd1e4b
Fri Jul 6 19:07:42.820 [initandlisten] db version v2.4.9
Fri Jul 6 19:07:42.820 [initandlisten] git version: nogitversion
Fri Jul 6 19:07:42.820 [initandlisten] build info: Linux orlo 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 17:37:58 UTC 2013 x86_64 BOOST_LIB_VERSION=1_54
Fri Jul 6 19:07:42.820 [initandlisten] allocator: tcmalloc
。。。。。。。。。。。。。。。。。。。。。。。
server should be down…
=> Done!

You can now connect to this MongoDB server using:
mongo admin -u admin -p eotLEwLS7GvG --host --port
Please remember to change the above password as soon as possible!

Fri Jul 6 19:07:47.956 [initandlisten] MongoDB starting : pid=32 port=27017 dbpath=/data/db 64-bit host=7ad40fcd1e4b
。。。。。。。。。。。。。。。。

屏幕中输出的eotLEwLS7GvG就是admin的密码。

也可以利用环境变量在容器启动时指定密码:

[root@adson ~]# docker run -d -p 27017:27017 -p 28017:28017 -e MONGODB_PASS=“myp
ass” mongo
0615313b0d56d672b918fb676ef75469e3d863fa11a79b1ec092390943daac4b

甚至,设定不需要密码即可访问:
[root@adson ~]# docker run -d -p 27017:27017 -p 28017:28017 -e AUTH=no mongo

同样,也可以使用-v参数来映射本地目录到容器。

### 使用 Flink SQL 连接和操作 ClickHouse 数据库 #### 创建 Maven 或 Gradle 项目并配置依赖项 为了使 Apache Flink 能够连接到 ClickHouse 并执行查询,需要引入必要的 JDBC 驱动程序以及 Flink 的相关模块。对于 Maven 用户来说,在 `pom.xml` 文件中添加如下依赖: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-jdbc_2.12</artifactId> <version>${flink.version}</version> </dependency> <!-- Add the ClickHouse JDBC driver --> <dependency> <groupId>ru.yandex.clickhouse</groupId> <artifactId>clickhouse-jdbc</artifactId> <version>0.3.2</version> </dependency> ``` 上述代码片段展示了如何通过 Maven 来管理项目的外部库文件。 #### 定义表结构与注册数据源 在启动应用程序之前,应该先定义好要处理的数据模式,并将其映射成 Flink 中的逻辑表。这可以通过编写 DDL (Data Definition Language) 声明来完成: ```sql CREATE TABLE clickhouse_table ( id BIGINT, name STRING, age INT, PRIMARY KEY(id) NOT ENFORCED ) WITH ( 'connector' = 'jdbc', 'url' = 'jdbc:clickhouse://localhost:8123/default', 'table-name' = 'users' ); ``` 这段 SQL 语句创建了一个名为 `clickhouse_table` 的虚拟表,它指向了位于本地主机上的 ClickHouse 实例中的实际物理表 users[^1]。 #### 编写简单的 Flink 应用程序读取 ClickHouse 表 下面是一个完整的 Java 程序例子,该程序会从上面提到过的 ClickHouse 表里获取记录并将它们打印出来: ```java import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; public class ReadFromClickHouse { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env); String createDDL = "CREATE TABLE clickhouse_table (" + "id BIGINT,"+ "name STRING,"+ "age INT"+ ") WITH ("+ "'connector'='jdbc'," + "'url'='jdbc:clickhouse://localhost:8123/default'," + "'driver'='ru.yandex.clickhouse.ClickHouseDriver'," + "'username'='default'," + "'password'=''"+ ")"; tableEnv.executeSql(createDDL); Table result = tableEnv.sqlQuery( "SELECT * FROM clickhouse_table" ); // Convert to DataStream and print results. tableEnv.toAppendStream(result, Row.class).print(); env.execute("Read from ClickHouse"); } } ``` 此段代码实现了基本的功能——即建立至目标数据库的链接、构建相应的 Schema 描述符、发起 SELECT 查询请求最后输出检索所得的结果集[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值