Docker集群即Docker应用栈

Docker集群部署:

Docker是一个新兴的轻量级虚拟化技术,其易用、跨平台、可移植的特性使其在集群系统的搭建方面有着得天独厚的优势。

  1. 本次搭建设计和描述:将搭建一个包含6个节点的Docker应用栈,
  2. 其中包括一个代理节点、两个web应用节点、一个主数据库节点
  3. 及两个从数据库节点。

搭建你的第一个Docker应用栈 - 图1

一. 获取应用栈各节点所需镜像

根据上图描述,需要从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为容器对应目录

2. redis从节点配置

3. APP配置

4. 代理配置

5. 访问