一个大型的Docker组件的微服务应用程序中,容器的数据非常庞大,如果单依赖于传统的人工配置方式进行维护,这对于开发和运维简直是噩梦。这个时候Compose的出现正是为了解决这个问题。
Docker Compose的前身是Fig,Fig被Docker收购之后正式更名为Docker Compose,Compose向下兼容Fig。
Docker Compose是一个用于定义和运行多容器Docker应用的工具,只需要一个Compose的配置文件和一个简单的命令就可以创建并运行应用所需的所有容器,而不再需要使用Shell脚本来启动容器
Docker Compose非常适合组合使用多个容器进行开发的场景,也可以理解为一个批量创建,运行容器的工具
Docker Compose的文件结构:
YAML是一种标记语言很直观的数据序列化格式
① 使用Dokcerfile 定义应用程序的环境
② 使用docker-compose.yml 定义构成应用程序的服务,这样它们就可以再隔离环境中一起运行
③ 最后执行 docker-compose up 命令来启动并运行整个应用程序
字段 描述
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 容器主机名
字段 描述
build 重新构建服务
ps 列出容器
up 创建和启动容器
exec 在容器里面执行命令
scale 指定一个服务容器启动数量
top 显示容器进程
logs 查看容器输出
down 删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务
Docker-Compose选项:
-verbose:输出更多调试信息
-version:打印版本并退出
-f,-file FILE使用特定的Compose模板文件,默认位docker-compose.yum
-p,-project-name NAME 指定项目名称,默认使用目录名称
1.环境部署所有主机安装docker环境(内容为docker基础)
yum install docker-ce -y
2.下载Compose(上传docker-compse包)
[root@localhost ~]# docker ps -a
[root@localhost ~]# ls
[root@localhost ~]# cp -p docker-compose /usr/bin
[root@localhost ~]# cd /usr/bin/
[root@localhost bin]# ls
3.给docker-compose授权
[root@localhost bin]# chmod +x docker-compose
[root@localhost ~]# mkdir compose_nginx
[root@localhost ~]# yum -y install tree
4.使用dockerfile
[root@localhost ~]# cd compose_nginx/
[root@localhost compose_nginx]# mkdir nginx
[root@localhost compose_nginx]# cd nginx/
[root@localhost nginx]# vim Dockerfile
FROM centos:7
MAINTAINER this is nginx
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src
WORKDIR /usr/local/src
WORKDIR nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
5.编写启动脚本
[root@localhost compose_nginx]# vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
6.创建index.html
[root@localhost compose_nginx]# mkdir wr
[root@localhost compose_nginx]# cd wr/
[root@localhost wr]# vim index.html
编写网页内容:this is nginx
[root@localhost compose-nginx]# tree
.
├── nginx
│ ├── Dockerfile
│ ├── nginx-1.12.0.tar.gz
│ └── run.sh
└── wr
└── index.html
7.创建模板脚本
[root@localhost compose_nginx]# vim docker-compose.yaml
version: '3'
services:
nginx:
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 1234:80
- 1235:443
networks:
- cluster
volumes:
- ./wr:/usr/local/nginx/html
networks:
cluster:
[root@localhost compose_nginx]# docker-compose -f docker-compose.yaml up -d
-d:守护进程
[root@localhost compose_nginx]# docker images
[root@localhost compose_nginx]# docker ps -a
Consul是一个分布式、高可用的系统,是一个为了解决在生成环境中服务注册,服务发现,服务配置的一个工具,它有多个组件,提供如下几个关键的功能:
1.服务发现: Consul的某些客户端可以提供一个服务,例如api或者mysql,其它客户端可以使用Consul去发现这个服务的提供者。使用DNS或者HTTP,应用可以很容易的找到他们所依赖的服务。
2.健康检查:Consul客户端可以提供一些健康检查,这些健康检查可以关联到一个指定的服务(服务是否返回200 OK),也可以关联到本地节点(内存使用率是否在90%以下)。这些信息可以被一个操作员用来监控集群的健康状态,被服务发现组件路由时用来远离不健康的主机。
3.键值存储:应用可以使用Consul提供的分层键值存储用于一些目的,包括动态配置、特征标记、协作、leader选举等等。通过一个简单的HTTP API可以很容易的使用这个组件。
4.多数据中心:Consul队多数据中心有着非常好的支持,这意味着Consul用户不用担心由于创建更多抽象层而产生多个区域
① 支持健康检查,允许存储键值对
② 一致性协议采用Raft算法,用来保证服务高可用
③ 成员管理和消息广播采用GOSSIP协议,支持ACL访问控制
④ 方便部署,与Docker等轻量级容器可无缝配合
consul server定义,读取前端的配置模板后端的客户端部署registrator去监听本地集群是否出现扩展,如果出现扩展容器,会报告给consul server端,由consul agent代理去指定更新(前端的反向代理池)到模板文件中并同步到前端,保证前端对后端的动态识别。
1.集群解析
解析:
后端每构建出一个容器,会向registrator进行注册,控制consul 完成更新操作,consul会触发consul template模板进行个更新
核心机制:consul :自动发现、自动更新,为容器提供服务(添加、删除、生命周期)
2.设备配置
服务器:192.168.1.10
所需软件包:Docker-ce、 Compose 3、Consul、 Consul-template
服务器:192.168.1.11
所需软件包:Docker-ce、registrator
3.部署consul服务器
[root@localhost consul]# mkdir consul
[root@localhost consul]# cd consul/
上传压缩包
[root@localhost consul]# unzip consul_0.9.2_linux_amd64.zip 解压缩
[root@localhost consul]# ls
[root@localhost consul]# mv consul /usr/bin/
[root@localhost consul]# ll /usr/bin | grep consul
consul agent \
-server \ 服务端
-bootstrap \ 前端框架
-ui \ 可被访问的web界面
-data-dir=/var/lib/consul-data \
-bind=192.168.1.10 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log & 混合输出并后台运行
4.查看集群信息
[root@localhost consul]# jobs 查看状态
[root@localhost consul]# consul members
[root@localhost consul]# consul info | grep leader
5.通过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 服务信息
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/nodes
[{"ID":"4a72b115-6e44-38a8-3159-c8ab6c45cc7e","Node":"consul-server01","Address":"192.168.1.10","Datacenter":"dc1","TaggedAddresses":{"lan":"192.168.1.10","wan":"192.168.1.10"},"Meta":{},"CreateIndex":5,"ModifyIndex":6}]
6.容器服务自动加入consul集群
安装 Gliderlabs/Registrator Gliderlabs/Registrator
可检查容器运行状态自动注册,还可注销 docker 容器的服务 到服务配置中心。
目前支持 Consul、Etcd 和 SkyDNS2
在192.168.1.11节点服务器上
[root@localhost ~]# docker run -d \
> --name=registrator \ 名称
> --net=host \
> -v /var/run/docker.sock:/tmp/docker.sock \ 挂载
> --restart=always \ 重启策略永远
> gliderlabs/registrator:latest \
> -ip=192.168.1.11 \
> consul://192.168.1.10:8500
[root@localhost consul]# netstat -anpt | grep 8500
tcp6 0 0 :::8500 :::* LISTEN 71364/consul
tcp6 0 0 192.168.1.10:8500 192.168.1.11:53232 ESTABLISHED 71364/consul
8.测试服务发现功能是否正常
注:在第二台服务器上
docker run -itd -p:112:80 --name test-02 -h test02 nginx
docker run -itd -p:113:80 --name test-03 -h test03 httpd
docker run -itd -p:114:80 --name test-04 -h test04 httpd
9.验证 http 和 nginx 服务是否注册到 consul
浏览器输入 http://192.168.1.10:8500,“单击 NODES”,然后单击 “consurl-server01”,会出现 4 个服务
10.在consul服务器上查看服务
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/services
{"consul":[],"httpd":[],"nginx":[]}
Consul-Template 是一个守护进程,用于实时查询 Consul 集群信息,并更新文件系统 上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新 操作,重新加载 Nginx。Consul-Template 可以查询 Consul 中的服务目录、Key、Key-values 等。
这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。
例如:创建 Apache/Nginx Proxy Balancers、Haproxy Backends
1.准备 template nginx 模板文件
在consul上操作
vim /root/consul/nginx.ctmpl
vim /root/consul/nginx.ctmpl
upstream http_backend {
{{range service "nginx"}} 双括号表示范围
server {{.Address}}:{{.Port}}; 此处引用的变量会指向后端的地址和端口(动态变化)
{{end}}
}
server {
listen 112;
server_name localhost 192.168.1.10; 反向代理的IP地址
access_log /var/log/nginx/kgc.cn-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr; 后端真实IP
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 转发地址
proxy_pass http://http_backend; 反向代理
}
}
2.编译安装nginx
[root@server1 consul]# vim nginx.ctmpl
上传nginx-1.12.0.tar.gz
[root@localhost consul]# ls
[root@localhost consul]# yum install gcc pcre-devel zlib-devel -y
[root@localhost consul]# cd compose_nginx/
[root@localhost compose_nginx]# cd nginx/
[root@localhost nginx]# tar zxvf nginx-1.12.0.tar.gz -C /opt
[root@localhost nginx]# cd /opt/
[root@localhost opt]# ls
containerd nginx-1.12.0 rh
[root@localhost opt]# cd nginx-1.12.0/
[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx
[root@localhost nginx-1.12.0]# make && make install
3.配置Nginx
[root@localhost nginx-1.12.0]# cd /usr/local/nginx/conf/
[root@localhost conf]# ls
[root@localhost conf]# vim nginx.conf
[root@localhost conf]# mkdir /usr/local/nginx/conf/vhost 创建虚拟主机目录
[root@localhost conf]# mkdir /var/log/nginx 创建日志文件目录
[root@localhost conf]# /usr/local/nginx/sbin/nginx 启动nginx
http {
include mime.types;
include vhost/*.conf; 添加虚拟主机目录(consul动态生成的配置文件就会放在这里)可识别vhost文件中所有的.conf文件,兼容子配置文件
default_type application/octet-stream;
上传 consul-template_0.19.3_linux_amd64.zip 包到/root 目录下
[root@localhost ~]# ls
[root@localhost ~]# unzip consul-template_0.19.3_linux_amd64.zip
[root@localhost ~]# ls
[root@localhost ~]# mv consul-template /usr/bin/
[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# ls
[root@localhost conf]# cd vhost/
[root@localhost vhost]# consul-template -consul-addr 192.168.1.10:8500 \
> -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" \
> --log-level=info
5.另外新打开一个会话终端查看生成配置文件
[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# ls
[root@localhost conf]# cd vhost/
[root@localhost vhost]# ls
[root@localhost vhost]# vi kgc.conf
6.增加一个nginx容器节点
增加一个 nginx 容器节点,测试服务发现及配置更新功能
在第二台服务器上,registrator服务端注册
[root@localhost ~]# docker run -itd -p:115:80 --name test-05 -h test05 nginx
[root@localhost ~]# docker run -itd -p:116:80 --name test-06 -h test06 nginx