目录
一. docker-compose
1.1 docker compose 容器编排概述
- docker compose 的前身是Fig,它是一个定义及运行多个Docker容器的工具
- 使用Docker Compose 不再需要使用shell脚本本来启动容器
- Docker Compose 非常适合组合使用多个容器进行开发的changjing
1.2 Docker Compose 环境安装
[root@localhost ~]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose
[root@localhost ~]# docker-compose-v
1.3 Docker Compose文件结构
[root@localhost compose_lnmp]# vim docker-compose.yml
- YAML是一种标记语言,很直观的数据序列化格式
- 文件格式及编写注意事项
- 不支持制表符tab键缩进,需要使用空格锁进
- 通常开头缩进2个空格
- 字符后缩进一个空格,如冒号、逗号、横杠
- 用#号注释
- 如果包含特殊字符用单引号引起来
- 布尔值必须用括号括起来
1.4 Docker Compose配置常用字段
字段 | 描述 |
---|---|
build | 指定包含构建上下文的路径, 或作为一个对象,该对象具有 context 和指定的 dockerfile 文件以及 args 参数值 |
context | 指定 Dockerfile 文件所在的路径 |
dockerfile | 指定 context 指定的目录下面的 Dockerfile 的名称(默认为 Dockerfile) |
image | 指定镜像 |
command | 执行命令,覆盖默认命令 |
container_name | 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale |
deploy | 指定部署的运行服务相关配置,只能在Swarm模式使用 |
environment | 添加环境变量 |
networks | 加入网络 |
ports | 暴露容器端口,与-p相同,但端口不能低于60 |
volumes | 挂载宿主机路径或命令卷 |
restart | 重启策略,默认no,always,no-failure,unless-stoped |
hostname | 容器主机名 |
1.5 Docker Compose常用命令
字段 | 描述 |
---|---|
build | 重新构建服务 |
ps | 列出容器 |
up | 创建和启动容器 |
exec | 在容器里面执行命令 |
scale | 指定一个服务容器启动数量 |
top | 显示容器进程 |
logs | 查看容器输出 |
down | 删除容器,网络,数据卷和镜像 |
stop/start/restart | 停止/启动/重启服务 |
depends_on | 定义容器启动顺序 (此选项解决了容器之间的依赖关系 |
links | 链接到其它服务中的容器, 该选项是 docker 历史遗留的选项, 目前已被用户自定义网络名称空间取代, 最终有可能被废弃 (在使用 swarm 部署时将忽略该选项) |
- 基本的使用格式
docker-compose [options] [COMMAND] [ATGS…] - docker-compose选项
- –verbose 输出更多调试信息
- –version 打印版本并退出
- -f , --file FILE 使用特定的compose 模板文件,默认为docker-compose.yml
- -p,–project-name NAME 指定项目名称,默认使用目录名称
1.6 使用Docker Compose编排nginx容器
Docker Compose 设计架构
[root@localhost wwwroot]# tree /root/compose_nginx/
/root/compose_nginx/
├── docker-compose.yml
├── nginx
│ ├── Dockerfile
│ └── nginx-1.12.2.tar.gz
└── wwwroot
└── index.html
1.61 安装docker-ce
环境以docker为基础,安装docker的步骤参见以下链接:
https://blog.csdn.net/weixin_48192495/article/details/109626644
1.62 下载compose工具
[root@LPH ~]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@LPH ~]# chmod +x docker-compose
[root@LPH ~]# mv docker-compose /usr/bin
1.63 创建dockerfile的目录
mkdir compose_nginx
cd compose_nginx/
mkdir nginx && cd nginx/
1.64 在nginx目录中写dockerfile文件
vim Dockerfile
FROM centos:7
MAINTAINER this is a nginx image <liang>
RUN yum -y update
RUN yum -y install gcc gcc-c++ pcre* make cmake zlib-devel openssh* net-tools lsof telnet passwd vim
ADD nginx-1.12.2.tar.gz /usr/local/src
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/local/src/nginx-1.12.2
RUN (./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module)
RUN make && make install
ENV PATH /usr/local/nginx/sbin/:$PATH
#RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
#指关闭守护进程启动
CMD ["nginx"]
1.65 配合dockerfile文件中add部分涉及到的文件,添加到目录
上传源码包nginx-1.12.2.tar.gz到nginx 目录
最后nginx目录
[root@localhost nginx]# ls
Dockerfile nginx-1.12.2.tar.gz
### 1.66 编写yaml文件
[root@localhost compose_nginx]# vim /root/compose_nginx/docker-compose.yml
version: '3'
services:
nginx:
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 1216:80
- 1217:443
networks:
- cluster
volumes:
- ./wwwroot:/usr/local/nginx/html
networks:
cluster:
1.66 执行程序查看生成的容器
[root@localhost compose_nginx]# docker-compose -f docker-compose.yml up -d
[root@localhost compose_nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9276e49e14b4 compose_nginx_nginx "nginx" 12 minutes ago Up 12 minutes 0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp compose_nginx_nginx_1
1.67 制作测试页并测试
[root@localhost compose_nginx]# cat /root/compose_nginx/wwwroot/index.html
this is peihua.com
真机使用谷歌浏览器:12.0.0.25:1217
二. docker consul 容器服务发现与更新
consul 属于微服务中的一种
2.1 容器服务更新与发现拓扑图
- 左边ngnix 作为反向代理
- consul template 相当于配置文件模板
- consul agent:包括consul server 和consul client,相当于监控
- registrator 注册机
- 右边节点搭建业务容器
工作原理:
右边的业务节点的配置文件发生改变,或者增加,减少。例如:当增加一个容器的时候就会
注册registrator,registrator会通知consul agent需要更新, consul监控到后端增加了一个容器后,便会把新增容器的IP地址和端口等参数以变量的方式传递给consul complate 模板,consul complate 会生成一个新的nginx配置文件,替代原来的配置文件,使新的容器被发现并且更新进集群。
2.2 构建自动发现的Docker服务架构
2.21 构建consul 服务
- 每个提供服务的节点上都要部署和运行consul的agent
- consul agent 有两种运行模式
- Server
- Client
- Server 和 Client 只是consul 集群层面的区分,与搭建在cluster之上的应用服务无关
[root@localhost ~]# mkdir consul
[root@localhost ~]# cd consul
[root@localhost consul]# unzip consul_0.9.2_linux_amd64.zip
[root@localhost consul]# mv consul /usr/bin
[root@localhost consul]#
consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=12.0.0.25 -client=0.0.0.0 -node=consul-server01 &> /var/log/consul.log&
2.22 查看集群信息
[root@localhost consul]# consul members
[root@localhost consul]# consul members
Node Address Status Type Build Protocol DC
consul-server01 12.0.0.25:8301 alive server 0.9.2 2 dc1
[root@localhost consul]# consul info | grep leader
leader = true
leader_addr = 12.0.0.25:8300
//通过http api 获取集群信息
//查看集群server成员
[root@localhost consul]# curl 127.0.0.1:8500/v1/status/peers
["12.0.0.25:8300"]
//查看集群Raf leader
[root@localhost consul]# curl 127.0.0.1:8500/v1/status/leader
"12.0.0.25:8300"
//查看注册的所有服务
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/services
{"consul":[]}
//查看nginx服务的信息
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/nginx
//集群节点详细信息
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/nodes
[{"ID":"2846b06b-5079-78d3-ec8c-6ae92d5971a1","Node":"consul-server01","Address":"12.0.0.25","Datacenter":"dc1","TaggedAddresses":{"lan":"12.0.0.25","wan":"12.0.0.25"},"Meta":{},"CreateIndex":5,"ModifyIndex":6}]
2.3 实现容器服务自动加入Nginx集群
对于业务端的node节点的操作:
2.31 安装gliderlabs/registrator
- 检查容器运行状态
- 自动注册和注销docker容器的服务到服务配置中心
在12.0.0.26节点操作
[root@localhost ~]#
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=12.0.0.26 \
consul://12.0.0.26:8500
查看状态
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gliderlabs/registrator latest 3b59190c6c80 4 years ago 23.8MB
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20641ed62f11 gliderlabs/registrator:latest "/bin/registrator -i…" 20 minutes ago Up 20 minutes registrator
2.4 验证web容器是否注册到consul
//创建业务容器
[root@localhost ~]# docker run -itd -p 83:80 --name test-01 -h test01 nginx
[root@localhost ~]# docker run -itd -p 84:80 --name test-02 -h test02 nginx
[root@localhost ~]# docker run -itd -p 85:80 --name test-03 -h test03 nginx
[root@localhost ~]# docker run -itd -p 86:80 --name test-04 -h test04 httpd
//查看容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd6ffd76bc08 httpd "httpd-foreground" 11 minutes ago Up 11 minutes 0.0.0.0:86->80/tcp test-04
f4b5145c58a3 nginx "/docker-entrypoint.…" 12 minutes ago Up 12 minutes 0.0.0.0:85->80/tcp test-03
2ae9b0bb7ef9 nginx "/docker-entrypoint.…" 13 minutes ago Up 13 minutes 0.0.0.0:84->80/tcp test-02
0b17fef17ceb nginx "/docker-entrypoint.…" 14 minutes ago Up 14 minutes 0.0.0.0:83->80/tcp test-01
20641ed62f11 gliderlabs/registrator:latest "/bin/registrator -i…" 26 minutes ago Up 26 minutes registrator
//真机输入:12.0.0.25:8500
注意:consul server的端口号为8500
//测试网页是否开启
输入:12.0.0.26:83
//对应节点位置查看日志
(12.0.0.26)
[root@localhost ~]# docker logs -f test-01
2.5 使用docker template 自动更新nginx集群
- Consul-Template 是一个守护进程,用于实时查询Consul 集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。
- 更新完成以后,可以选择运行shell命令执行更新操作,重新加载Nginx。
- Consul-Template可以查询Consul中的服务目录、key、key-values等
- 这种强大的抽象功能和查询语言模板可以使Consul-Template 特别适合动态的创建配置文件
- 例如:创建Apache/Nginx Proxy Balancers 、Haproxy Backends
2.51 安装consul-template
[root@localhost ~]# unzip consul-template_0.19.3_linux_amd64.zip
[root@localhost ~]# mv consul-template /usr/bin
2.52 准备template nginx 模板文件
结构图:
备注:
此模板用于nginx反向代理模板
nginx.ctmpl跟nginx没有直接关系
consul是docker的一种自动管理机制
nginx.ctmpl中的参数以变量的形式写入
[root@localhost consul]# vim //root/consul/nginx.ctmpl
upstream http_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 87;
server_name localhost 12.0.0.25;
access_log /var/log/nginx/lph.com-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
2.53 编译安装nginx (做反向代理)
[root@localhost consul]# yum install gcc gcc-c++ pcre-devel zlib-devel make -y
[root@localhost consul]# ls
nginx-1.12.2.tar.gz nginx.ctmpl
[root@localhost consul]# tar zxvf nginx-1.12.2.tar.gz -C /opt
[root@localhost consul]# cd /opt/nginx-1.12.2/
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
[root@localhost nginx-1.12.2]# make && make install
2.54 配置nginx,然后启动
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
include vhost/*.conf; //添加虚拟主机目录
default_type application/octet-stream;
//检验一下配置文件的语法
[root@localhost nginx-1.12.2]# /usr/local/nginx/sbin/nginx -t
//创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost
//创建日志文件目录(在template那里定义了这个目录)
mkdir /var/log/nginx
//启动nginx
[root@localhost nginx-1.12.2]# /usr/local/nginx/sbin/nginx
2.55 准备工作完毕,启动template,指定template模板文件及生成路径
指定模板路径,/root/consul/nginx.ctmpl,生成到/usr/locla/nginx/conf/vhost/lph.conf,然后重载nginx -s reload
[root@localhost nginx-1.12.2]# consul-template -consul-addr 12.0.0.25:8500 \
> -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/lph.conf:/usr/local/nginx/sbin/nginx -s reload" \
> --log-level=info
已进入监控状态
2.56 打开另一个终端查看生成配置文件
[root@localhost conf]# cd /usr/local/nginx/conf/vhost/
[root@localhost vhost]# ls
lph.conf
[root@localhost vhost]# cat lph.conf
upstream http_backend {
server 12.0.0.26:83;
server 12.0.0.26:84;
server 12.0.0.26:85;
}
server {
listen 88;
server_name localhost 12.0.0.25;
access_log /var/log/nginx/lph.com-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
2.57 在客户端测试并结合nginx后端容器节点logs验证
- 如果能访问且后端容器节点logs互为轮询说明服务已自动发现及更新配置文件完毕
//在业务节点
[root@localhost ~]# docker logs -f test-01
[root@localhost ~]# docker logs -f test-02 //新开一个终端
三. consul 多节点
//添加一台已有docker环境的服务器12.0.0.22/24 加入已有的群集中
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=12.0.0.22 \
-client=0.0.0.0
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 12.0.0.25 &> /var/log/condul.log &
-enable-script-checks=true 设置检查服务为可用
-datacenter=dc1 数据中心名称
-join 加入已有的群集中