Linux下的Docker compose(多容器架构实现负载均衡)

一、基本知识

 

Docker Compose 将所管理的容器分为三层,工程(project),服务(service)以及容器(contaienr)。Docker Compose 运行的目录下的所有文件(docker-compose.yml, extends 文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker Compose 并没有解决负载均衡的问题,因此需要借助其他工具实现服务发现及负载均衡。
Docker Compose 是一个用来创建和运行多容器应用的工具。使用 Compose 首先需要编写Compose 文件来描述多个容器服务以及之间的关联,然后通过命令根据配置启动所有的容器。
Dockerfile 可以定义一个容器,而一个 Compose 的模板文件(YAML 格式)可以定义一个包含多个相互关联容器的应用。Compose 项目使用 python 编写,基于后面的实验中我们将学习的 Docker API 实现。

 

二、实验环境(rhel7.3版本)

1.selinux和firewalld状态为disabled

2.各主机信息如下:

主机ip
server1(安装好docker)172.25.83.1
物理机(用于测试)172.25.83.83/172.25.254.83

3.准备nginx镜像,haproxy镜像

[root@server1 ~]# docker load -i nginx.tar
[root@server1 ~]# docker load -i haproxy.tar
  • docker images

 

三、多容器架构部署

 

1、下载与docker-compose相关的二进制文件:docker-compose-Linux-x86_64-1.22.0,并部署compose

1.将文件docker-compose-Linux-x86_64-1.22.0放入/usr/local/bin目录下,并将名字改为docker-compose,并赋予其可执行的权限。以便能够直接敲击docker-compose命令
[root@server1 ~]# mv docker-compose-Linux-x86_64-1.22.0 /usr/local/bin/docker-compose 
[root@server1 ~]# chmod +x /usr/local/bin/docker-compose   
[root@server1 ~]# ll -d /usr/local/bin/docker-compose 
-rwxr-xr-x 1 root root 11750136 Mar 27 21:47 /usr/local/bin/docker-compose
2.编辑docker-compose.yml文件
[root@server1 ~]# mkdir /tmp/docker/compose -p   #创建目录,便于存放docker-compose.yml文件。该目录的名字随意给
[root@server1 ~]# cd /tmp/docker/compose/
[root@server1 compose]# vim docker-compose.yml
web1:
        image: nginx   
        expose:
                - 80
        volumes:
                - ./web1:/usr/share/nginx/html   #将当前目录下的web1目录,挂载到容器内的/usr/share/nginx/html目录下,便于测试
web2:
        image: nginx
        expose:
                - 80
        volumes:
                - ./web2:/usr/share/nginx/html   #将当前目录下的web2目录,挂载到容器内的/usr/share/nginx/html目录下,便于测试
haproxy:
        image: haproxy:latest
        volumes:
                - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro   #将当前目录下的haproxy目录下的haproxy.cfg文件以只读的方式挂载到容器内的/usr/local/etc/hap[roxy/haproxy.cdf文件下
        links:
                - web1
                - web2
        ports:
                - "80:80"   #端口映射
        expose:
                - "80"

 

2、编写web测试页

[root@server1 compose]# mkdir web1
[root@server1 compose]# mkdir web2
[root@server1 compose]# echo web1 > web1/index.html
[root@server1 compose]# echo web2 > web2/index.html

 

3、负载均衡

[root@server1 compose]# mkdir haproxy
[root@server1 compose]# cd haproxy/
[root@server1 haproxy]# vim 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 web2 web2:80 check   #其中web2会在监控界面上显示

 

4、关闭httpd服务,关闭80端口

[root@server1 ~]# systemctl stop httpd

 

5、开启docker-compose(值的注意的是:执行docker-compose命令时,所在目录下,必须有docker-compose.yml文件)

[root@server1 compose]# docker-compose up -d   #第一次开启服务需要up,再次直接start、stop
Starting compose_web2_1 ... done
Starting compose_web1_1 ... done
Starting compose_haproxy_1 ... done
[root@server1 compose]# docker-compose logs   #查看docker-compose的日志信息
Attaching to compose_haproxy_1, compose_web1_1, compose_web2_1
haproxy_1  | <7>haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds
###补充内容###
[root@server1 compose]# docker-compose stop   #关闭
Stopping compose_haproxy_1 ... done
Stopping compose_web1_1    ... done
Stopping compose_web2_1    ... done
[root@server1 compose]# docker-compose start   #开启
Starting web1    ... done
Starting web2    ... done
Starting haproxy ... done
[root@server1 compose]# docker-compose stop   #关闭,值的注意的是,docker-compose与docker不同。docker rm有-f参数,docker-compose没有-f参数。docker-compose必须先停掉,然后再删除。
Stopping compose_haproxy_1 ... done
Stopping compose_web1_1    ... done
Stopping compose_web2_1    ... done
[root@server1 compose]# docker-compose rm   #删除
Going to remove compose_haproxy_1, compose_web1_1, compose_web2_1
Are you sure? [yN] y
Removing compose_haproxy_1 ... done
Removing compose_web1_1    ... done
Removing compose_web2_1    ... done
[root@server1 compose]# docker-compose up -d   #删除之后,需要重新up
Creating compose_web2_1 ... done
Creating compose_web1_1 ... done
Creating compose_haproxy_1 ... done
  • 查看开启的三个容器

 

6、负载均衡测试

  • 查看80端口

  • 负载均衡

  • 浏览器访问172.25.83.1/status

  • web1停止
[root@server1 compose]# docker stop compose_web1_1
compose_web1_1
[root@server1 compose]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
44580168d73b        haproxy:latest      "/docker-entrypoint.…"   14 minutes ago      Up 10 minutes       0.0.0.0:80->80/tcp   compose_haproxy_1
94e23eb20aa1        nginx               "nginx -g 'daemon of…"   14 minutes ago      Up 10 minutes       80/tcp               compose_web2_1

示图:web1状态stop

  • web1恢复正常
[root@server1 compose]# docker start compose_web1_1
compose_web1_1
[root@server1 compose]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
44580168d73b        haproxy:latest      "/docker-entrypoint.…"   16 minutes ago      Up 12 minutes       0.0.0.0:80->80/tcp   compose_haproxy_1
ca61485ae8c3        nginx               "nginx -g 'daemon of…"   16 minutes ago      Up 1 second         80/tcp               compose_web1_1
94e23eb20aa1        nginx               "nginx -g 'daemon of…"   16 minutes ago      Up 12 minutes       80/tcp               compose_web2_1

示图:web1状态stop

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值