前言
随着以Docker和Kubernetes为核心的云原生技术的快速发展,当前越来越多的应用、中间件、甚至数据库均开始进行云化改造,以适应快速上云的IT需求。
云化MongoDB也成为未来使用MongoDB的一种趋势,因此,本篇将首先介绍如何在Docker容器中部署MongoDB,下一篇文章将介绍如何与K8S集成,实现多租户模式下对数据库实例的按需申请。
下面直接进入主题,MongoDB数据库容器化部署的详细步骤如下:
(1)Docker安装
首先确保已正确安装Docker引擎,请参考Docker官方文档进行安装,执行docker --version命令,输出如下信息表示Docker引擎已安装好:
Docker version19.03.6, build 369ce74a3c
(2)创建相关目录与文件
从官方下载MongoDB二进制包,解压到/usr/local/mongodb-4.2目录下,并在此目录下创建相应的数据目录data、日志目录logs和日志文件logs/123.log、启动配置文件start.conf,启动配置文件内容如下:
storage:
dbPath: /usr/local/mongodb-4.2/data
systemLog:
path: /usr/local/mongodb-4.2/logs/123.log
destination: file
net:
port: 30000
bindIp: 127.0.0.1,172.17.0.2
这里需要注意的是bindIp的配置,172.17.0.2为Docker容器的ip地址(根据实际情况进行修改)
(3)创建Dockerfile文件
在/usr/local/mongodb-4.2目录下创建Dockerfile文件,会通过此文件来构造MongoDB的docker镜像,文件内容如下:
FROM ubuntu:16.04 #选择基础镜像
MAINTAINER gyw
RUN rm /etc/apt/sources.list #需安装其它依赖包,修改下载源
COPY sources.list /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y libcurl3 #mongodb运行需依赖的包
WORKDIR /usr/local/mongodb-4.2
COPY . /usr/local/mongodb-4.2
CMD["./bin/mongod","--config","./start.conf"] #容器启动时初始执行的命令
上面像RUN、COPY、CMD等是Dockerfile里面的命令,请参考Docker官方文档。
为了加速下载依赖包,这里将初始镜像ubuntu:16.04里面的下载源替换成阿里的源,所以在/usr/local/mongodb-4.2目录下创建了一个sources.list的文件,用来覆盖默认的下载源,这个文件的具体内容如下:
deb http://mirrors.aliyun.com/ubuntu/ xenialmain restricted
deb http://mirrors.aliyun.com/ubuntu/xenial-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenialuniverse
deb http://mirrors.aliyun.com/ubuntu/xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenialmultiverse
deb http://mirrors.aliyun.com/ubuntu/xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/xenial-backports main restricted universe multiverse
(4)创建好相应文件后,最终在/usr/local/mongodb-4.2目录下的文件结构如下
drwxr-xr-x 2root root 4096 Apr 21 10:08 bin/
drwxr-xr-x 2root root 4096 Apr 21 10:13 data/
-rw-r--r-- 1 root root 275 Apr22 06:10 Dockerfile
-rw-r--r-- 1 root root 30608 Apr21 10:08 LICENSE-Community.txt
drwxr-xr-x 2root root 4096 Apr 21 10:12 logs/
-rw-r--r-- 1 root root 16726 Apr21 10:08 MPL-2
-rw-r--r-- 1 root root 2601 Apr21 10:08 README
-rw-r--r-- 1 root root 457 Apr22 05:50 sources.list
-rw-r--r-- 1 root root 177 Apr22 07:10 start.conf
-rw-r--r-- 1 root root 57190 Apr21 10:08 THIRD-PARTY-NOTICES
(5)构建docker镜像
执行如下命令:docker image build -t mongodb-4.2:test .
注意最后面有一个.符号,表示在当前目录下查找Dockerfile文件进行镜像构建,成功运行后,可通过以下命令查看生成的镜像:
docker image ls
输出信息里面包含如下两个镜像:
REPOSITORY TAG IMAGE ID CREATED SIZE
mongodb-4.2 test 4d8782e5adad 40 minutesago 435MB
ubuntu 16.04 77be327e4b63 2 months ago 124MB
其中ubuntu是基础镜像,mongdb-4.2就是构建成功的数据库镜像。
(6)启动容器
docker run -p 50000:30000 -d --name mongodb-4.2mongodb-4.2:test
其中--name参数指定启动的容器名称,-p为端口映射,冒号前面的端口为所在主机的端口,后面的端口为容器对外暴漏的端口(与mongodb启动配置文件start.conf里面指定的监听端口一致),mongodb-4.2:test为镜像名称,通过此镜像来启动容器。
成功启动后,查看容器是否运行,可通过以下命令:
docker ps
输出如下信息:
CONTAINER ID IMAGE COMMAND
b4a9d40d1802 mongodb-4.2:test "./bin/mongod --conf…"
CREATED STATUS PORTS NAMES
49 minutes ago Up 49 minutes 0.0.0.0:50000->30000/tcp mongodb-4.2
其中字段STATUS为Up表示容器正在运行。
(7)连接到容器里面的mongodb
./bin/mongo --host 172.17.0.2 --port 30000
和正常的mongo客户端连接mongod服务端一样,需要注意的是参数host指定的ip为容器的ip,--port为容器监听的端口
也可以通过以下语句连接上:
./bin/mongo --port 50000
注意这里没有指定host参数,默认连接的ip为127.0.0.1;--port参数指定的端口号为主机上的端口,通过此50000端口映射到容器上的30000端口。
总结:Docker下面安装部署MongoDB,看上去需要做很多工作,但是一段完成MongoDB的Docker镜像生成后,后面我们可以很方便的利用这个镜像来启动多个容器化的MongoDB;同时,借助Kuberntes(一种容器编排工具),甚至能够快速启动几百上千个MongoDB数据库实例。因此,MongoDB的容器化部署,是未来MongoDB数据库上云的一个重要前提。