Docker集群即Docker应用栈
Docker集群部署:
Docker是一个新兴的轻量级虚拟化技术,其易用、跨平台、可移植的特性使其在集群系统的搭建方面有着得天独厚的优势。
本次搭建设计和描述:将搭建一个包含6个节点的Docker应用栈,
其中包括一个代理节点、两个web应用节点、一个主数据库节点
及两个从数据库节点。
一. 获取应用栈各节点所需镜像
根据上图描述,需要从Docker Hub上获取以下镜像:
默认安装目录:/var/lib/docker
$ sudo docker pull ubuntu
$ sudo docker pull django
$ sudo docker pull haproxy
$ sudo docker pull redis
$ sudo docker images
二. 应用栈容器节点互联
如果是一个真正的分布式架构集群,我们需要处理容器之间的跨主机通信问题。这里我们是在一个主机上进行的容器应用栈的环境搭建,因此只需要完成容器互联即可实现容器间的通信。使用docker run命令的—link选项完成
$ sudo docker run --link redis:redis --name console ubuntu bash
将在ubuntu镜像上启动一个容器,并命名为console,同时将新启动的console容器连接到名为redis的容器上。
$ sudo docker run -it --name redis-slave1 --link redis-master:master redis /bin/bash
该容器的/etc/host文件中记录了名称为master的连接信息,并且将slave连接到master容器。
通过上面的例子,可以将--link设置理解为一条IP地址的单项记录信息,因此
在搭建容器应用栈时,需要注意各个容器节点的启动顺序,以及对应的--link
参数设置。应用栈各节点的连接信息如下:
启动redis-master容器节点;
两个redis-slave容器节点启动时要连接到redis-master上;
两个APP容器节点启动时要连接到redis-master容器上;
HAProxy容器节点启动时要连接到两个APP节点上;
三. 应用栈容器节点启动
启动步骤参考”04-启动步骤”文章
应用栈各容器节点的启动命令如下:
# 启动redis容器
$ sudo docker run -it --name redis-master redis /bin/bash
$ sudo docker run -it --name redis-slave1 --link redis-master:master redis /bin/bash
$ sudo docker run -it --name redis-slave2 --link redis-master:master redis /bin/bash
# 启动Django容器,即APP应用
$ sudo docker run -it --name APP1 --link redis-master:db -v ~/Projects/Django/APP1:/usr/src/app django /bin/bash
$ sudo docker run -it --name APP2 --link redis-master:db -v ~/Projects/Django/APP1:/usr/src/app django /bin/bash
# 启动HAProxy容器
$ sudo docker run -it --name HAProxy --link APP1:APP1 --link APP2:APP2 -p 6301:6301 -v ~/Projects/HAProxy:/tmp haproxy /bin/bash
# 查看启动的容器信息
$ sudo docker ps
四. 进入docker
进入docker有很多种方式:推荐使用第四种方式
1. 使用docker attach进入容器
示例:$ sudo docker attach 44fc0f0582d9
注意:使用该方法退出容器后,启动的容器也会exit
2. 使用ssh进入Docker容器
3. 使用nsenter进入Docker容器:需要安装nsenter
4. 使用docker exec进入Docker容器
示例:$ sudo docker exec -it containName /bin/bash
五. 应用栈容器节点的配置
1. Redis Master主数据库容器节点的配置
- 查看容器与主机的挂载点(通过操作主机对应目录,可映射到容器中)
$ sudo docker inspect --format "{{.Volumes}}" containerName
// 其中containerName可通过docker container ls --all查看
执行上述命令,发现报错如下:
Template parsing error: template: :1:3: executing "" at <.Volumes>: map has no entry for key "Volumes"
解决方案:
方案一:
$ sudo docker inspect -f "{{.Config.Volumes}}" containerName
发现输出为:map[]
方案一不起作用
方案二:
$ sudo docker inspect containerName | grep Mounts -A 10
结果显示如下:
"Mounts": [
{
"Type": "volume",
"Name": "5042435a74a95e9a48ab61a8e9fcb0de25df721e555f529956021fd70a4f7c3e",
"Source": "/var/lib/docker/volumes/5042435a74a95e9a48ab61a8e9fcb0de25df721e555f529956021fd70a4f7c3e/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
其中Source为主机目录,Destination为容器对应目录