Docker Compose 将所管理的容器分为三层,工程(project),服务(service)以及容器(contaienr)
Docker Compose 运行的目录下的所有文件(docker-compose.yml, extends 文件或环境变量文件等)组成一个工程
若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖
一个服务当中可包括多个容器实例,Docker Compose 并没有解决负载均衡的问题,因此需要借助其他工具实现服务发现及负载均衡
Docker Compose 是一个用来创建和运行多容器应用的工具
使用 Compose 首先需要编写Compose 文件来描述多个容器服务以及之间的关联,然后通过命令根据配置启动所有的容器
Dockerfile 可以定义一个容器,而一个 Compose 的模板文件(YAML 格式)可以定义一个包含多个相互关联容器的应用
Compose 项目使用 python 编写,基于后面的实验中我们将学习的 Docker API 实现
使用docker compose管理nginx、haproxy镜像,实现nginx网页的高可用
其实就是在一台宿主机上同时利用多个镜像拉起多个容器,实现负载均衡
主机信息 | 主机的功能 |
服务端server2(172.25.6.2) | 安装好docker相关组件,配置好服务 |
测试端真机(172.25.6.250) | 测试web负载均衡 |
在server2上安装:
yum install containerd.io-1.2.5-3.1.el7.x86_64.rpm dockerce18.09.6-3.el7.x86_64.rpm container-selinux-2.21-1.el7.noarch.rpm docker-ce-cli-18.09.6-3.el7.x86_64.rpm -y #安装docker软件以及解决依赖性问题
systemctl start docker #开启docker服务
systemctl enable docker #设置开机自启
镜像的安装 :
打开火狐浏览器输入:https://developer.alihyun.com/mirror
1、点击容器
2、点击docker-toolbox
3、点击软件包所在的地址
4、选择linux系统
5、点击进入compose
6、选择最新的版本进行安装
7、下载并修改相关 docker-compose 软件的信息
(1) 选择下载docker-compose 软件
wget http://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/docker-compose-Linux-x86_64 ##下载docker-compose 软件
scp docker-compose-Linux-x86_64 [email protected]:/usr/local/bin/
(2)、修改权限
mv docker-compose-Linux-x86_64 docker-compose #重命名
chmod +x docker-compose #修改权限
mv docker-machine /usr/local/bin/ #将文件移动到/usr/local/bin/ 否则命令无法生效
(3)、检验docker-compose 命令是否生效
docker-compose --help
8、完成docker-compose相关文件的编辑
(1)、创建compose目录
cd compose/
(2)、编写docker-compose.yml
vim docker-compose.yml ##编辑文件
内容:
web1:
image: nginx
expose:
- 80
volumes:
- ./web1:/usr/share/nginx/html
web2:
image: nginx
expose:
- 80
volumes:
- ./web2:/usr/share/nginx/html
haproxy:
image: haproxy
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
links:
- web1
- web2
ports:
- "80:80"
expose:
- "80"
9、给虚拟机导入Nginx与Haproxy镜像
(1)、拉取镜像
docker load -i haproxy.tar ##导入haproxy 镜像
docker load -i nginx.tar ##导入nginx 镜像
(2)、进入nginx的bash中
docker run -it --rm nginx bash ##进入nginx的bash中
(3)、查看haproxy的历史
docker history haproxy:latest ##查看haproxy的历史
(4)、查看haproxy相关的信息
docker inspect haproxy:latest ##查看haproxy相关的信息
(5)、拉取haproxy的一个bash
docker run -it --rm haproxy bash ##拉取haproxy的一个bash
10.编写测试用的测试页面
(1)、创建相应的发布目录
vim docker-compose.yml
mkdir haproxy web1
mkdir haproxy web2
echo web1 > web1/index.html
echo web2 > web2/index.html
(2)、进入haproxy目录下创建haproxy配置文件
[root@server2 ~]# vim compose/haproxy/haproxy.cfg
内容:
global #全局设置
maxconn 65535
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0 #日志输出设置,所有日志都记录在本机,通过local0输出
uid 200
gid 200
#chroot /var/empty
daemon
defaults #默认设置
mode http #所处理的类别,默认采用http模式,可配置称tcp作4层消息转发
log global #引用全局的日志配置
option httplog #启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志的
option dontlognull ##启用该项,日志中将不记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统是为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来。
monitor-uri /monitoruri
maxconn 8000
timeout client 30s ##haproxy和客户端保持空闲连接的超时时长,在高并发下可稍微短一点,可设置为30秒以尽快释放连接
retries 2
option redispatch
timeout connect 5s ##haproxy和服务端建立连接的最大时长,其实设置为1秒就足够了。局域网内建立连接一般都是瞬间的
timeout server 5s ##haproxy和服务端保持空闲连接的超时时长,局域网内建立连接很快,所以尽量设置短一些,特别是并发时如设置为1-3秒
stats uri /admin/stats #访问监控界面的uri
#The public ‘www’ address in the DMZ
frontend balancer #frontend前端设置
bind *:80 #这里建议使用0.0.0.0:80或*:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。
default_backend dynamic #定义一个web_backends前端部分。此处将对应的请求转发给后端
#The static backend backend for ‘Host: img’, /img and /css.
backend dynamic
balance roundrobin #使用RR负载均衡算法(#banlance roundrobin 轮循,banlance source 保存session值,支持static-rr,leastconn,first,uri等参数)
server n1 web1:80 check #其中n1会在监控界面上显示
server n2 web2:80 check #其中n2会在监控界面上显示
11、安装tree 命令 方便观察各个目录之间的关系
[root@server2 ~]# yum install tree -y ##安装tree命令
[root@server2 ~]# cd compose/
[root@server2 compose]# ##查看compose命令下的树型结构图
[root@server2 compose]# tree .
.
├── docker-compose.yml
├── haproxy
│ └── haproxy.cfg
├── web1
│ └── index.html
└── web2
└── index.html
3 directories, 4 files
(1)、安装tree命令
(2)、查看compose目录下的树型关系图
12、.测试
(1)开启docker-compose(值的注意的是:执行docker-compose命令时,所在目录下,必须有docker-compose.yml文件)
[root@server2 ~]# docker-compose up -d ##开启docker-compose
[root@server2 ~]# docker-compose logs ##查看docker-compose 容器运行的状态
(2)、遇到报错修改后重启docker-compose
[root@server2 ~]# docker-compose restart ##重启docker-compose
(3)、遇到报错修改后开启docker-compose 依然有报错应该先清空之前的实验数据命令如下
[root@server2 ~]# docker-compose down ##清空实验缓存信息
[root@server2 ~]# docker-compose up ##开启
(4)、查看修改是否正确
[root@server2 ~]# docker-compose up -d
[root@server2 ~]# docker-compose logs
(5)、在网页上测试实验是否能实现轮询功能
(6)、在网页上查看haproxy对节点的监控状态
172.25.6.2/admin/stats
(7)、在真机上测试
[root@foundation6 ~]# curl 172.25.6.2
(8)、在server2本机上进行测试
[root@server2 ~]# docker-compose ps ##查看生成容器的名称
[root@server2 ~]# docker inspect compose_haproxy_1 ##查看生成节点的信息
[root@server2 ~]# docker inspect compose_web1_1
[root@server2 ~]# docker inspect compose_web2_1
compose_haproxy_1 节点信息
compose_web2_1节点信息
输入相应的ip就可以测试
1、修改docker-compose.yml 文件
[root@server2 ~]# vim compose/docker-compose.yml ##编辑docker-compose.yml文件
内容:
version: "3" ##写入版本号
services:
web1:
image: nginx
volumes:
- web-data:/usr/share/nginx/html
networks:
- my_net
web2:
image: nginx
volumes:
- web-data:/usr/share/nginx/html
networks:
- my_net
haproxy:
image: haproxy
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
expose:
- 80
ports:
- "80:80"
networks:
- my_net
volumes:
web-data: ##共享卷组的名称
networks:
my_net: ##创建网络默认情况下bridge没有dns解析所有节点通过my_net连接
2、查看容器的信息
[root@server2 ~]# docker-compose ps ##查看容器的信息
[root@server2 ~]# docker-compose down ##清除之前环境信息
3、查看网络信息 、查看容器、开启docker-compose
[root@server2 ~]# docker-compose ps ##查看docker镜像信息
[root@server2 ~]# docker volume ls ##查看共享卷组
[root@server2 ~]# docker-compose up -d ##开启doxker-compose
4、查看重启动后网络的桥接情况、
[root@server2 ~]# docker network ls ##查看网络的
[root@server2 ~]# brctl show ##查看网络桥接信息
5、查看系统生成共享卷组的信息
[root@server2 ~]# docker volume inspect compose_web-data
6、进入共享卷组的目录中修改默认的发布文件信息
[root@server2 ~]# cd /var/lib/docker/volumes/compose_web-data/_data
[root@server2 ~]# ls
[root@server2 ~]# rm -fr index.html ##删除系统默认的发布文件
[root@server2 ~]# vim index.html
内容:
www.westos.org
7、测试
(1)、在server2本机上
[root@server2 ~]# curl localhost ##访问本机的地址
(2)、在网页上输入172.25.6.进行访问
(3)查看haproxy监控集群节点的信息
(发现 n1 、n2 的数据都一样 因为两者访问的信息一致)
172.25.6.2/admin/stats
(4)、在本机上查看各个节点的信息
[root@server2 ~]# docker inspect compose_web1_1
[root@server2 ~]# docker inspect compose_web2_1
[root@server2 ~]# docker inspect compose_haproxy_1
(5)、用节点的ip进行测试(效果最明显)
[root@server2 ~]# curl 172.18.0.2
[root@server2 ~]# curl 172.18.0.3
[root@server2 ~]# curl 172.18.0.4