在不同的物理服务器上部署带有Docker的mongodb复制服务器服务器
我正在尝试使用docker部署一个mongodb复制对象。 我设法通过执行此操作在同一台服务器上执行此操作:
docker run -d --expose 27017 --name mongodbmycompany1 dockerfile/mongodb mongod --replSet rsmycompa docker run -d --expose 27017 --name mongodbmycompany2 dockerfile/mongodb mongod --replSet rsacommeassure docker run -d --expose 27017 --name mongodbmycompany3 dockerfile/mongodb mongod --replSet rsacommeassure MONGODB1=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mongodbmycompany1) MONGODB2=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mongodbmycompany2) MONGODB3=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mongodbmycompany3) echo $MONGODB1 echo $MONGODB2 echo $MONGODB3 echo "Mongodb Replicaset init" docker exec mongodbmycompany1 mongo 127.0.0.1:27017/mycompany --eval 'if(!rs.conf()) { rs.initiate(); cfg = rs.conf(); cfg.members[0].host = "'$MONGODB1':27017"; rs.reconfig(cfg); rs.add("'$MONGODB2':27017"); rs.add("'$MONGODB3':27017"); } rs.status();'
它按预期工作。 我的复制数据库已初始化,我的mongodb结果集configuration包含我的3个服务器通过其内部IP地址标识。 这不是完美的,因为我宁愿使用服务器名称,但我没有设法做到这一点。 Docker只会使用–link参数填充映像启动时传递的服务器名称的每个/ etc / hosts文件。 如果我添加一个新的服务器,而其他人正在运行。 这些服务器不会ping新的服务器。
现在我还有一个问题。 在生产中,在同一物理服务器上运行大量的Mongodb Docker镜像是可能的,但这并不安全: – 如果我的物理服务器宕机,我将丢失所有的Mongodb副本,并且服务中断 – 如果我的物理服务器使用内部存储,所有我的docker图像使用相同的磁盘…我将有IO问题。
所以我的问题是: 我怎样才能在多个物理服务器上部署许多mongodb副本? 在不同的服务器上,甚至在不同的数据中心上,这些mongodb副本如何与其他主数据服务器(主服务器和副服务器可以更改)进行通信?
我们假设:
- 你有3个不同的docker主机(服务器),IP为
10.1.1.103
- 想要部署一个名为
rsacommeassure
副本集 - 用于mongodb的
Dockerfile
暴露端口27017 - 所有的服务器都在一个可信任的区域,可以互相通话
首先让我们在每个服务器上启动mongodb容器( 10.1.1.101 ~$
用于命令提示符):
10.1.1.101 ~$ docker run -d -p 27017:27017 --name mongodbmycompany1 dockerfile/mongodb mongod --replSet rsacommeassure 10.1.1.102 ~$ docker run -d -p 27017:27017 --name mongodbmycompany2 dockerfile/mongodb mongod --replSet rsacommeassure 10.1.1.103 ~$ docker run -d -p 27017:27017 --name mongodbmycompany3 dockerfile/mongodb mongod --replSet rsacommeassure
-p 27017:27017
显示主机IP上的端口27017,因此可以在服务器的主机IP地址上访问mongo。
然后你需要启动副本集,所以只需要运行这个对MongoDB容器(我会在这里selectserver1):
your_laptop ~$ > mongo --host 10.1.1.101 MongoDB shell version: 2.6.9 connecting to: test > rs.initiate() > cfg = rs.conf() > cfg.members[0].host = "10.1.1.101:27017" > rs.reconfig(cfg) > rs.add("10.1.1.102:27017") > rs.add("10.1.1.103:27017") > rs.status();
IP是本地的,但只要服务器可以互相通信(VPN,防火墙,DMZ等等),就可以与全局协同工作。 顺便说一句,你应该仔细考虑安全 。
我已经使用docker-machine和virtual box作为驱动程序在不同的物理服务器上创build了一个副本集:
$ docker-machine create --driver virtualbox server1 $ docker-machine create --driver virtualbox server2 $ docker-machine create --driver virtualbox server3
打开3个不同的terminal,在每个
$(Terminal1) eval "$(docker-machine env server1)" $(Terminal2) eval "$(docker-machine env server2)" $(Terminal3) eval "$(docker-machine env server3)"
在每个terminal中:
$(Terminal1) docker run -d -p 27017:27017 --name mongoClient1 mongo mongod --replSet r1 $(Terminal2) docker run -d -p 27017:27017 --name mongoClient2 mongo mongod --replSet r1 $(Terminal3) docker run -d -p 27017:27017 --name mongoClient3 mongo mongod --replSet r1
进入VirtualBox – >在每个环境(server1,server2,server3) – >设置 – >networking – >适配器1 – >端口转发。 创build一个新的规则协议TCP,主机端口 – 27017,来宾端口 – 27017,离开主机IP和访客IP空
现在重新启动所有的环境,你可以从VirtualBox或从terminal,从terminal执行此操作:
$(Terminal1) docker-machine restart server1 $(Terminal2) docker-machine restart server2 $(Terminal3) docker-machine restart server3
重新启动容器:
$(Terminal1) docker start mongoClient1 $(Terminal2) docker start mongoClient2 $(Terminal3) docker start mongoClient3
现在容器应该正在运行,您可以通过在每个terminal中运行$ docker ps来检查它们
进入第一个容器的(或另一个)Mongo Shell
$(Terminal1) docker exec -it mongoClient1 mongo // now we are in the Mongo Shell $(Mongo Shell) rs.initiate() $(Mongo Shell) cfg = rs.conf() $(Mongo Shell) cfg.members[0].host = <server1's Ip Address> // you should get server1's Ip Address by running $ docker-machine ls, mine was 192.168.99.100 $(Mongo Shell) rs.reconfig(cfg) $(Mongo Shell Primary) rs.add("<server2's Ip Address>:27017") // now we added a Secondary $(Mongo Shell Primary) rs.add("<server3's Ip Address>:27017", true) // now we added an Arbiter $(Mongo Shell Primary) use planes // now we create a new database $(Mongo Shell Primary) db.tranporters.insert({name:'Boeing'}) // create a new collection $(Mongo Shell Primary) db.tranporters.find() // we obtain the inserted plane
要连接到辅助人员,您可以:
$(Terminal2) docker exec -it mongoClient2 mongo planes // or $(Mongo Shell Primary) db = connect ("<server2's Ip Address>:27017/planes")
现在我们在中学的蒙古壳牌了
$(Mongo Shell Secondary) rs.slaveOk() // to allow readings from the Shell $(Mongo Shell Secondary)db.tranporters.find() // should return inserted plane
您可以使用“ Weave – Dockernetworking ”轻松解决您的问题。
Weave创build了一个覆盖networking,将容器连接到不同的主机上,甚至在不同的云提供商处。 编织还提供了一个DNS服务,使您可以在Weavenetworking中按名称查找容器。
#Here stop already running instances docker stop m1 m2 m3 #Cleanup of the volumes docker rm -f m1 m2 m3 # Start MongoDB services optimised for faster startup docker run -dP --name m1 mongo mongod --replSet "r1" --noprealloc --smallfiles --nojournal --syncdelay 0 docker run -dP --name m2 mongo mongod --replSet "r1" --noprealloc --smallfiles --nojournal --syncdelay 0 docker run -dP --name m3 mongo mongod --replSet "r1" --noprealloc --smallfiles --nojournal --syncdelay 0 export M1_ADDRESS=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' m1` export M2_ADDRESS=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' m2` export M3_ADDRESS=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' m3` docker exec m1 mongo --eval "rs.initiate();" docker exec m1 mongo --eval "cfg = rs.conf(); cfg.members[0].host = '$M1_ADDRESS:27017'; rs.reconfig(cfg);" docker exec m1 mongo --eval "rs.add('$M2_ADDRESS:27017');rs.add('$M3_ADDRESS:27017')" # Check if everything is fine. docker exec m1 mongo --eval "rs.status();"
我编写了一个docker-image,为任意数量的容器设置mongodb replicaSet,并在添加更多容器时自动缩放。 检查github github回购或dockerregistry
使用Docker撰写
设置你的docker-compose.yml
version: "2" services: <your_service_name>: image: rollymaduk/mongo-replica:local environment: REPLICA_NAME: "<your_replica_name>" volumes: - /var/config:/var/config
在命令行中运行
docker-compose up
扩大到更多的集装箱
docker-compose scale <your_service_name>=3
docker云
要使用docker-cloud部署mongo-db replicaSet,请设置一个堆栈文件
stack.yml:不需要共享卷的堆栈文件
<service_name>: image: rollymaduk/mongo-replica:cloud deployment_strategy: high_availability target_num_containers: 3 environment: REPLICA_NAME: <your_replica_name> DOCKERCLOUD_AUTH: <your_docker_auth_key>
stack.yml:需要共享卷的堆栈文件
<service_name>: image: rollymaduk/mongo-replica:local deployment_strategy: high_availability target_num_containers: 3 volumes: - /var/config:/var/config environment: REPLICA_NAME: <your_replica_name>
使用docker-cloud cli在命令行中运行(如果在云中不存在堆栈文件)
docker-cloud stack create --name <your_stack_name> -f <your_stack_file> docker-cloud stack start <your_stack_name>
使用docker-cloud cli在命令行中运行(如果堆栈文件已经存在于云中)
docker-cloud stack update -f <your_stack_file> <your_stack_name> docker-cloud stack redeploy <your_stack_name>
重要说明:您必须指定一个共享卷并将其挂载到容器的config目录[default:/ var / config]下面的示例将一个主目录/ var / config挂载到容器的configuration卷。
你可以使用任何docker推荐的方法来在容器之间共享卷,也就是挂载一个主机目录或数据卷容器),只要你指定configuration卷(/ var / config)的正确path即可。_改变默认configuration目录使用环境variables–CONFIG_DIR来设置你的容器。 确保更新主机卷path以反映新的–CONFIG_DIR name_
- 在Mesos / Marathon上部署端口映射的Docker容器
- 规范的方式来校验码下载在Dockerfile?
- 如何运行与docker的jekyll撰写获取 – 服务的不支持的configuration选项:“网站”
- 在circleCI上运行docker-containertesting
- AWS ElasticBeanstalk找不到Dockerfile
- Dockerfile和docker-compose不用新的指令更新
- 如何Dockerize一个Tomcat的应用程序
- 如何为boot2docker内的docker容器configurationfreeSWITCH?
- 如何在ec2上使用docker运行2个WordPress博客