Compose简介
简介
- Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。它是一个定义和运行多容器的docker应用工具。使用compose,你能通过YMAL文件配置你自己的服务,然后通过一个命令,你能使用配置文件创建和运行所有的服务。
- Compose是一个定位“定义和运行多个Docker容器应用的工具”,其前身是Fig,目前使用的Compose仍然兼容Fig格式的模板文件。
- Compose的代码主要使用Python编写,其开源地址为:https://github.com/docker/compose。
- 我们知道在Docker中构建自定义的镜像是通过使用Dockerfile模板文件来实现的,从而可以让用户很方便定义一个单独的应用容器。而Compose使用的模板文件就是一个YAML格式文件,它允许用户通过一个docker-compose.yml来定义一组相关联的应用容器为一个项目(project)。
- 注意:Fig时代支持的配置文件名为fig.yml以及fig.yaml;为了兼容遗留的Fig化配置,目前Compose支持的配置文件类型非常丰富,主要有以下几种:fig.yaml、docker-compose.yml、docker-compose.yaml以及用户指定的配置文件路径。(可通过环境变量COMPOSE_FILE或-f参数自定义配置文件)
-在Compose中有两个重要的概念:
1.服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
2.项目(project):由一组关联的应用容器组成的一个完成业务单元,在docker-compose.yml中定义。
以上可以理解为:
服务(service)就是在它下面可以定义应用需要的一些服务,代表配置文件中的每一项服务。每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等,即以容器为粒度,用户需要Compose所完成的任务。
项目(project)代表用户需要完成的一个项目,即是Compose的一个配置文件可以解析为一个项目,即Compose通过分析指定配置文件,得出配置文件所需完成的所有容器管理与部署操作。
- Compose的默认管理对象时项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
实验环境
主机名(IP) | 服务 |
---|---|
server1(172.25.11.1) | docker,docker-compose |
测试端(172.25.11.250) | 浏览器 |
docker-compose的部署
- docker-compose的下载,有两种方式,下载完成后给他重命名,并把他移至二进制可执行目录下,给他赋予执行权限。
方式一:
curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose #官方推荐,慢
方式二:
https://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/
重命名并授权:
mv docker-compose-Linux-x86_64-1.24.1 /usr/local/bin/
mv /usr/local/bin/docker-compose-Linux-x86_64-1.24.1 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose ps
- 在root家目录下新建目录
compose
,进入目录后编写docker-compose.yml配置文件。
(注意:注意格式,缩进。)
mkdir compose
cd compose/
[root@server1 compose]# 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:latest
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
links:
- web1
- web2
ports:
- "80:80"
expose:
- "80"
- 下载并导入nginx镜像和haproxy镜像。
docker load -i nginx.tar
docker load -i haproxy.tar
- 在刚才新建的compose目录下新建两个目录web1 web2,在其中编写index.html文件。
mkdir web1
mkdir web2
cd web1/
vim index.html
[root@server1 compose]# cat web1/index.html
<h1>web1</h1>
vim /root/compose/web2/index.html
[root@server1 compose]# cat web2/index.html
<h1>web2</h1>
- 编写haproxy负载均衡的配置文件。
[root@server1 compose]# vim haproxy/haproxy.cfg
global #全局设置
log 127.0.0.1 local0 ##日志输出设置,所有日志都记录在本机,通过local0输出
log 127.0.0.1 local1 notice #定义haproxy日志级别[error warringinfo debug]
defaults #默认设置
log global #引用全局的日志配置
mode http #所处理的类别,默认采用http模式,可配置称tcp作4层消息转发
option httplog #启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志的
option dontlognull #启用该项,日志中将不记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统是为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来。
timeout connect 5000ms #haproxy和服务端建立连接的最大时长,其实设置为1秒就足够了。局域网内建立连接一般都是瞬间的
timeout client 50000ms #haproxy和客户端保持空闲连接的超时时长,在高并发下可稍微短一点,可设置为5秒以尽快释放连接
timeout server 50000ms #haproxy和服务端保持空闲连接的超时时长,局域网内建立连接很快,所以尽量设置短一些,特别是并发时如设置为1-3秒
stats uri /status #访问监控界面的uri
frontend balancer #frontend前端设置
bind 0.0.0.0:80 #这里建议使用0.0.0.0:80或*:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。
default_backend web_backends #定义一个web_backends前端部分。此处将对应的请求转发给后端
backend web_backends
balance roundrobin #使用RR负载均衡算法(#banlance roundrobin 轮循,banlance source 保存session值,支持static-rr,leastconn,first,uri等参数) server web1 web1:80 check #其中web1会在监控界面上显示
server server1 web1:80 check #其中web1会在监控界面上显示
server server2 web2:80 check #其中web2会在监控界面上显示
- 开启docker-compose(注意:执行docker-compose命令时,所在目录下,必须有docker-compose.yml文件)
[root@server1 compose]# pwd
/root/compose
[root@server1 compose]# ls
docker-compose.yml haproxy web1 web2
[root@server1 compose]# docker-compose up -d
compose_web2_1 is up-to-date
compose_web1_1 is up-to-date
Creating compose_haproxy_1 ... done
[root@server1 compose]# docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------
compose_haproxy_1 /docker-entrypoint.sh hapr Up 0.0.0.0:80->80/tcp
...
compose_web1_1 nginx -g daemon off; Up 80/tcp
compose_web2_1 nginx -g daemon off; Up 80/tcp
-
测试:浏览器中访问:刷新一次可以看到实现了负载均衡。
-
访问都记录在日志中。
[root@server1 compose]# docker-compose logs
- 停止一个节点web1,浏览器中访问测试,可以看到此时只能访问到web2。
[root@server1 compose]# docker stop compose_web1_1
compose_web1_1
[root@server1 compose]# docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------
compose_haproxy_1 /docker-entrypoint.sh hapr Up 0.0.0.0:80->80/tcp
...
compose_web1_1 nginx -g daemon off; Exit 0
compose_web2_1 nginx -g daemon off; Up 80/tcp
- 再将web1节点开启,继续访问测试:
[root@server1 compose]# docker start compose_web1_1
compose_web1_1
[root@server1 compose]# docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------
compose_haproxy_1 /docker-entrypoint.sh hapr Up 0.0.0.0:80->80/tcp
...
compose_web1_1 nginx -g daemon off; Up 80/tcp
compose_web2_1 nginx -g daemon off; Up 80/tcp