Docker编配和服务发现
7.1 Docker Compose
安装Docker Compose(通过Pip安装)
wget https://bootstrap.pypa.io/get-pip.py –no-check-certificate
sudo python get-pip.py
sudo pip install -U docker-compose
查看Docker Compose是否安装成功:
为了演示Compose是如何工作的,这里使用一个Python Flask应用作为例子。
2.1 获取示例应用
mkdir composeapp cd composeapp 获取应用程序源代码:wget https://www.dockerbook.com/code/7/composeapp/app.py 注:Flask追踪保存在Redis里的计数器。(每次访问根路径/时,计数器会自增。) 获取requirements.txt保存应用程序的依赖关系:wget https://www.dockerbook.com/code/7/composeapp/requirements.txt 获取Dockerfile:wget https://www.dockerbook.com/code/7/composeapp/Dockerfile sudo docker build -t jamtur01/composeapp .
2.2 docker-compose.yml文件
获取docker-compose.yml文件(具体代码参照下图):wget https://www.dockerbook.com/code/7/composeapp/docker-compose.yml
注:这里从Docker Hub上的默认Redis镜像直接创建Redis容器; YAML文件最后使用links将redis服务连接web服务。
2.3 运行Compose
a. 在composeapp文件夹下执行服务:sudo docker-compose up
注: 如果使用Ctrl+C停止Compose运行,也会停止运行的服务(如下图)。
b. 以守护进程方式运行Compose:sudo docker-compose up -d 查看在宿主机上运行的示例应用(如下图)
当刷新网页后,发现这个值在增加(如下图)。
2.4 使用Compose
a. 使用守护进程模式重启Docker Compose sudo docker-compose up -d b. 查看docker_compose.yml文件正在运行的服务(如下图) sudo docker-compose ps
c. 显示Docker-compose服务的日志(如下图) sudo docker-compose logs
d. 停止正在运行的服务(如下图) sudo docker-compose stop
验证服务是否已经停止(如下图):
e. 删除Docker Compose服务 sudo docker-compose rm
7.2 Consul、服务发现和Docker
构建Consul镜像
mkdir consul
cd consul
获取Dockerfile:wget https://www.dockerbook.com/code/7/consul/Dockerfile
获取consul配置文件:wget https://www.dockerbook.com/code/7/consul/consul.json
sudo docker build -t jamtur01/consul .
在本地测试Consul容器
2.1 执行一个本地Consul节点
sudo docker run -p 8500:8500 -p 53:53/udp -h node1 jamtur01/consul -server -bootstrap
注:(1) 这里给consul可执行文件传递的标志:-server告诉Consul代理以服务器的模式运行;-bootstrap告诉Consul本节点可以自选举为集群领导者。 (2) 如果运行上面命令行出现如下图错误。解决方法:将第1步的Dockerfile里的开放端口中的53/udp改为其他端口(这里改为54/udp),并将consul.json中的53改为相应端口(这里改为54)。
正确运行后如下图:
2.2 通过Consul网页界面来查看节点情况,在浏览器里打开本地IP的8500端口
使用Docker运行Cousul集群( 注:会在3个运行Docker守护进程的宿主机上运行Consul )
3.1 在其他两个宿主机上拉取Consul镜像(前提是:已安装Docker)
sudo docker pull jamtur01/consul
3.2 模拟Consul集群,这里使用每台宿主机上的公共接口,这需要每台宿主机都有一个公共IP地址(这个地址也是Consul代理要绑定的到的地址)
给三台宿主机分别设置公共IP(如下三图)
3.3 将具有自启动的主机IP告诉其他宿主机(这里自启动主机IP:192.168.153.133), 在其他宿主机上运行下条命令:
JOIN_IP=192.168.153.133
3.4 获取各个宿主机的docker0的IP地址(查看后(如图):三者一样),并修改/etc/default/docker文件(修改样式完全一样(如图))
3.5 修改完文件后,重启Docker守护进程
sudo service docker restart
启动各宿主机上的Consul节点
4.1 启动具有自启动功能的Consul节点,并查看其日志
注:这里参数-bootstrap-expect 3指Consul集群中有多少代理,只有到达预定的节点数量,在日志中才能看到被选举为集群领导者
4.2 启动其他节点(与上面启动命令很相似,但参数有变化)
4.3 查看Consul领导者选举日志
4.4 通过浏览Consul的网页界面,选择Consul服务也可以看到当前的状态
4.5 测试Consul的DNS服务(dig命令)
配合Consul,在Docker里运行一个分布式服务
5.1 构建分布式应用
5.2 构建分布式客户端
5.3 启动分布式应用
5.4 启动分布式客户端
7.3 Docker Swarm
简介
1.1 Docker Swarm是一个原生的Docker集群管理工具;
1.2 Swarm将一组Docker主机作为一个虚拟的Docker主机来管理;
1.3 Swarm有一个非常简单的架构,它将多台Docker主机作为一个集群,并在集群级别上以标准Docker API的形式提供服务。
安装Swarm(这里在两台主机上安装)
sudo docker pull swarm
创建Swarm集群
3.1 创建Docker Swarm:sudo docker run –rm swarm create
3.2 在一台主机运行swarm代理
3.3 在另一台主机上运行swarm代理
3.4 查看代理的日志
3.5 启动Swarm集群管理者
3.6 在Swarm集群中运行docker info命令
创建容器
4.1 通过循环创建6个Nginx容器
4.2 Swarm在集群中执行docker ps的输出
Swarm是如何决定容器应该在哪个节点上运行?
答:过滤器和策略
5.1 过滤器
a. 约束过滤器; b. 亲和过滤器; c. 依赖过滤器; d. 端口过滤器; e. 健康过滤器
5.2 策略
a. 平铺策略; b. 紧凑策略; c. 随机策略
其他编配工具和组件
Fleet和etcd
Kubernetes
Apache Mesos
Helios
Centurion