三剑客之Compose
1、compose介绍
应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要认人为开启停止,那么效率太低了。Docker Compose是一种编排服务,基于pyhton语言实现,是一个用于在 Docker 上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。用户可以编辑一个docker-compose.yml文件实现一条指令安装部署多容器的应用,这大大减少了运维人员的重复工作量,解决了容器与容器之间如何管理编排的问题。
Docker Compose 中有两个重要的概念
1、service:一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
2、project:由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义
docker-compose.yml 文件中常用命令 | 含义 |
---|---|
Image | 指定为镜像名称或镜像 ID,如果镜像在本地不存在,Compose 将会尝试拉取这个镜像 |
Build | 指定 Dockerfile 所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像 |
Command | 覆盖容器启动后默认执行的命令 |
Links | 链接到其它服务中的容器 |
Ports | 端口映射 |
Expose | 暴露端口信息 |
Volumes | 卷挂载路径设置 |
2、docker-compose实现
现在准备四台虚拟机,server1(172.25.11.1)、server2(172.25.11.2)、server3(172.25.11.3)、server4(172.25.11.4)都已经安装docker,我们想在server1中编写docker-compose.yml文件,一键部署haporxy+nginx,实现负载均衡。server2做haporxy调度器,server3和server4做真正的nginx服务器后台。
(1)项目整体框架
(2)docker-compose安装
准备安装包docker-compose-Linux-x86_64-1.27.0
[root@server1 ~]# ll
-rwxr-xr-x 1 root root 12215880 Jul 21 21:16 docker-compose-Linux-x86_64-1.27.0
[root@server1 ~]# mv docker-compose-Linux-x86_64-1.27.0 /usr/local/bin/
%因为docker-compose安装包是二进制文件,所以放到/usr/local/bin才能执行
[root@server1 ~]# cd /usr/local/bin/
[root@server1 bin]# ls
docker-compose-Linux-x86_64-1.27.0
[root@server1 bin]# mv docker-compose-Linux-x86_64-1.27.0 docker-compose %改名
[root@server1 bin]# ls
docker-compose
[root@server1 bin]# chmod +x docker-compose %赋予执行权限
(3)编写docker-compose.yml
家目录下创建compose目录,编写docker-compose.yml文件,创建web1和web2子目录,并写入发布内容,以示效果。
docker-compose.yml文件内容如下。配置三个服务,web1,web2和haproxy。web1和web2都是用nginx镜像安装;/root/compose/web1挂载到容器内/usr/share/nginx/html下,/root/compose/web2挂载到容器内/usr/share/nginx/html下;haproxy使用haproxy镜像安装;物理机的80端口映射到容器内的80端口;网络都是统一的webnet。
创建haproxy子目录并编辑修改haproxy.cfg的主配置文件
#
# This is a sample configuration. It illustrates how to separate static objects
# traffic from dynamic traffic, and how to dynamically regulate the server load.
#
# It listens on 192.168.1.10:80, and directs all requests for Host 'img' or
# URIs starting with /img or /css to a dedicated group of servers. URIs
# starting with /admin/stats deliver the stats page.
#
global
maxconn 65535
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0
uid 200
gid 200
%取消chroot
daemon
defaults
mode http
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
retries 2
option redispatch
timeout connect 5s
timeout server 5s
stats uri /admin/stats
# The public 'www' address in the DMZ
frontend public
bind *:80 name clear %监听所有ip的80端口
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
default_backend dynamic
# The static backend backend for 'Host: img', /img and /css.
backend dynamic
balance roundrobin %负载均衡模式是rr论叫
server a web1:80 check inter 1000 %真正的服务器web1,端口80,名字a
server b web2:80 check inter 1000 %真正的服务器web2,端口80,名字b
haproxy镜像导入
(4)创建并后台启动容器
注意,docker-compose命令必须在项目目录下运行,-d参数表示后台运行,成功后docker-compose ps查看状态已开启。
(5)测试
可以看到,web1和web2一人访问一次,实现负载均衡。
也可以图形化界面查看,网页输入172.25.11.1/admin/stats
haproxy还有健康监测功能,也就是说如果web1被down掉了,我们访问172.25.11.1时,就不会接入web1,只会找web2。感兴趣的同学可以自行测试。