1. MongoDB的鏡像
docker pull mongo
查看已經(jīng)拉取的image
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mongo latest fddee5bccba3 33 hours ago 388MB
我們可以看到mongo 的 image已經(jīng)拉取,接下來(lái)我們測(cè)試一下能否啟動(dòng)mongodb并連接
docker run -p 27017:27017 -d mongo
運(yùn)行成功,下面顯示了mongodb的運(yùn)行輸出
b822a7fb8525c402e94d291248418e13441365b153c6023c9415007ef2805436
我們連接到MongoDB看一下,主機(jī)IP為172.17.0.1:
docker run -it mongo mongo --host 172.17.0.1
進(jìn)入MongoDB Shell
MongoDB shell version v4.2.5
connecting to: mongodb://172.17.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("043c7840-c2f0-46c8-a267-453566c8a5fa") }
MongoDB server version: 4.2.5
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
2020-04-19T02:28:03.740+0000 I STORAGE [main] In File::open(), ::open for '/home/mongodb/.mongorc.js' failed with No such file or directory
Server has startup warnings:
2020-04-19T02:23:34.709+0000 I STORAGE [initandlisten]
2020-04-19T02:23:34.709+0000 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2020-04-19T02:23:34.709+0000 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2020-04-19T02:23:35.271+0000 I CONTROL [initandlisten]
2020-04-19T02:23:35.271+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-04-19T02:23:35.271+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2020-04-19T02:23:35.271+0000 I CONTROL [initandlisten]
---
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()
---
運(yùn)行show dbs
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
>
2.啟動(dòng)MongoDB集群
如果我們前面的mongodb沒(méi)有停止,先停
docker stop <容器id>
分別啟動(dòng)3個(gè)MongoDB的容器
root@wis:~# docker run --name mongo0 -d mongo --replSet "rs0" --bind_ip_all
root@wis:~# docker run --name mongo1 -d mongo --replSet "rs0" --bind_ip_all
root@wis:~# docker run --name mongo2 -d mongo --replSet "rs0" --bind_ip_all
查看容器
root@wis:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
512bcd5037ca mongo "docker-entrypoint.s…" 7 seconds ago Up 4 seconds 27017/tcp mongo2
d4c5ced430b2 mongo "docker-entrypoint.s…" 14 seconds ago Up 12 seconds 27017/tcp mongo1
5307f8ddaeb4 mongo "docker-entrypoint.s…" 21 seconds ago Up 19 seconds 27017/tcp mongo0
查看各容器的ip地址
使用命令
docker inspect mongo0 | grep IPAddress
結(jié)果如下:
root@wis:~# docker inspect mongo0 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
root@wis:~# docker inspect mongo1 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
root@wis:~# docker inspect mongo2 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.4",
"IPAddress": "172.17.0.4",
登陸 172.17.0.2的MongoDB, 設(shè)置復(fù)制集
docker run -it mongo mongo --host 172.17.0.2
在Mongo Shell中運(yùn)行
rs.initiate( {
_id : "rs0",
members: [
{ _id: 0, host: "172.17.0.2:27017" },
{ _id: 1, host: "172.17.0.3:27017" },
{ _id: 2, host: "172.17.0.4:27017" }
]
})
有關(guān)MongoDB的復(fù)制集,參見(jiàn)https://docs.mongodb.com/manual/replication/
3. 設(shè)置集群的IP地址
目前,三個(gè)mongo容器的IP地址是docker分配的。很顯然,這種方式并不適合集群的配置,我們接下來(lái)開(kāi)始為每個(gè)容器指定固定的IP地址。首先,我們需要了解Docker的4種網(wǎng)絡(luò)模式:
- host模式–net=host 容器和宿主機(jī)共用IP地址,容器沒(méi)有網(wǎng)卡,使用不同端口與外部通訊。
- container模式 –net=container:NAME_or_ID 容器和另外一個(gè)容器共享網(wǎng)絡(luò)。
- none模式 –net=none 沒(méi)有對(duì)容器進(jìn)行任何網(wǎng)絡(luò)設(shè)置,如分配veth pair 和網(wǎng)橋連接,配置IP等。
- bridge模式 –net=bridge (默認(rèn)為該模式),主機(jī)有一塊橋接網(wǎng)卡,172.17.0.1,容器的ip地址為:172.17.0.2, 172.17.0.3...
如果我們需要Ngnix提供外部服務(wù),那么,我們通常直接使用host模式,現(xiàn)在,在本例中,我們的集群只要同屬一個(gè)網(wǎng)絡(luò)就可以了,我們使用bridge模式,但是,需要為這個(gè)集群指定ip。
先查看一下本機(jī)的網(wǎng)絡(luò)
docker network ls
結(jié)果如下,這個(gè)是安傳docker默認(rèn)裝好的網(wǎng)絡(luò)。
NETWORK ID NAME DRIVER SCOPE
d5c47fb0ab99 bridge bridge local
435e846bb246 host host local
346d39d401b8 none null local
接下來(lái)我們創(chuàng)建一個(gè) 新的Network:
docker network create --driver bridge --subnet=192.168.100.0/16 --gateway=192.168.100.1 mongo
-driver參數(shù)指定了使用 bridge
-subnet參數(shù)指定了子網(wǎng)的ip地址范圍
-gateway指定了網(wǎng)關(guān)的地址
-最后一個(gè)是這個(gè)網(wǎng)絡(luò)的名稱(chēng)
現(xiàn)在可以看到剛才創(chuàng)造的網(wǎng)絡(luò)。
NETWORK ID NAME DRIVER SCOPE
d5c47fb0ab99 bridge bridge local
435e846bb246 host host local
c30eca38ec22 mongo bridge local
346d39d401b8 none null local
我們先刪除先前創(chuàng)建的所有容器,本例中到現(xiàn)在為止尚無(wú)有用的容器,先停,后刪。
docker stop $(docker ps -q) & docker rm $(docker ps -aq)
使用指定ip重新創(chuàng)建mongodb的集群:
docker run --name mongo0 --network mongo --ip=192.168.100.2 -d mongo --replSet "rs0" --bind_ip_all
docker run --name mongo1 --network mongo --ip=192.168.100.3 -d mongo --replSet "rs0" --bind_ip_all
docker run --name mongo2 --network mongo --ip=192.168.100.4 -d mongo --replSet "rs0" --bind_ip_all
現(xiàn)在我們可以連接192.168.100.2上的MongoDB進(jìn)行下一步操作
進(jìn)入mongo0
docker exec -it mongo0 /bin/bash
啟動(dòng)mongo shell
mongo
如果,希望用容器來(lái)連接mongo, 應(yīng)該指定網(wǎng)絡(luò)和ip,可使用以下的命令:
docker run --network 192.168.100.10 -it mongo mongo --host 192.168.100.2
兩者的區(qū)別在于,前者是登陸到容器內(nèi)部執(zhí)行mongo shell, 后者是創(chuàng)建了一個(gè)容器來(lái)執(zhí)行mongo shell。接下來(lái)是設(shè)置復(fù)制集。
rs.initiate( {
_id : "rs0",
members: [
{ _id: 0, host: "192.168.100.2:27017" },
{ _id: 1, host: "192.168.100.3:27017" },
{ _id: 2, host: "192.168.100.4:27017" }
]
})
到目前為止,我們已經(jīng)可以在docker上部署一個(gè)mongodb的集群。但是,還是存在幾個(gè)問(wèn)題,我們并沒(méi)有指定mongodb 數(shù)據(jù)存放的目錄,也就是說(shuō),目前,數(shù)據(jù)都是存放在容器內(nèi)部的,新創(chuàng)建的容器是沒(méi)有這些數(shù)據(jù)的。我們需要將容器內(nèi)部的數(shù)據(jù)目錄綁定到host中的目錄。
4. 掛載host目錄存放數(shù)據(jù)文件
首先,我們?cè)趆ost上建立文件夾,用于掛載到MongoDB容器的數(shù)據(jù)。
我們建立以下的文件夾結(jié)構(gòu),在home下建立一個(gè)data目錄,data目錄下建立三個(gè)子目錄,mongo0, mongo1,mong2
每個(gè)目錄下分別建立db子目錄用于保存數(shù)據(jù)。
docker run --name mongo0 --network mongo --ip=192.168.100.2 \
-v /home/wis/data/mongo0/db:/data/db \
-d mongo --replSet "rs0" --bind_ip_all
docker run --name mongo1 --network mongo --ip=192.168.100.3 \
-v /home/wis/data/mongo1/db:/data/db \
-d mongo --replSet "rs0" --bind_ip_all
docker run --name mongo2 --network mongo --ip=192.168.100.4 \
-v /home/wis/data/mongo2/db:/data/db \
-d mongo --replSet "rs0" --bind_ip_all
我們可以將配置文件夾也掛載到容器中
docker run --name mongo2--network mongo --ip=192.168.100.4 \
-v /home/wis/data/mongo2/db:/data/db \
-v /home/wis/data/mongo2/configdb:/data/configdb \
-d mongo --replSet "rs0" --bind_ip_all
截至目前,我們以及完成了MongoDB復(fù)制集的搭建,隨著我們后續(xù)不斷增加容器,我們很快就會(huì)出現(xiàn)管理這些容器的需求,我們?cè)诤罄m(xù)的章節(jié)繼續(xù)介紹。
下一節(jié),我們先開(kāi)始部署Wisplanner的服務(wù)端。