docker-部署Keepalived实现Nginx高可用

本文介绍如何使用Nginx和Keepalived搭建高可用集群。通过部署Nginx服务器提供服务,并利用Keepalived实现实时监控及故障转移,确保业务连续性。文章详细记录了Nginx和Keepalived的安装配置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、服务器环境

二、流程图

三、部署Nginx

1、获取镜像

2、配置文件

3、设计默认页面

4、启动容器

三、部署Keepalived

1、获取镜像

2、查看服务器网关

3、启动容器

四、Nginx状态监听脚本

五、验证服务


        Keepalived是一款基于VRRP协议的高可用集群软件,通过虚拟IP(VIP)对外提供服务,能够实时监控集群中服务器的运行状态并自动进行故障隔离,这些服务器都启动着相同的服务,当主服务器发生故障时,会自动将虚拟IP漂移到备份服务器,从而实现业务高可用。

一、服务器环境

两台服务器:10.100.1.123、10.100.1.125

虚拟IP:10.100.1.155

二、流程图

三、部署Nginx

1、获取镜像

docker pull nginx:1.20.0

2、配置文件

mkdir -p /home/docker/nginx/conf
cd /home/docker/nginx/conf
vi nginx.conf
user  root;
worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /home/nginx-demo/html;
        }
    }
}

3、设计默认页面

mkdir -p /home/docker/nginx/html
cd /home/docker/nginx/html
vi index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>Load One</p>
</body>
</html>

同理,另一台服务器也做上述操作

4、启动容器

docker run -d  \
--name nginx \
-v /home/docker/nginx/html:/usr/share/nginx/html \
-v /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-p 9000:80 \
nginx:1.20.0

三、部署Keepalived

1、获取镜像

docker pull osixia/keepalived:2.0.20

osixia/keepalived DockerHub:Docker Hub

osixia/keepalived GitHub:GitHub - osixia/docker-keepalived: Keepalived container image 🐳🌴

2、查看服务器网关

ifconfig
netstat -rn
cat /etc/sysconfig/network-scripts/ifcfg-eth160

3、启动容器

docker run --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW --net=host -d --name keepalived \
    -v /etc/localtime:/etc/localtime \
    -e KEEPALIVED_INTERFACE='ens160' \
    -e KEEPALIVED_PASSWORD='d0cker' \
    -e KEEPALIVED_STATE='BACKUP' \
    -e KEEPALIVED_ROUTER_ID='51' \
    -e KEEPALIVED_UNICAST_PEERS="#PYTHON2BASH:['10.100.1.123','10.100.1.125']" \
    -e KEEPALIVED_VIRTUAL_IPS='10.100.1.155' \
    osixia/keepalived:2.0.20

四、Nginx状态监听脚本

#!/bin/bash
#检测nginx是否启动了
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ];then    #如果nginx没有启动就启动nginx                        
      docker restart nginx                #重启nginx
	  sleep 5
      if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ];then    #nginx重启失败,则停掉keepalived服务,进行VIP转移
              docker stop keepalived                    
      fi
fi

Nginx状态监听脚本,添加关闭Keepalived的命令,Nginx出现问题时能正常完成主备切换

五、验证服务

访问虚拟IP

 关停 10.100.1.123 服务器的 Keepalived,再次访问

修复 10.100.1.123 服务器的 Keepalived,并一同重启 10.100.1.125 服务器的 Keepalived。

相关学习链接:

keepalived高可用(私网) - 知乎

VRRP协议详解 - 知乎

进入容器的keepalived目录下

/container/service/keepalived/assets

keepalived.conf

global_defs {
  default_interface enp160
}
vrrp_script check_nginx {
  script "/container/service/keepalived/assets/check_nginx.sh" #检测脚本文件
  interval 3           #检测时间间隔
  weight -10           #权重
}
vrrp_instance VI_1 {
  interface enp160     #设置实例绑定的网卡
  state BACKUP         #设置实例初始状态,实际的MASTER和BACKUP是选举决定的
  virtual_router_id 51 #同一实例下virtual_router_id必须相同
  priority 120         #设置优先级,优先级高的会被竞选为Master
  nopreempt            #非抢占模式
  unicast_peer {       #单播模式,设置对端ip
    10.100.1.123
  }
  virtual_ipaddress {  #设置VIP,可以设置多个
    10.100.1.155
  }
  authentication {     #设置认证
    auth_type PASS     #认证方式,支持PASS和AH
    auth_pass d0cker   #认证密码
  }
  track_script {       #设置追踪脚本
    check_nginx
  }
  notify "/container/service/keepalived/assets/notify.sh"
}

### 使用 Docker 部署 KeepalivedNginx 的教程 #### 准备工作 为了确保能够顺利部署,需要先准备好必要的环境。确保已经安装并配置好 Docker 及其相关组件。 #### 创建自定义网络 为了让多个容器之间可以相互通信,建议创建一个自定义的桥接网络: ```bash docker network create mynetwork ``` #### 构建 Keepalived 容器 由于官方并没有提供带有 Keepalived 的镜像,因此可以选择基于 CentOS 或者 Debian 来构建自己的 Keepalived 镜像。下面是一个简单的 `Dockerfile` 文件用于构建 Keepalived 镜像[^1]: ```dockerfile FROM centos:7 RUN yum update -y && \ yum install epel-release -y && \ yum install keepalived -y COPY keepalived.conf /etc/keepalived/ CMD ["keepalived", "-f", "/etc/keepalived/keepalived.conf"] ``` 其中 `keepalived.conf` 是预先准备好的 Keepalived 配置文件,可以根据实际情况调整参数设置。 #### 构建 Nginx 容器 对于 Nginx,则可以直接使用官方提供的最新版本镜像,并编写相应的配置文件来满足需求。同样地,在项目目录下放置一份名为 `nginx.conf` 的配置文件[^2]: ```dockerfile FROM nginx:latest COPY ./html /usr/share/nginx/html COPY nginx.conf /etc/nginx/ ``` 这里的 `./html` 表示静态网页资源路径;而 `nginx.conf` 则是定制化的 Nginx 设置文档。 #### 编写 Compose 文件 为了简化操作流程以及方便管理多容器之间的关系,推荐采用 Docker Compose 工具来进行编排。编辑 `docker-compose.yml` 如下所示[^3]: ```yaml version: '3' services: webserver: image: custom_nginx_image_name networks: - backend ports: - "80:80" lb: build: . container_name: keepalived_container cap_add: - NET_ADMIN depends_on: - webserver networks: - backend networks: backend: external: true name: mynetwork ``` 注意:上述 YAML 中提到的 `custom_nginx_image_name` 应替换为你自己构建完成后的 NGINX 镜像名称;另外还需要指定正确的上下文路径以便于正确读取到本地存储的 Dockerfile 文件。 #### 启动服务 当所有的准备工作都已完成之后,就可以通过如下命令启动整个架构了: ```bash docker-compose up -d ``` 这将会按照顺序依次拉起各个服务实例,并建立它们间的依赖关联。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值