Docker Compose 容器编排理论加实操
目录
- Docker Compose 容器编排理论加实操
- 一、Docker Compose简介
- 二、Docker Compose配置介绍
- (一)、Docker Compose配置常用字段
- (二)、Docker Compose 常用命令
- (三)、Compose 命令说明
- 三、Dokcer 编排实验
- 3.1 下载compose
- 3.2 构建Nginx
- 四、Consul 容器自动更新与发现
- (一)、Consul 介绍
- 1、关键功能
- (二)、Consul中的基本概念
- (三)、Consul 原理概述
- 3.1 Consul 核心 agent组件
- 3.2 Consul 通信接口
- 五、 搭建Consul集群实验
- 5.1 实验环境
- 5.2 配置 consul服务器
- 5.3 容器服务自动加入nginx集群---(记得关闭防火墙)
- 5.5 consul多节点
一、Docker Compose简介
- Docker Compose的前身是Fig,Fig被Docker收购之后正式更名为Compose,Compose向下兼容Fig
- Docker Compose是一个用于定义和运行多容器Docker应用的工具,只需要一个Compose的配置文件和一个简单的命令就可以创建并运行应用所需的所有容器,而不再需要使用shell脚本来启动容器
- Docker Compose 非常适合组合使用多个容器进行开发的场景
- Docker Compose 的文件结构:
vim docker-compose.yml
YAML 是一种标记语言很直观的数据序列化格式。 文件格式及编写注意事项如下所示:
- ① 不支持制表符Tab 建缩进,需要使用空格缩进
- ② 通常开头缩进2个空格
- ③ 字符后缩进1个空格,如:冒号,逗号,横杆
- ④ 用井号注释
- ⑤ 如果包含特殊字符用单引号引起来
- ⑥ 布尔值必须用单引号括起来
Docker compose 使用的三个步骤:
① 使用Dokcerfile 定义应用程序的环境
② 使用docker-compose.yml 定义构成应用程序的服务,这样它们就可以再隔离环境中一起运行
③ 最后执行 docker-compose up 命令来启动并运行整个应用程序
二、Docker Compose配置介绍
(一)、Docker Compose配置常用字段
字段 | 描述 |
build dockerfile context | 指定Dockerfile文件名构建镜像上下文路径 |
image | 指定镜像 |
command | 执行命令,覆盖默认命令 |
container name | 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale |
deploy | 指定部署和运行服务相关配置,只能在Swarm模式使用 |
environment | 添加环境变量 |
networks | 加入网络 |
ports | 暴露容器端口,与-p相同,但端口不能低于60 |
volumes | 挂载宿主机路径或命令卷 |
restart | 重启策略,默认no,always,no-failure,unless-stoped |
hostname | 容器主机名 |
(二)、Docker Compose 常用命令
字段 | 描述 |
build | 重新构建服务 |
ps | 列出容器 |
up | 创建和启动容器 |
exec | 在容器里面执行命令 |
scale | 指定一个服务容器启动数量 |
top | 显示容器进程 |
logs | 查看容器输出 |
down | 删除容器、网络、数据卷和镜像 |
stop/start/restart | 停止/启动/重启服务 |
(三)、Compose 命令说明
docker-compose选项
–verbose 输出更多调试信息
–version 打印版本并退出
-f, --file FILE 使用特定的 compose 模板文件,默认为 docker-compose.yml
-p, --project-name NAME 指定项目名称,默认使用目录名称
三、Dokcer 编排实验
实验环境:
环境部署主机安装docker环境
3.1 下载compose
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
环境设置
cp -p docker-compose /usr/local/bin
chmod +x /usr/local/bin/docker-compose
docker-compose --version
3.2 构建Nginx
- 创建工作目录,将nginx软件包拷贝到该目录
mkdir /opt/compose-nginx
cd /opt/compose-nginx
vim /opt/compose-nginx/docker-compose.yml
version: '3'
services:
nginx:
hostname: nginx
build:
context: .
dockerfile: Dockerfile
ports:
- 1216:80
- 1217:443
networks:
- cluster
volumes:
- ./wwwroot:/usr/local/nginx/html
networks:
cluster:
将之前写好的Dockerfile、run.sh、nginx压缩包都放到这个目录下面
添加首页内容:
构建镜像
docker-compose -f docker-compose.yml up -d
查看容器、使用浏览器访问测试
四、Consul 容器自动更新与发现
(一)、Consul 介绍
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置
1、关键功能
① 服务发现: Consul的某些客户端可以提供一个服务,例如api或者mysql,其它客户端可以使用Consul去发现这个服务的提供者。使用DNS或者HTTP,应用可以很容易的找到他们所依赖的服务。
② 健康检查:Consul客户端可以提供一些健康检查,这些健康检查可以关联到一个指定的服务(服务是否返回200 OK),也可以关联到本地节点(内存使用率是否在90%以下)。这些信息可以被一个操作员用来监控集群的健康状态,被服务发现组件路由时用来远离不健康的主机。
③ 键值存储: 应用可以使用Consul提供的分层键值存储用于一些目的,包括动态配置、特征标记、协作、leader选举等等。通过一个简单的HTTP API可以很容易的使用这个组件。
④ 多数据中心:Consul队多数据中心有着非常好的支持,这意味着Consul用户不用担心由于创建更多抽象层而产生多个区域
特点:
① 支持健康检查,允许存储键值对
② 一致性协议采用Raft算法,用来保证服务高可用
③ 成员管理和消息广播采用GOSSIP协议,支持ACL访问控制
④ 方便部署,与Docker等轻量级容器可无缝配合
Consul 作用
现在企业应用都向微服务化方向发展,当把我们的系统功能拆分成一个一个的微服务后,存在以下问题:
① 需要配置N个服务的网络位置,加大配置的复杂性
② 服务的网络位置变化,都需要改变每个调用者的配置
③ 集群的情况下,除了反向代理方式,难以做负载
(二)、Consul中的基本概念
① Client
表示 Consul 客户端模式,是 Consul 节点的一种模式,所有注册到 Client 节点的服务会被转发到 Server 。本身无状态不持久化如何数据。Client 通过 HTTP、DNS、GRPC 接口请求转发给局域网内的服务端集群。
② Server
表示 Consul 的服务端模式, Server 功能和 Client 都一样,不同的是 Server 持久化数据到本地。在局域网内与本地 Client 通讯,通过广域网与其他数据中心通讯。每个数据中心的 Server 数量推荐为 3 个或是 5 个。
③ Server-leader
表示这个 Server 是它们的老大,它和其它 Server 不一样的一点是,它需要负责同步注册的信息给其它的 Server 节点,同时也要负责各个节点的健康监测。如果 Leader 宕机了,通数据中心的所有 Server 内部会使用 Raft 算法来在其中选取一个 Leader 出来。
④ Agent
Agent 是 Consul 的核心进程,Agent 的工作是维护成员关系信息、注册服务、健康检查、响应查询等等。Consul 集群的每一个节点都必须运行 agent 进程
server 与 client 只是 consul 群集层面的区分,与搭建在 cluster 之上的应用服务无关。
(三)、Consul 原理概述
在分布式系统结构中,往往由成百上千的业务服务组成,为了容灾(节点宕机)、扩容(增加节点)、提高运维效率(动态配置)等原因,需要服务能够实现灵活发现,避免问题节点等功能,以提高系统稳定性
① 服务发现及注册
当服务Producer 启动时,会将自己的Ip/host等信息通过发送请求告知 Consul,Consul 接收到 Producer 的注册信息后,每隔一段时间会向 Producer 发送一个健康检查的请求,检验Producer是否健康。
② 服务调用
当 Consumer 请求Product时,会先从 Consul 中拿到存储Product服务的 IP 和 Port 的临时表(temp table),从temp table表中任选一个· Producer 的 IP 和 Port, 然后根据这个IP和Port,发送访问请求;temp table表只包含通过了健康检查的 Producer 信息,并且每隔一段时间更新
3.1 Consul 核心 agent组件
Agent是一个独立的程序,通过守护进程的方式,运行在consul集群中的每个节点上。每个Consul agent维护它自己的服务集合以及检查注册和健康信息。agent负责执行自己的健康检查和更新本地状态其中,Agent 根据节点的性质,分为:
Agent Server
client将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。
Agent Client
server 保存client的注册信息,集群的配置信息, 维护集群高可用, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个,通过 Raft 算法来保证一致性。
3.2 Consul 通信接口
① RPC
用于内部通讯Gossip/日志分发/选主等
② HTTP API
服务发现/健康检查/KV存储等几乎所有功能, 默认端口为8500
③ Consul Commands (CLI)
consul命令行工具可以与consul agent进行连接,提供部分consul的功能。
实际上Consul CLI 默认就是调用的HTTP API来与consul集群进行通讯。
④ DNS
仅用于服务查询,例如:dog @127.0.0.1 -p 8600 web.service.consul
可以通过cosul提供的DNS接口来获取当前的服务“web”对应的可用节点
Consul 内部端口说明:
端口 | 说明 |
TCP/8300 | 8300端口用于服务器的节点,客户端通过该端口RPC协议调用服务端节点 |
TCP/UDP/8301 | 8301端口用于单个数据中心所有节点之间的相互通讯,即对LAN池信息的同步,它使得整个数据中心能够自动发现服务器地址,分布式检测节点故障,事件广播(如leader选举事件) |
TCP/UDP/8302 | 8302端口用于单个或多个数据中心之间的服务器节点的信息同步,即对LAN池信息的同步,它针对互联网的高延迟进行优化,能够实现跨数据中心请求 |
8500 | 8500端口基于HTTP协议,用户API接口或WEB UI访问 |
8600 | 8600端口作为DNS服务器,它使得我们可以通过节点名查询节点信息 |
五、 搭建Consul集群实验
5.1 实验环境
基于之前的实验,在准备一台装好docker的centos
第一台centos 7 IP地址:192.168.126.10
需求的软件包:Docker-ce、Compose 3 、Consul、Consul-template
第二台centos 7 IP地址:192.168.226.133
需求的软件包:Docker-ce 、registrator
5.2 配置 consul服务器
安装consul软件包
mkdir /root/consul
cd /root/consul
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/bin
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.126.10 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
查看集群信息
consul members
consul info | grep leader
通过httpd api 获取集群信息
curl 127.0.0.1:8500/v1/status/peers //查看集群server成员
curl 127.0.0.1:8500/v1/status/leader //集群Raf leader
curl 127.0.0.1:8500/v1/catalog/services //注册的所有服务
curl 127.0.0.1:8500/v1/catalog/nginx //查看nginx服务信息
curl 127.0.0.1:8500/v1/catalog/nodes //集群节点详细信息
5.3 容器服务自动加入nginx集群—(记得关闭防火墙)
1、安装Gliderlabs/Registrator(可检查容器运行状态自动注册,还可以注销docker容器的服务 到服务配置中心)
目前支持 Consul、Etcd和SkyDNS2
另起一台服务器操作 192.168.126.20
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.126.20 \
consul://192.168.126.10:8500
2、测试服务功能是否正常
docker run -itd -p 83:80 --name test-1 -h test1 nginx
docker run -itd -p 84:80 --name test-2 -h test2 nginx
docker run -itd -p 88:80 --name test-3 -h test3 httpd
docker run -itd -p 89:80 --name test-4 -h test4 httpd
3、验证http和nginx服务是否注册到consul
浏览器输入 http://192.168.126.10:8500 单击“NODES”,然后单击“consul-server”,会出现5个服务
在consul服务器上查看
[root@consul consul]#curl 127.0.0.1:8500/v1/catalog/services
{"consul":[],"httpd":[],"nginx":[]}
4、安装consul-template(consul服务器)
Consul-Tepmlate是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件,更新完成以后,可以选择运行shell命令执行更新操作,重新加载Nginx Consul-Tepmlate可以查询到Consul中的服务目录,Key,Key-values等
其强大的抽象功能和查询语言模板使得Consul-Template特别适合动态的创建配置文件,
例如:Nginx/Apache Proxy Balancers、Haproxy Backends
5、 准备 Template nginx模板文件
在consul服务器的consul目录中添加nginx模板
vim /root/consul/nginx.ctmpl
upstream http_backend { #群集模块模板
{{range service "nginx"}} #指定nginx服务项
server {{.Address}}:{{.Port}}; #指向真实服务器的地址和端口“{{.Address}}” 此参数会根据consul群集的参数自动设置上去
{{end}} #结束语句(以上为轮询请求方式)
}
server {
listen 88; #对外提供的端口,可自行设置,只要不起冲突
server_name localhost 192.168.126.10; #本地反向代理的节点地址
access_log /var/log/nginx/kgc.cn-access.log; #访问日志文件目录(需手动创建)
index index.html index.php; #指定访问的index 首页类型
location / {
proxy_set_header HOST $host; #反向代理的请求头部信息
proxy_set_header X-Real-IP $remote_addr; #真实服务器IP
proxy_set_header Client-IP $remote_addr; #客户IP
proxy_set_header X-Fprwarded-For $proxy_add_x_forwarded_for; #Forward转发地址
proxy_pass http://http_backend; #反向代理指向upstream地址池
}
}
6、手工编译安装nginx服务
yum install gcc gcc-c++ pcre-devel zlib-devel -y
把nginx压缩包放到/root/consul目录
tar zxvf nginx-1.12.0.tar.gz -C /opt
cd /opt/nginx-1.12.0/
./configure --prefix=/usr/local/nginx
make && make install
7、配置nginx
vim /usrlocal/nginx/conf/nginx.conf
#在http模块下 添加
http {
include mime.types;
include vhost/*.conf; #vhost目录需手动创建
#在http模块下 添加include vhost/*.conf
创建虚拟主机vhost文件目录
mkdir /usr/local/nginx/conf/vhost
创建日志文件目录
mkdir /var/log/nginx
启动nginx
/usr/local/nginx/sbin/nginx
8、配置并启动template
上传consul-template_0.19.3_linux_amd64.zip 包到/root目录下
unzip consul-template_0.19.3_linux_amd64.zip
mv consul-template /usr/bin/
启用模板
consul-template -consul-addr 192.168.126.10:8500 -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info
参数详解:
-consul-addr 192.168.226.132:8500:指向consul服务端节点
-template "/root/consul/nginx.ctmpl:指定模板路径
:/usr/local/nginx/conf/vhost/test.conf:指定文件生成到vhost中并命名为test.conf
:/usr/local/nginx/sbin/nginx -s reload:不中断服务reload重载nginx服务让配置文件生效
–log-level=info:产生日志,级别为info(日志生成位置在nginx.ctml中定义“access_log”)
另外打开一个终端查看生成配置文件
cat /usr/local/nginx/conf/vhost/test.conf
增加一个nginx容器节点,测试服务器发现以及配置更新功能
docker run -itd -p 85:80 --name test-5 -h test5 nginx
查看kgc.conf中的服务信息
cat /usr/local/nginx/conf/vhost/test.conf
5.5 consul多节点
添加一台已有docker环境的服务器192.168.126.40/24加入已有的群集中
mkdir /root/consul
cd /root/consul
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/bin
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.126.40 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 192.168.126.10 &> /var/log/consul.log &
-enable-script-checks=true \ #设置检查服务为可用
-datacenter=dc1 \ #数据中心名称
-jion 192.168.126.10 &> /var/log/consul.log & 加入到已有集群中